【问题标题】:batch_input_shape tuple on Keras LSTMKeras LSTM 上的 batch_input_shape 元组
【发布时间】:2023-03-30 13:56:01
【问题描述】:

我有以下特征向量,每个样本都有一个特征,总共有 32 个样本:

X = [[0.1], [0.12], [0.3] ... [0.10]]

和一个由二进制值组成的标签向量

Y = [0, 1, 0 , 0, .... 1](也有 32 个样本)

我正在尝试使用 Keras LSTM 根据新条目预测序列的下一个值。 我想不通的是“batch_input_shape”元组的含义,例如:

 model.add(LSTM(neurons, batch_input_shape=(?, ?, ?), return_sequences=False, stateful=True))

根据this的文章,第一个是batch size,那么另外两个呢?它们是每个样本的特征数量和样本数量吗? 在这种情况下,batch_size 的值应该是多少?

目前收到错误信息:

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (32, 1)

编辑:这是模型声明:

def create_lstm(batch_size, n_samples, neurons, dropout):
model = Sequential()
model.add(LSTM(neurons, batch_size=batch_size, input_shape=(n_samples, 1), return_sequences=False, stateful=True))
model.add(Dropout(dropout))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
return model

【问题讨论】:

  • 你能展示你正在定义的整个序列模型吗?
  • @DarkCygnus 我要编辑帖子

标签: python keras lstm rnn


【解决方案1】:

根据this Keras Sequential Model guide on "stateful" LSTM(在最底部),我们可以看到这三个元素的含义:

预期的输入批次形状:(batch_sizetimestepsdata_dim)。 请注意,我们必须提供完整的 batch_input_shape,因为网络是有状态的。 第k批次第i个样本是第k-1批次第i个样本的后续。

您已经发现的第一个是训练期间要使用的批次大小。您应该选择多少部分取决于您的具体问题,但主要由数据集的大小决定。如果您指定批量大小为x,并且您的数据集包含N 样本,则在训练期间,您的数据将分成N/x 组(批次),每个组(批次)大小为x

因此,您可能希望批量大小小于数据集的大小。没有唯一值,但您希望它比您的所有数据成比例地小(比如​​一两个订单)。有些人更喜欢使用 2 的幂(32、128 等)作为批量大小。在某些情况下,也可以完全不使用批次,并一次使用所有数据进行训练(尽管不一定更好)。

另外两个值是 timesteps(时间维度的大小)或每个样本序列具有的“帧”,以及 数据维度(即每个时间步的数据向量的大小)。

例如,假设您的输入序列看起来像X = [[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]]。我们可以看到这个序列的timestep3data_dim2

所以,您得到的ValueError 很可能是由于这个原因(错误甚至暗示它预期 3 个暗淡)。另外,请确保您的数组是 Numpy 数组。

作为最后的评论,鉴于您说您总共有 32 个样本(即您的整个数据集包含 32 个样本),我认为数据太少而不能使用批处理;通常我见过的最小批大小是 32,所以在尝试使用批训练之前,请考虑获取更多数据。希望这会有所帮助。

【讨论】:

  • 非常感谢您的回答。我有一个更大的数据集,但我首先尝试使用一个简单的示例。所以我明白了你所说的,但是由于我收到一个错误,说 API 需要一个 3 维数组,我需要至少 3 个指标(特征)才能使模型工作?
  • 没问题,如果你觉得有用,可以考虑点赞。关于错误,就像我在答案中解释的那样。假设您想使用一批32,并且您的数据看起来像[[1,2],[3,4],[5,6]](因此形状为(3, 2))。然后,你应该有batch_input_shape=(32, 3, 2)。现在清楚了吗?
  • 另外我建议您在使用术语“指标”(通常是我们感兴趣的性能值)时要小心,因为它与“特征”(使您的特征向量为您的示例),它们可能会混淆在一起使用:)
  • 很高兴我能帮助@Ricky :)
  • @DarkCygnus @DarkCygnus 在我的情况下也是一个简单的问题,我的输入形状为 (798,3) 所以我的 batch_input_shape=(1, 1, 3) 其中 1 = 批次数,1 = 时间步长,3 我的维度,但是好像错了
猜你喜欢
  • 2019-05-09
  • 2018-08-28
  • 2023-03-06
  • 2020-03-28
  • 2021-10-25
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多