输入形状 Keras-LSTM 的问题

数据挖掘 喀拉斯 lstm 重塑
2022-02-16 04:54:10

我想使用 Keras LSTM 模型制作预测器。我参观了一系列地方。任务是预测最后的目的地。

我经历了不同的例子,但似乎我无法正确塑造输入。

我被困在如何在我的程序中准备我的数据以将它们提供给 LSTM 模型。这是与我的问题相关的最小代码。

input_csv ='input.csv'
max_features = 6
df = pd.read_csv(input_csv)

df.head()
#Cafe =0.1, Park =0.2, Shop =0.3, Home=0.4, Movie = 0.5, School=0.6

在此处输入图像描述

例如,A 访问了 cafe (0.1) -> park(0.2) -> cafe (0.1) -> park(0.2),最后在学校 (0.6) 结束。期望的任务是根据输入 X (place1,place2,place3,place4) 预测 y (end)。

X = df.iloc[:,1:5].to_numpy() 
X_train = X.reshape(6, 1, 4) # X.reshape(samples, timesteps, features)
X_train.shape
#(6, 1, 4)

y = df.iloc[:,-1].to_numpy()
y.shape
#(6,)
#Building model
model = Sequential()
model.add(LSTM(6, dropout=0.2, recurrent_dropout=0.2, input_shape=(None, 1)))
model.add(Dense(max_features, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Train
model.fit(X_train,y)
pred = model.predict(X_train)
predict_classes = np.argmax(pred,axis=1)

ValueError:检查输入时出错:预期 lstm_4_input 的形状为 (None, 1) 但得到的数组的形状为 (1, 4)

如果有人可以帮助我消除我的困惑或指出一些解释,我将不胜感激。谢谢你。

2个回答

我想提几点:

  • 首先,在这里,我认为您正在准备的输入是我看到疑问的地方。目标是预测结束位置。你准备的输入形状对我来说是个疑问,因为你的 sequence_length 应该是“ 4 ”,如果“ 1 ”,你有一个初始隐藏维度。如果我没记错,那么您的最终份额应该是(batch_size,sequence_length,hiiden_dimension) = (6,4,1)。因为这是 LSTM 一直期望的维度形状。
  • 其次是改变你的损失函数,因为你想从不止一个类中进行预测,如咖啡馆 = 0.1、公园 = 0.2、商店 = 0.3、家庭 = 0.4、电影 = 0.5、学校 = 0.6。在 fit() 函数中将损失函数更改为categorical_crossentropy 。还将 activation='sigmoid' 更改为 activation='softmax'

我认为您必须根据您的用例进行这些更改。请反馈我的答案。

通过修改前面代码中的模型构建部分的最小运行代码:

print('Build model...')
model = Sequential()
#model.add(LSTM(12, input_shape=( X_train.shape[1:])))

model.add(LSTM(6, dropout=0.2, recurrent_dropout=0.2, input_shape=(None, 1)))
model.add(Dense(max_features, activation='softmax'))

# try using different optimizers and different optimizer configs
model.compile(loss='sparse_categorical_crossentropy', #loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])