在每个时间步用错误评估训练 RNN

时间:2021-04-19 16:10:25

标签: tensorflow recurrent-neural-network prediction backpropagation

我有一个 simpleRNN/LSTM,我正在尝试使用 tensorflow 对顺序分类任务进行训练。有一系列数据(300 个时间步长)预测 t=300 时的标签。对于我的任务,我希望 RNN 在每个时间步(不仅仅是在最后一个时间点)评估错误并将其向后传播(如下图)。

enter image description here

经过下面的一些回复后,我似乎需要做一些事情:使用 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 并计算最内层损失函数中的误差。

有人有什么建议或者可以给我提供更详细的答案吗?

1 个答案:

答案 0 :(得分:1)

这个问题并不容易回答,因为它不清楚您要实现什么(使用 FFNN 或 RNN 不应该是相同的,哪种效果最好取决于应用程序)。

无论如何,您可能会混淆训练步骤(例如,在小批量序列上的前向和反向传播)与“内部”步骤循环神经网络。在前向传递期间,在任何输出可用之前,单个序列(或单个小批量)将始终“展开”整个时间:只有在(因此,在训练步骤结束时),您可以使用预测并计算损失以进行反向传播。

您可以做的是返回输出序列(每个内部时间步长一个 y_predicted),包括 return_sequences=True 内的参数 SimpleRNN(...)。这将为您提供 300 个预测的序列,每个预测仅取决于与考虑的内部时间步长相关的过去输入。然后,您可以使用计算损失所需的输出,可能在自定义损失函数中。

我希望我已经足够清楚了。否则,如果我能提供进一步帮助,请告诉我。