Keras У операции есть None для градиента, когда train_on_batch - PullRequest
0 голосов
/ 20 мая 2018

Google Colab для воспроизведения ошибки None_for_gradient.ipynb

Мне нужна пользовательская функция потерь, где значение рассчитывается в соответствии с входными данными модели, эти входные данные не являются значениями по умолчанию (y_true, y_pred).Метод прогнозирования работает для сгенерированной архитектуры, но когда я пытаюсь использовать train_on_batch, появляется следующая ошибка:

ValueError: Операция имеет None для градиента.Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми).Обычные операции без градиента: K.argmax, K.round, K.eval.

Моя пользовательская функция потерь (ниже) была основана на этом примере image_ocr.py # L475 , в ссылке Colab есть еще один пример, основанный на этом решении Пользовательская функция потерь y_true y_pred несоответствие формы # 4781 , она также генерирует ту же ошибку:

from keras import backend as K
from keras import losses
import keras
from keras.models import TimeDistributed, Dense, Dropout, LSTM

def my_loss(args):
    input_y, input_y_pred, y_pred = args
    return keras.losses.binary_crossentropy(input_y, input_y_pred)

def generator2():
    input_noise = keras.Input(name='input_noise', shape=(40, 38), dtype='float32')
    input_y = keras.Input(name='input_y', shape=(1,), dtype='float32')
    input_y_pred = keras.Input(name='input_y_pred', shape=(1,), dtype='float32')
    lstm1 = LSTM(256, return_sequences=True)(input_noise)
    drop = Dropout(0.2)(lstm1)
    lstm2 = LSTM(256, return_sequences=True)(drop)
    y_pred = TimeDistributed(Dense(38, activation='softmax'))(lstm2)

    loss_out = keras.layers.Lambda(my_loss, output_shape=(1,), name='my_loss')([input_y, input_y_pred, y_pred])

    model = keras.models.Model(inputs=[input_noise, input_y, input_y_pred], outputs=[y_pred, loss_out])
    model.compile(loss={'my_loss': lambda y_true, y_pred: y_pred}, optimizer='adam')

    return model

g2 = generator2()
noise = np.random.uniform(0,1,size=[10,40,38])
g2.train_on_batch([noise, np.ones(10), np.zeros(10)], noise)

Мне нужна помощь, чтобы проверить, какаяоперация генерирует эту ошибку, потому что, насколько я знаю, keras.losses.binary_crossentropy дифференцируемо.

1 Ответ

0 голосов
/ 25 декабря 2018

Я думаю, что причина в том, что input_y и input_y_pred - все кераты Input, ваша функция потерь рассчитывается с этими двумя тензорами, они не связаны с параметрами модели, поэтому функция потерь не дает градиента вашей модели

...