我的数据显示,多层感知器架构的工作如下所示
X_train_feature.shape
(52594, 16)
X_train_feature[0]
array([1.18867208e-03, 1.00000000e+00, 8.90000000e+01, 8.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00])
y_train
(52594, 2)
y_train[0].toarray()
array([[0., 1.]])
按第一维度:样本数 第二个:对于 X_train 来说是特征的数量,对于 y_train 来说是 one-hot 编码器。
我想在 LSTM/Bi-LSTM 上使用相同的数据,因此我从互联网复制代码并将输入值更改为与 MLP 相同
def define_model():
model = Sequential()
model.add(LSTM(20, input_shape=X_train_feature[0].shape, return_sequences=True))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # compile
print('Total params: ', model.count_params())
return model
但是当我尝试创建模型时,将附加有关输入形状的错误
model = define_model()
ValueError: Input 0 is incompatible with layer lstm_30: expected ndim=3, found ndim=2
我应该如何调整我的数据以应用于 LSTM 或者我需要更改架构配置?非常感谢。
最佳答案
LSTM(与感知器不同)不是前馈网络。它需要历史来预测下一点。因此,LSTM 的正确输入张量应为 (timesteps, num_features)
形状,这意味着每个样本都是一系列 timesteps
观察值,以便细胞状态在序列的第一次观察并遍历整个序列。
因此,输入张量的形状应为(num_sequences, seq_length, num_features)
,其中:
num_sequences
:样本数量,即需要多少个序列来训练模型?seq_length
:这些序列的长度。对于可变长度序列,您可以提供None
。num_features
:给定序列中有多少个特征具有单个观察结果?
关于python - 如何将 MLP 的数据调整为 LSTM(预期 ndim=3,发现 ndim=2 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60053537/