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

我有在多层感知器架构上工作的数据看起来像这样


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 还是需要更改架构配置?太感谢了。


富国沪深
浏览 203回答 2
2回答

桃花长相依

LSTM(与感知器不同)不是前馈网络。它需要历史来预测下一点。因此,LSTM 的适当输入张量应该具有形状(timesteps, num_features),这意味着每个样本都是一系列timesteps观察结果,使得细胞状态在序列的第一次观察中启动并贯穿整个序列。因此,输入张量应具有以下形状(num_sequences, seq_length, num_features):num_sequences:样本数,即你需要多少个序列来训练模型?seq_length: 这些序列有多长。对于可变长度序列,您可以提供None.num_features: 在给定的序列中有多少个特征有一个单一的观察?

翻过高山走不出你

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 友好的数组
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python