Python – `loss` passed to Optimizer.compute_gradients should be a function when eager execution is enabled

python, tensorflow

I am new to TensorFlow, I just started learning and understanding it.
I am working on neural style transfer problem and I am using tensorflow version 1.14.

I am getting an error loss passed to Optimizer.compute_gradients should be a function when eager execution is enabled.

I tried to solve the problem by using TensorFlow graph instead of eager execution, but it's not working. I want to use eager execution because it looks like a more pythonic way.

here is my code, sorry for putting whole code here, please suggest corrections in my code.

import scipyimport tensorflow as tfimport tensorflow.contrib.eager as tfeimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Imagefrom scipy import miscfrom skimage.transform import resizefrom tensorflow.keras.applications.vgg19 import VGG19, preprocess_inputfrom tensorflow.keras import backend as Ktf.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.4plt.imshow(generated_img[0])content_img = content_img-MEANSstyle_img = style_img-MEANSmodel = 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 gramdef 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_costdef compute_total_cost(J_content, J_style, alpha=10, beta=40):    J = (alpha*tf.cast(J_content, tf.float64)) + (beta*J_style)    return Jact_generated_img = model.get_layer('block5_conv2').outputact_content_img = model.get_layer('block5_conv2').outputJ_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**

Best Solution

The above error is mainly caused when you are trying to use TensorFlow 1.x but the system is running tensor 2.0.

Initialise the TensorFlow using the code below to ensure you are trying to use the version 1.0

import tensorflow.compat.v1 as tf

You can make the system disable that behaviour by the below command after the initialisers.

tf.disable_v2_behavior()