启用急切执行时,传递给Optimizer.compute_gradients的`loss`应该是一个函数

时间:2019-09-09 16:54:02

标签: python tensorflow

我是TensorFlow的新手,我才开始学习和理解它。 我正在解决neural style transfer问题,并且正在使用tensorflow version 1.14

我遇到错误传递给Optimizer的损失。启用急切执行时,compute_gradients应该是一个函数

我试图通过使用TensorFlow图而不是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**

1 个答案:

答案 0 :(得分:2)

以上错误主要是由于您尝试使用TensorFlow 1.x而系统正在运行Tensor 2.0引起的。

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

  

将tensorflow.compat.v1导入为tf

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

  

tf.disable_v2_behavior()