使用具有 keras 的不同时间步长的递归神经网络



我使用 keras 构建 RNN,但是当我想将时间步长更改为不同的大小时,我收到错误并且无法完成 这是我的虚拟数据示例

from numpy import array
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.preprocessing import MinMaxScaler
from keras import optimizers

X=array(
[
[#first sample
[0,2],[1,2],[2,2]    # three time steps and 2 features
]
,
[# sample 2
[0,2],[1,2],[2,2]    # three time steps and 2 features
]
,
[# sample 3
[7,2], [9,2], [4,2]  # three time steps and 2 features
]
,
[# sample 4
[2,2], [5,2], [4,2],[7,9]  # four steps and 2 features
]
]
)

Y=np.array([1,2,3,4])

model = Sequential()
model.add(LSTM(8, input_shape=(None, 2),return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128,return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(58, activation='softmax'))
optimize=optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
model.compile(optimize,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()
model.fit(X,Y,batch_size=1,epochs=50,shuffle=True,verbose=2)

从代码中看到,我在每个序列中有 4 个序列和 2 个特征。 在最后一个序列中,我有 4 个时间步长而不是 3 个,如果我将其更改为 3 个时间步长,代码可以正常工作,这就是问题, 但我希望它在不同的时间步长上工作,如何在不使用填充或遮罩的情况下实现这一目标。

我确实阅读了描述不同解决方案的不同主题,但我无法在上面的例子中让它工作

当我尝试运行上面的代码时,出现错误

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (4, 1)

您的X不是有效的数组。numpy 数组必须是矩形且不呈锯齿状。Keras 只能接受有效的 numpy 数组作为输入。您有两种选择:

  1. 一次将样本输入模型 1 样本。 即使用batch_size 1,使用fit_on_batchfit_generator,而不仅仅是fit。请注意,这将删除所有与矢量化相关的速度优化,并且如果您有大量数据,则会将您的训练减慢到爬行。
  2. 填充训练集,以便它们都具有相同的时间维度。 0 填充不应真正影响模型的性能。这是推荐的方法。

有关更多详细信息,请参阅此线程。

最新更新