首页 > 解决方案 > 在 Keras 中设置 LSTM 和 CuDNNLSTM 的参数

问题描述

我开始学习 Keras,对 LSTM 感到有些困惑。我不知道输入参数是什么,例如括号 (n) 和input_shape.

我的数据集是数字的,它有 30 列,29 个是特征,1 个是输出(1 和 0)。

DataFrame shape (23991, 30)
x_train shape (19192, 29)
y_train shape (19192,)
x_test shape (4799, 29)
y_test shape (4799,)

基于此,参数在我的图层中应该如何显示?

第一的:

model = Sequential()
model.add(LSTM((?), input_shape = ?, return_sequences = ?, activation = ?))
model.add(Dropout(0.01))
model.add(Dense(1, activation='sigmoid')) 

第二:

model = Sequential()
model.add(LSTM((?), input_shape = ?, return_sequences = ?, activation = ?))
model.add(LSTM((?), input_shape = ?, return_sequences = ?, activation = ?))
model.add(Dropout(0.01))
model.add(Dense(1, activation='sigmoid')) 

例如,如果我使用这些参数是否相同CuDNNLSTM

标签: pythonkerasneural-network

解决方案


x_train shape (19192, 29)
y_train shape (19192,)
x_test shape (4799, 29)
y_test shape (4799,)

如果您有 pandas 数据框,请将它们转换为 numpy 数组。

x_train = x_train.to_numpy()
y_train = y_train.to_numpy()

x_test = x_test.to_numpy()
y_test = y_test.to_numpy()

首先,您需要重塑数据。

x_train = x_train.reshape(19192, 29, 1)
y_train = y_train.reshape(19192,1)
x_test = x_test.reshape(4799, 29, 1)
y_test = y_test.reshape(4799,1)

现在,通常对于 LSTM 维度是:

0 - Samples. One sequence is one sample. A batch is comprised of one or more samples.
1 - Time Steps. One time step is one point of observation in the sample.
2 - Features. One feature is one observation at a time step.

所以,第三个 1 我们添加了一个维度来对应特征。

LSTM 输入形状将是 (29,1) (29 = 时间步长,1 = 每个时间序列的特征数(也为简单起见,您可以将其视为 CNN 中的通道数)

model = Sequential()
model.add(LSTM(units = 10, input_shape = (29,1), return_sequences = False)) # keep other parameters default if you're not sure
model.add(Dropout(0.01))
model.add(Dense(1, activation='sigmoid')) 

请注意,我们为第一层添加了 return_srquence = True,但对于第二个 LSTM 层我们没有。原因是 LSTM 需要 3D 数据(批次、时间、特征)但 Dense 需要 2D 数据(批次、特征),当我们看到 return_sequences = True 时,我们将 3D 数据发送到 Dense 的下一层,我们改为发送 2D 数据。

model = Sequential()
model.add(LSTM(units = 10, input_shape = (29,1), return_sequences = True))
model.add(LSTM(units = 10, return_sequences = False))
model.add(Dropout(0.01))
model.add(Dense(1, activation='sigmoid')) 

推荐阅读