gpt4 book ai didi

python - 预测输入大小与训练输入大小不同的 LSTM 时间序列错误

转载 作者:行者123 更新时间:2023-12-01 06:37:34 25 4
gpt4 key购买 nike

我正在与 Bach chorales dataset 合作。每首赞美诗的长度约为 100-500 个时间步,每个时间步包含 4 个整数(例如:[74, 70, 65, 58]),其中每个整数对应于钢琴上的音符索引。

I am trying to train a model that can predict the next time step(4 notes), given a sequence of time steps from the chorale.

问题是什么:对于模型训练的相同大小的输入,我得到正确的输出,但对于不同大小的输入,我得到错误的输出。

到目前为止我所做的:我使用 Keras 的 TimeseriesGenerator 来生成输入序列和相应的输出:

generator = TimeseriesGenerator(dataX, dataY, length=3, batch_size=1)
print(generator[0])

输出:

(array([[[74, 70, 65, 58],
[74, 70, 65, 58],
[74, 70, 65, 58]]]), array([[75, 70, 58, 55]]))

然后我训练了一个 LSTM 模型。我在 input_shape 中使用了 None 来允许可变大小的输入。

n_features = 4
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(None, n_features), return_sequences=True))
model.add(LSTM(128 , activation = 'relu'))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')

# fit model
model.fit_generator(generator, epochs=500, validation_data=validation_generator)

我预测大小为 3 的输入似乎有效(因为它是由长度为 3 的输入训练的):

# demonstrate prediction
x_input = dataX[5:8]
x_input = x_input.reshape((1, len(x_input), 4))
print(x_input)
yhat = model.predict(x_input, verbose=0)
print(yhat)
print('expected: ', dataY[8])
[[[75 70 58 55]
[75 70 60 55]
[75 70 60 55]]]
[[76.25768 68.525444 59.745518 53.799873]]
expected: [77 69 62 50]

现在我尝试预测不同大小的输入(例如长度 5),但这不起作用。测试样本的输出:

# demonstrate prediction
x_input = dataX[1:6]
x_input = x_input.reshape((1, len(x_input), 4))
print(x_input)
yhat = model.predict(x_input, verbose=0)
print(yhat)
print('expected: ', dataY[6])
[[[74 70 65 58]
[74 70 65 58]
[74 70 65 58]
[75 70 58 55]
[75 70 58 55]]]
[[227.16667 217.89767 213.62988 148.44817]]
expected: [75 70 60 55]

预测完全错误,看起来是在做一些求和。任何关于为什么会发生这种情况以及如何解决它的意见/帮助将受到高度赞赏。

最佳答案

我可以为您提供模型无法学习的三个可能原因。

最后一个致密层

model.add(Dense(n_features))

这可能是您模型中的罪魁祸首(但我建议全部解决)。分类模型的最后一层需要是 Softmax 层。所以只需将其更改为

model.add(Dense(n_features,activation='softmax`))

损失函数

通常,crossentropy 对于分类问题的效果比 mse 更好。所以尝试一下,

model.compile(optimizer='adam', loss='categorical_crossentropy')

LSTM 中的激活

LSTM 使用 tanh 作为激活。除非您有充分的理由将其更改为 relu,否则不要这样做,因为当激活函数发生变化时,LSTM 不会输出与普通前馈层相同的行为。

关于python - 预测输入大小与训练输入大小不同的 LSTM 时间序列错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59601739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com