Керас: Как узнать, какая операция имеет «Нет» для градиента - PullRequest
0 голосов
/ 24 января 2020

Я строю сиамскую сеть с Keras. Вот код:

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 - есть ли способ узнать, какая операция вызывает градиент «Нет»? Вы видите ошибку, которая может вызвать это исключение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...