【发布时间】:2020-02-03 13:39:02
【问题描述】:
正如(我认为)我在 Keras 中所理解的那样,LSTM 层期望输入数据具有 3 维:(batch_size, timesteps, input_dim)。
但是,当涉及到我的数据时,我真的很难理解这些值实际对应的内容。我希望如果有人能解释我如何将以下模拟数据(与我的实际数据集具有相似结构)输入到 LSTM 层,那么我可能会理解如何使用我的真实数据集实现这一点。
因此,示例数据是使用 one-hot-vector encoding 编码的分类数据序列。例如,前 3 个样本如下所示:
[ [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0] ]
[ [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0] ]
[ [0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1] ]
即序列的长度为 5,有 4 个分类选项可以位于序列中的某个位置。假设我有 3000 个序列。这是一个二元分类问题。
所以我相信这会形成我的数据集(3000, 5, 4) 的形状?
我要使用的模型如下所示:
model = keras.Sequential([
keras.layers.LSTM(units=3, batch_input_shape=(???)),
keras.layers.Dense(128, activation='tanh'),
keras.layers.Dense(64, activation='tanh'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20)
这暂时忽略了任何训练/测试拆分,因此假设我正在使用整个数据集进行训练。我正在努力的部分是input_shape。
我希望序列中的每个元素都是一个时间步长。我尝试了很多不同的形状并得到了很多不同的错误。我猜我实际上需要重塑x_train 而不仅仅是调整input_shape。问题是我不知道它实际上需要什么形状。
我想我理解 LSTM 背后的理论,我只是在努力理解维度要求的实用性。
我们将不胜感激任何帮助或建议。谢谢。
编辑 - 正如@scign 所建议的那样。这是我在使用以下模拟数据集代码时遇到的错误示例:
x_train = [[0, 0, 0, 1], [0, 0, 1, 0], [
1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0]], [[0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
y_train = [1, 0, 1]
model = keras.Sequential([
keras.layers.LSTM(units=3, batch_input_shape=(1, 5, 4)),
keras.layers.Dense(128, activation='tanh'),
keras.layers.Dense(64, activation='tanh'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20)
错误 - ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (5, 4)
【问题讨论】:
-
对于某些示例,
batch_input_shape应为(batch_size, timesteps, data_dim)keras.io/getting-started/sequential-model-guide -
是的,我知道这是一个 2d 数组 @AKSW,我的问题是如何使它成为适合 LSTM 层输入的 3d 数组?但显然不只是任何 3D 数组,它需要在 3 个维度中的每个维度中都具有正确的大小,而这正是我努力解决的问题。
-
嗯,把它包在另一对
[]周围我会说吗?
标签: python machine-learning keras lstm one-hot-encoding