Keras 训练具有和不具有最终密集层的多对多状态LSTM

Keras 训练具有和不具有最终密集层的多对多状态LSTM,keras,deep-learning,lstm,lstm-stateful,Keras,Deep Learning,Lstm,Lstm Stateful,我试图在Keras中训练一个包含LSTM的回归模型,用于回归目的。 我想在线使用这个模型,据我所知,我需要训练一个有状态的LSTM。 由于模型必须输出一系列值,我希望它计算每个预期输出向量的损失。 然而,我担心我的代码不是这样工作的,如果有人能帮助我理解我做的是否正确或者是否有更好的方法,我将不胜感激 模型的输入是128维向量的序列。训练集中的每个序列都有不同的长度。 每次,模型应输出3个元素的向量 我正在尝试训练和比较两种模型: A) 一个简单的LSTM,有128个输入和3个输出; B) 具有

我试图在Keras中训练一个包含LSTM的回归模型,用于回归目的。 我想在线使用这个模型,据我所知,我需要训练一个有状态的LSTM。 由于模型必须输出一系列值,我希望它计算每个预期输出向量的损失。 然而,我担心我的代码不是这样工作的,如果有人能帮助我理解我做的是否正确或者是否有更好的方法,我将不胜感激

模型的输入是128维向量的序列。训练集中的每个序列都有不同的长度。 每次,模型应输出3个元素的向量

我正在尝试训练和比较两种模型: A) 一个简单的LSTM,有128个输入和3个输出; B) 具有128个输入和100个输出的简单LSTM+具有3个输出的密集层

对于模型A),我编写了以下代码:

# Model
model = Sequential()
model.add(LSTM(3, batch_input_shape=(1, None, 128),  return_sequences=True, activation = "linear", stateful = True))`
model.compile(loss='mean_squared_error', optimizer=Adam())

# Training
for i in range(n_epoch):
    for j in np.random.permutation(n_sequences):
        X = data[j] # j-th sequences
        X = X[np.newaxis, ...] # X has size 1 x NTimes x 128

        Y = dataY[j] # Y has size NTimes x 3

        history = model.fit(X, Y, epochs=1, batch_size=1, verbose=0, shuffle=False)
        model.reset_states()
有了这段代码,模型A)似乎训练得很好,因为输出序列接近训练集上的地面真值序列。 然而,我想知道是否真的通过考虑所有NTIME输出向量来计算损失

对于模型B),由于密集层,我找不到任何方法来获得整个输出序列。因此,我写道:

# Model
model = Sequential()
model.add(LSTM(100, batch_input_shape=(1, None, 128), , stateful = True))
model.add(Dense(3,   activation="linear"))
model.compile(loss='mean_squared_error', optimizer=Adam())

# Training
for i in range(n_epoch):
    for j in np.random.permutation(n_sequences):
        X = data[j]  #j-th sequence
        X = X[np.newaxis, ...] # X has size 1 x NTimes x 128

        Y = dataY[j] # Y has size NTimes x 3

        for h in range(X.shape[1]):
            x = X[0,h,:]
            x = x[np.newaxis, np.newaxis, ...] # h-th vector in j-th sequence
            y = Y[h,:]
            y = y[np.newaxis, ...]
            loss += model.train_on_batch(x,y)
        model.reset_states() #After the end of the sequence
根据此代码,型号B)无法正常训练。在我看来,训练不收敛,损失值周期性地增加和减少 我还尝试将最后一个向量用作Y,并在整个训练序列X上调用fit函数,但没有改进


有什么想法吗?谢谢大家!

如果您希望序列的每一步仍有三个输出,则需要按如下方式对密集层进行时间分布:

model.add(TimeDistributed(Dense(3, activation="linear")))
这会将密集层独立应用于每个时间步


请参见

谢谢!!对于模型A),您是否确认将在序列的每个步骤上计算损失,而不仅仅是在最后一次输出上计算损失?@Developer我不确定,但我会这样假设。