keras 如何将LSTM用于表格数据?

krugob8w  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(234)

我正在研究一个用于网络入侵检测的LSTM模型。我的数据集是一个有48个特征和8个标签的表格,每行代表一个网络流量示例,标签指示该示例是良性的(0)还是攻击类型(1-7)。我创建了一个用于流量分类的LSTM模型,如下所示:

model = keras.Sequential()
model.add(keras.layers.Input(shape=(None, 48)))
model.add(keras.layers.LSTM(256, activation='relu', return_sequences=True))
model.add(keras.layers.LSTM(256, activation='relu', return_sequences=True))
model.add(keras.layers.LSTM(128, activation='relu', return_sequences=False))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(80, activation='relu'))
model.add(keras.layers.Dense(8, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['mae', 'accuracy'])

但是,当我尝试拟合模型时,我得到一个错误:

ValueError: Exception encountered when calling layer 'sequential_2' (type Sequential).
    Input 0 of layer "lstm_4" is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 48)

在那之前,我得到警告:

WARNING:tensorflow:Model was constructed with shape (None, None, 48) for input KerasTensor(type_spec=TensorSpec(shape=(None, None, 48), dtype=tf.float32, name='input_3'), name='input_3', description="created by layer 'input_3'"), but it was called on an input with incompatible shape (None, 48).

我想我必须对我的数据的形状做些什么,但我不知 prop 体是什么。非常感谢你的帮助。

dgjrabp2

dgjrabp21#

您提到您的数据有48个要素,每行都是一个时间步长。假设您要构建一个模型,该模型一次仅使用一个时间步长来拟合模型,则网络的输入shape (batch_size, n_timesteps, n_features)将为(None, 1, 48)。(请注意,由于您打算使用LSTM,您可能希望增加n_timesteps,这可以通过在数据上开窗来实现)
假设你的输入表是一个(n_rows, 48)形状的数组--我可以从警告消息中看出这一点,你需要重新整形你的数据,如果你的数据是一个numpy数组x,那么你可以用np.expand_dims来重新整形你的数据:

x_reshaped = np.expand_dims(x, axis=1)

np.expand_dims with axis=1将向位置1处的数据添加一个轴,因此生成的数据形状将从(n_rows, 48)变为(n_rows, 1, 48)。然后,您可以调用model.fit(x_reshaped, y)而不会出现任何错误。

相关问题