`损失??`优化程序计算应为启用急执行时的函数

2024-04-19 02:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我是TensorFlow的新手,我刚刚开始学习和理解它。 我正在研究neural style transfer问题,我正在使用tensorflowversion 1.14。在

我收到一个错误优化程序计算当启用急执行时应该是一个函数。在

我试图用张量流图代替eager execution来解决这个问题,但它不起作用。我想使用eager execution,因为它看起来更像是一种Python式的方式。在

这是我的代码,抱歉把整个代码放在这里,请在我的代码中建议更正。在

import scipy
import tensorflow as tf
import tensorflow.contrib.eager as tfe
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from scipy import misc
from skimage.transform import resize
from tensorflow.keras.applications.vgg19 import VGG19, preprocess_input
from tensorflow.keras import backend as K

tf.enable_eager_execution()
print('Eager execution {}'.format(tf.executing_eagerly()))

content_path = '800px-Green_Sea_Turtle_grazing_seagrass.jpg'
style_path = '800px-The_Great_Wave_off_Kanagawa.jpg'

content_img = plt.imread(content_path)
plt.imshow(content_img)
style_img = plt.imread(style_path)
plt.imshow(style_img)

MEANS = np.array([123.68, 116.779, 103.939]).reshape((1,1,1,3))
content_img = resize(content_img, (552,800,3)) #resized content img because style img has shape (552,800,3)

content_img = np.array(content_img)
content_img = np.reshape(content_img, ((1,)+content_img.shape))
style_img = np.array(style_img)
style_img = np.reshape(style_img, ((1,)+style_img.shape))

noise_img= np.random.uniform(-20,20,(1,552,800,3)).astype('float32')
generated_img = noise_img*0.6 + content_img*0.4
plt.imshow(generated_img[0])

content_img = content_img-MEANS
style_img = style_img-MEANS

model = VGG19(include_top=False, weights='imagenet')

def compute_content_cost(act_content_img, act_generated_img):
    return tf.reduce_mean(tf.square(act_content_img-act_generated_img))

def gram_matrix(A):
    gram = tf.matmul(A, tf.transpose(A))
    return gram

def style_loss_one_layer(act_style_img, act_generated_img):
    m,n_H,n_W,n_C = tf.shape(act_generated_img)               #act_generated_img.get_shape().as_list()
    gram_act_style_img = gram_matrix(act_style_img)
    gram_generated_img = gram_matrix(act_generated_img)
    return tf.reduce_mean(tf.square(gram_act_style_img-gram_generated_img))*(1/(4*n_C**2*(n_H*n_W)**2))

content_layer = ['block5_conv2']
style_layers = [('block1_conv1',0.2), 
                ('block2_conv1',0.2),
                ('block3_conv1',0.2),
                ('block4_conv1',0.2),
                ('block5_conv1',0.2)]

def compute_style_cost(model, style_layers):
    style_cost = total_style_cost = 0
    for layer, coeff in style_layers:
        act_style_img = model.get_layer(layer).output
        act_generated_img = model.get_layer(layer).output
        style_cost += style_loss_one_layer(act_style_img, act_generated_img)
        total_style_cost += coeff*style_cost 
    return total_style_cost

def compute_total_cost(J_content, J_style, alpha=10, beta=40):
    J = (alpha*tf.cast(J_content, tf.float64)) + (beta*J_style)
    return J

act_generated_img = model.get_layer('block5_conv2').output
act_content_img = model.get_layer('block5_conv2').output

J_content = compute_content_cost(act_content_img=act_content_img, act_generated_img=act_generated_img)
print(J_content)
J_style = compute_style_cost(model, style_layers=style_layers)
print(J_style)

J_total_cost = compute_total_cost(J_content, J_style, alpha=10, beta=40)
print(J_total_cost)

optimizer = tf.train.AdamOptimizer(2.0)

train_step = optimizer.minimize(J_total_cost)        #**getting error here**

Tags: importlayerimgmodelstyletfasnp
1条回答
网友
1楼 · 发布于 2024-04-19 02:19:05

上述错误主要是在您尝试使用TensorFlow1.x但系统运行的是Tensor2.0时导致的。在

使用下面的代码初始化TensorFlow,以确保您正在尝试使用版本1.0

import tensorflow.compat.v1 as tf

您可以在初始化器之后通过下面的命令使系统禁用该行为。在

tf.disable_v2_behavior()

相关问题 更多 >