为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 MLP 的数据调整为 LSTM(预期 ndim=3,发现 ndim=2 错误)

如何将 MLP 的数据调整为 LSTM(预期 ndim=3,发现 ndim=2 错误)

富国沪深 2022-07-19 15:46:04
我有在多层感知器架构上工作的数据看起来像这样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 还是需要更改架构配置?太感谢了。
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

LSTM(与感知器不同)不是前馈网络。它需要历史来预测下一点。因此,LSTM 的适当输入张量应该具有形状(timesteps, num_features),这意味着每个样本都是一系列timesteps观察结果,使得细胞状态在序列的第一次观察中启动并贯穿整个序列。

因此,输入张量应具有以下形状(num_sequences, seq_length, num_features)

  • num_sequences:样本数,即你需要多少个序列来训练模型?

  • seq_length: 这些序列有多长。对于可变长度序列,您可以提供None.

  • num_features: 在给定的序列中有多少个特征有一个单一的观察?


查看完整回答
反对 回复 2022-07-19
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

LSTM 层的输入是一个 3d 张量,形状为 (data_length, timesteps, n_features)


为此,您首先必须使用以下方式转换数据:


   def slice_data(self, data, n_steps, n_ahead=1):

        X_data = data.drop(['y'], axis=1)

        y_data = data['y']

        X = []

        y = []

        for i in range(len(X_data)):

            end_point = i + n_steps

            if end_point + n_ahead > len(X_data)-1:

                break

            slice_x, slice_y = X_data[i:end_point], y_data.loc[end_point]

            X.append(slice_x)

            y.append(slice_y)

        X, y = np.array(X), np.array(y)

        self.n_features = X.shape[2]

        X = X.reshape((X.shape[0], X.shape[1], X.shape[2]))

        return X, y

或者您可以使用我自己制作的工具:EasyLSTM EasyLSTM 只需一行代码即可将您的输入数组塑造成对 LSTM 友好的数组


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信