为 LSTM 准备 Pandas DataFrame

Preparing Pandas DataFrame for LSTM


我正在尝试使用 Keras 拟合 LSTM 分类器,但不了解如何准备训练数据。

我目前有两个训练数据数据框。 X_train 包含来自 IMU 数据的 48 个手工制作的时间特征,y_train 包含代表地形的相应标签(4 种)。这些数据框的形状如下:

X_train = X_train.values.reshape(X_train.shape[0],X_train.shape[1],1)
print(X_train.shape, y_train.shape)
**(268320, 48, 1) (268320,)**

模型使用 batch_size = (32,5,48):

def def_model():
    model = Sequential()
    model.add(LSTM(units=144,batch_size=(32, 5, 48),return_sequences=True))
    model.add(Dropout(0.5)) 
    model.add(Dense(144, activation='relu'))
    model.add(Dropout(0.5))         
    model.add(Dense(4, activation='softmax'))          
    model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['categorical_accuracy'])        
    return model

model_LSTM = def_model()

LSTM_history = model_LSTM.fit(X_train, y_train, epochs=15, validation_data=(X_valid, y_valid), verbose=1)

我遇到的错误:
ValueError: Shapes (32, 1) and (32, 48, 4) are incompatible

对如何修复这个特定错误有任何见解,对 Keras 的预期有任何直觉吗?

您的批量大小中的 5 是多少? LSTM 层中的 batch_size 参数表示您的数据应采用 (batch_size, time_steps, feature_per_time_step) 形式。如果我理解正确,你的 data has time_steps = 1feature_per_time_step = 48.

这是工作代码的示例以及每个代码的形状。

def def_model():
    model = Sequential()
    model.add(LSTM(units=144,batch_size=(32, 1, 48),return_sequences=True))
    model.add(Dropout(0.5)) 
    model.add(Dense(144, activation='relu'))
    model.add(Dropout(0.5))         
    model.add(Dense(4, activation='softmax'))          
    model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['categorical_accuracy'])        
    return model

model_LSTM = def_model()

X_train = np.random.random((10000,1,48))
y_train = np.random.random((10000,4))
y_train = y_train.reshape(-1,1,4)

data = tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(32)
model_LSTM.fit(data, epochs=15, verbose=1)

在拟合函数中传递 data 而不是 x_trainy_train 将正确拟合模型。

如果你想在你的数据中有 5 个时间步长,你将必须以这样的方式创建你的 X_train 以使其具有 (n_samples,5,48).

的形状