如何创建自定义损失函数,将RNN的中间训练输出(张量y_pred)馈送到另一个预定义的RNN?

时间:2019-09-08 08:08:55

标签: tensorflow keras

我希望创建一个自定义损失函数,该函数不直接使用RNN(y_pred)的中间输出,而是将y_pred作为另一个RNN的输入(例如已经定义和训练的RNN2) ,并将这些预测值用作损失函数的参数。

我尝试从model.compile函数调用我的自定义损失函数,这会产生错误。是因为我无法将张量数据类型的对象提供给RNN2吗?我以为y_pred具有训练的中间输出是错误的吗? 同样,使用sess的y_pred的简单打印命令也会引发错误! 即

sess=tf.Session()
print(sess.eval(y_pred))

这个问题对y_pred至关重要吗?

无论如何,这是代码:


def custom_loss(y_true, y_pred):
        predicted=rnn2.predict(y_pred)
        return K.mean(K.abs( predicted-y_true), axis=-1)

input_tensor = Input(shape=(1,1))
hidden = LSTM(100, activation='softmax',return_sequences=False)(input_tensor)
out = Dense(1, activation='softmax')(hidden)
model = Model(input_tensor, out)
model.compile(loss=custom_loss, optimizer='adam')

错误

You must feed a value for placeholder tensor 'input_19' with dtype float and shape [?,1,1]
     [[{{node input_19}}]]

1 个答案:

答案 0 :(得分:0)

这可能是您致电model.compile时要执行的操作。您是否尝试过将它作为新图层传递给(RNN2)。

RNN2.trainable = False #  [1]
model = Sequential()
model.add(RNN1)
model.add(RNN2)

def custom_loss(y_true, y_pred):
        # predicted=rnn2.predict(y_pred)
        return K.mean(K.abs( y_pred-y_true), axis=-1)

编辑

  

您能否详细说明如何在RNN1中将模型(RNN2)用作图层?

如果是我,我会这样。

from keras import models, layers


inp = layers.Input((None, 1))
x = layers.LSTM(512, return_sequences=True)(inp)
x = layers.LSTM(256)(x)
x = layers.Dense(32, name='rnn2_output')(x)
rnn2 = models.Model(inp, x)
rnn2.trainable = False #  [2]

inp2 = layers.Input((None, 32))
x = layers.LSTM(256, return_sequences=True)(inp2)
x = layers.Dense(1)(x)
x = rnn2(x)
rnn1 = models.Model(inp2, x)
rnn1.summary()

请注意,最近添加的代码[2]和旧代码[1](最近编辑)都具有trainable = False,这意味着该模型完全不会受到训练。假设您将RNN2.predict放在损失函数中。如果您也想训练它,那么请删除这些行。