我希望创建一个自定义损失函数,该函数不直接使用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}}]]
答案 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
放在损失函数中。如果您也想训练它,那么请删除这些行。