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

Recurrent neural network using different time steps with 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 个样品。 IE。使用 1 的 batch_size,使用 fit_on_batchfit_generator 而不仅仅是 fit。请注意,这将删除所有与矢量化相关的速度优化,并且如果您有大量数据,将使您的训练速度变得缓慢。
  2. 填充你的训练集,使它们都具有相同的时间维度。 0 填充不应该真正影响模型的性能。这是推荐的方法。

有关详细信息,请参阅 this 话题。