我正在研究一个用于网络入侵检测的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 体是什么。非常感谢你的帮助。
1条答案
按热度按时间dgjrabp21#
您提到您的数据有48个要素,每行都是一个时间步长。假设您要构建一个模型,该模型一次仅使用一个时间步长来拟合模型,则网络的输入shape
(batch_size, n_timesteps, n_features)
将为(None, 1, 48)
。(请注意,由于您打算使用LSTM,您可能希望增加n_timesteps,这可以通过在数据上开窗来实现)假设你的输入表是一个
(n_rows, 48)
形状的数组--我可以从警告消息中看出这一点,你需要重新整形你的数据,如果你的数据是一个numpy数组x
,那么你可以用np.expand_dims
来重新整形你的数据:np.expand_dims
withaxis=1
将向位置1处的数据添加一个轴,因此生成的数据形状将从(n_rows, 48)
变为(n_rows, 1, 48)
。然后,您可以调用model.fit(x_reshaped, y)
而不会出现任何错误。