Keras当train_on_batch时,梯度的操作为无

时间:2018-05-20 12:10:41

标签: python tensorflow keras deep-learning artificial-intelligence

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链接中有另一个基于此解决方案的示例Custom loss function y_true y_pred shape mismatch #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 :(得分:0)

我认为原因是input_y和input_y_pred都是keras输入,您的损失函数是使用这两个张量计算的,它们没有与模型参数绑定,因此损失函数不会给您的模型带来梯度