如何解决在每个时间步用错误评估训练 RNN
我有一个 simpleRNN/LSTM,我正在尝试使用 tensorflow 对顺序分类任务进行训练。有一系列数据(300 个时间步长)预测 t=300 时的标签。对于我的任务,我希望 RNN 在每个时间步(不仅仅是在最后一个时间点)评估错误并将其向后传播(如下图)。
经过下面的一些回复后,我似乎需要做一些事情:使用 return_sequences 标志;使用 TimeDistributed 层访问来自 LSTM/RNN 的输出;并且还定义了一个自定义的损失函数。
model = Sequential()
layer1 = LSTM(n_neurons,input_shape=(length,1),return_sequences=True)
model.add(layer1)
layer2 = TimeDistributed(Dense(1))
model.add(layer2)
# Define custom loss
def custom_loss(layer1):
# Create a loss function
def loss(y_true,y_pred):
# access layer1 at every time point and compute mean error
# UNCLEAR HOW TO RUN AT EVERY TIME STEP
err = K.mean(layer1(X) - y_true,axis=-1)
return err
# Return a function
return loss
# Compile the model
model.compile(optimizer='adam',loss=custom_loss(layer),metrics=['accuracy'])
现在我对 custom_loss 函数有点困惑,因为我不清楚如何传入 layer1 并计算最内层损失函数中的误差。
有人有什么建议或者可以给我提供更详细的答案吗?
解决方法
这个问题并不容易回答,因为它不清楚您要实现什么(使用 FFNN 或 RNN 不应该是相同的,哪种效果最好取决于应用程序)。>
无论如何,您可能会混淆训练步骤(例如,在小批量序列上的前向和反向传播)与“内部”步骤循环神经网络。在前向传递期间,在任何输出可用之前,单个序列(或单个小批量)将始终“展开”整个时间:只有在(因此,在训练步骤结束时),您可以使用预测并计算损失以进行反向传播。
您可以做的是返回输出序列(每个内部时间步长一个 y_predicted),包括 return_sequences=True
内的参数 SimpleRNN(...)
。这将为您提供 300 个预测的序列,每个预测仅取决于与考虑的内部时间步长相关的过去输入。然后,您可以使用计算损失所需的输出,可能在自定义损失函数中。
我希望我已经足够清楚了。否则,如果我能提供进一步帮助,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。