When I try to define a layer by myself and use the add_weight() function to declare the trainable return propagation variable,Threw an error:
ValueError: Variable <tf.Variable ‘eqn1_1/constant1:0’ shape=(1,) dtype=float32> has
None
for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
My code is as follows:
class WbceLoss(KL.Layer):
def __init__(self, **kwargs): super(WbceLoss, self).__init__(**kwargs) def build(self, input_shape): self.constant1 = self.add_weight(name = "constant1", shape=[1], initializer='random_normal', trainable=True) self.constant2 = self.add_weight(name = "constant2", shape=[1], initializer='random_normal', trainable=True) def call(self, inputs, **kwargs): tf.compat.v1.disable_eager_execution() out1, out2, out3, cur_time, cur_x_input, cur_y_input, cur_z_input, perm_input = inputs x_input = cur_x_input y_input = cur_y_input z_input = cur_z_input perm_input = perm_input constant1 = self.constant1 constant2 = self.constant2 print(constant1) print(constant2) gradient_with_time = tf.keras.backend.gradients(out1, cur_time)[0] constant1 = tf.convert_to_tensor(constant1) constant2 = tf.convert_to_tensor(constant2) a = tf.zeros((1,), dtype=tf.float32) bias = tf.convert_to_tensor([a, a, constant1]) #bias = tf.expand_dims([0., 0., constant1], 0) bias = tf.expand_dims(bias, 2) pressure_grad_x = tf.keras.backend.gradients(out2, cur_x_input)[0] pressure_grad_y = tf.keras.backend.gradients(out2, cur_y_input)[0] pressure_grad_z = tf.keras.backend.gradients(out2, cur_z_input)[0] pressure_grad = tf.convert_to_tensor([pressure_grad_x, pressure_grad_y, pressure_grad_z]) pressure_grad = tf.keras.backend.permute_dimensions( pressure_grad, (1, 0, 2)) coeff = (1 - out1) / constant2 m = tf.matmul(perm_input, (pressure_grad - bias)) m_grad_x = tf.keras.backend.gradients(m, cur_x_input)[0] m_grad_y = tf.keras.backend.gradients(m, cur_y_input)[0] m_grad_z = tf.keras.backend.gradients(m, cur_z_input)[0] m_grad_1 = tf.add(m_grad_x, m_grad_y) m_grad = tf.add(m_grad_1, m_grad_z) m_final = tf.multiply(coeff, m_grad) eqn_1 = tf.add(gradient_with_time, m_final) eqn_2 = tf.add(eqn_1, out3) eqn = tf.negative(eqn_2) eqn = tf.compat.v1.to_float(eqn) self.add_loss(eqn, inputs=True) self.add_metric(eqn, aggregation="mean", name="eqn1") return eqn
The whole error when I train the model is as follows:
ValueError Traceback (most recent call last)
in ()
12 batch_size=241,
13 shuffle=True,
—> 14 verbose=1)~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_v1.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
794 max_queue_size=max_queue_size,
795 workers=workers,
→ 796 use_multiprocessing=use_multiprocessing)
797
798 def evaluate(self,~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_arrays_v1.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, **kwargs)
655 validation_steps=validation_steps,
656 validation_freq=validation_freq,
→ 657 steps_name=‘steps_per_epoch’)
658
659 def evaluate(self,~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_arrays_v1.py in model_iteration(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)
175 # function we recompile the metrics based on the updated
176 # sample_weight_mode value.
→ 177 f = _make_execution_function(model, mode)
178
179 # Prepare validation data. Hold references to the iterator and the input list~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_arrays_v1.py in _make_execution_function(model, mode)
545 if model._distribution_strategy:
546 return distributed_training_utils_v1._make_execution_function(model, mode)
→ 547 return model._make_execution_function(mode)
548
549~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_v1.py in _make_execution_function(self, mode)
2077 def _make_execution_function(self, mode):
2078 if mode == ModeKeys.TRAIN:
→ 2079 self._make_train_function()
2080 return self.train_function
2081 if mode == ModeKeys.TEST:~\AppData\Roaming\Python\Python36\site-packages\keras\engine\training_v1.py in _make_train_function(self)
2009 # Training updates
2010 updates = self.optimizer.get_updates(
→ 2011 params=self._collected_trainable_weights, loss=self.total_loss)
2012 # Unconditional updates
2013 updates += self.get_updates_for(None)~\AppData\Roaming\Python\Python36\site-packages\keras\optimizer_v2\optimizer_v2.py in get_updates(self, loss, params)
757
758 def get_updates(self, loss, params):
→ 759 grads = self.get_gradients(loss, params)
760 grads_and_vars = list(zip(grads, params))
761 self._assert_valid_dtypes([~\AppData\Roaming\Python\Python36\site-packages\keras\optimizer_v2\optimizer_v2.py in get_gradients(self, loss, params)
753 "gradient defined (i.e. are differentiable). "
754 "Common ops without gradient: "
→ 755 “K.argmax, K.round, K.eval.”.format(param))
756 return grads
757ValueError: Variable <tf.Variable ‘eqn1_1/constant1:0’ shape=(1,) dtype=float32> has
None
for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
Hope someone can help me!!!