I want to implement a straight through estimator in tensorflow. I am using tf.stop_gradient() method for this. When I implement in the inner layers it works fine but when used on the last layer it throws an error. Below are my code and error.
def generator():
model = Sequential([
Embedding(21, 100, input_shape = (50, )),
Conv1D(100, 3,2, padding = "same", activation = "relu"),
Conv1D(100, 3,2, padding = "same", activation = "relu"),
Conv1D(21, 3,1, padding = "same", activation = "relu"),
Flatten(),
Dense(1,"sigmoid", trainable = False),
Lambda(lambda x: tf.stop_gradient(x)),
])
return model
gen = generator()
def dis_inputs():
ind = np.random.randint(0, len(x_train), batch_size * 2)
real = x_train[ind]
out = np.ones((batch_size * 2, ))
out[: batch_size ] = 0
return real, out
batch_size = 128
x, y = dis_inputs()
gen.compile("adam", "binary_crossentropy")
gen.fit(x, y, epochs = 100)
ValueError: in user code:
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 878, in train_function *
return step_function(self, iterator)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 867, in step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 860, in run_step **
outputs = model.train_step(data)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 816, in train_step
self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
File "/usr/local/lib/python3.7/dist-packages/keras/optimizer_v2/optimizer_v2.py", line 532, in minimize
return self.apply_gradients(grads_and_vars, name=name)
File "/usr/local/lib/python3.7/dist-packages/keras/optimizer_v2/optimizer_v2.py", line 633, in apply_gradients
grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars)
File "/usr/local/lib/python3.7/dist-packages/keras/optimizer_v2/utils.py", line 73, in filter_empty_gradients
raise ValueError(f"No gradients provided for any variable: {variable}. "
ValueError: No gradients provided for any variable: (['embedding_4/embeddings:0', 'conv1d_12/kernel:0', 'conv1d_12/bias:0', 'conv1d_13/kernel:0', 'conv1d_13/bias:0', 'conv1d_14/kernel:0', 'conv1d_14/bias:0'],). Provided `grads_and_vars` is ((None, <tf.Variable 'embedding_4/embeddings:0' shape=(21, 100) dtype=float32>), (None, <tf.Variable 'conv1d_12/kernel:0' shape=(3, 100, 100) dtype=float32>), (None, <tf.Variable 'conv1d_12/bias:0' shape=(100,) dtype=float32>), (None, <tf.Variable 'conv1d_13/kernel:0' shape=(3, 100, 100) dtype=float32>), (None, <tf.Variable 'conv1d_13/bias:0' shape=(100,) dtype=float32>), (None, <tf.Variable 'conv1d_14/kernel:0' shape=(3, 100, 21) dtype=float32>), (None, <tf.Variable 'conv1d_14/bias:0' shape=(21,) dtype=float32>)).