Керас: Как узнать, у какой операции нет градиента
Я строю сиамскую сеть с Керасом. Вот код:
def get_siamese_model(input_shape):
# Define the tensors for the two input images
left_input = Input(input_shape)
right_input = Input(input_shape)
# RNN which returns a feature vector which I want to discriminate
model = load_model("/path/to/rnn.hdf5")
# Generate the encodings (feature vectors) for the two images
encoded_l = model(left_input)
encoded_r = model(right_input)
# Add a customized layer to compute the absolute difference between the encodings
L1_layer = Lambda(lambda tensors: K.abs(tensors[0] - tensors[1]))
L1_distance = L1_layer([encoded_l, encoded_r])
# Add a dense layer with a sigmoid unit to generate the similarity score
prediction = Dense(1, activation='sigmoid', bias_initializer="zeros", kernel_initializer="random_uniform")(L1_distance)
# Connect the inputs with the outputs
siamese_net = Model(inputs=[left_input, right_input], outputs=prediction)
# return the model
return siamese_net
Кроме того, я передаю данные в сеть с помощью генератора. Если я попробую обучить сеть...
optimizer = Adam(lr=1e-5, decay=1e-6)
model = get_siamese_model([None,2048])
model.compile(loss="binary_crossentropy",optimizer=optimizer)
# Fit!
model.fit_generator(
generator=generator,
steps_per_epoch=steps_per_epoch,
epochs=1000,
verbose=1,
validation_data=val_generator,
validation_steps=40,
workers=4)
У меня следующее исключение:
Traceback (most recent call last):
File "/home/philipp/Gitlab/GI/Siamese/siamese.py", line 73, in <module>
workers=4)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/engine/training.py", line 1732, in fit_generator
initial_epoch=initial_epoch)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/engine/training_generator.py", line 42, in fit_generator
model._make_train_function()
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/engine/training.py", line 316, in _make_train_function
loss=self.total_loss)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/optimizers.py", line 504, in get_updates
grads = self.get_gradients(loss, params)
File "/home/philipp/Gitlab/GI/venv/lib64/python3.7/site-packages/keras/optimizers.py", line 93, in get_gradients
raise ValueError('An operation has `None` for gradient. '
ValueError: An operation 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.
Process finished with exit code 1
Я использую Python 3 и Keras 2.3.1.
У меня мало опыта работы с Keras- есть ли способ узнать, какая операция вызывает градиент "Нет"? Видите ли вы какую-либо ошибку, которая может вызвать это исключение?