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
дифференцируемо.