Keras LSTM 中的 batch_input_shape 元组

9
我有一个特征向量,每个样本都只有一个特征,总共有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))

根据这篇文章,第一个是批量大小,那么其他两个呢?它们是每个样本的特征数和样本数吗? 在这种情况下,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

你能展示一下你正在定义的完整Sequential模型吗? - DarkCygnus
@DarkCygnus 我要编辑这篇帖子。 - André Heringer
1个回答

14
根据此处Keras Sequential Model指南中的“stateful”LSTM(在底部),我们可以看到这三个元素的含义:
预期输入批量形状:(batch_size,timesteps,data_dim)。请注意,由于网络是有状态的,因此我们必须提供完整的batch_input_shape。索引i的样本在批次k中是样本i-1的后续。
第一个元素就像你已经发现的那样,是用于训练时使用的批处理大小。您应该选择多少取决于您的具体问题,但主要取决于数据集的大小。如果您指定批处理大小为x,并且您的数据集包含N个样本,则在训练期间,数据将被分成大小为xN/x组(批次)。
因此,您可能希望批处理大小小于您的数据集大小。没有唯一的值,但您希望它与所有数据成比例地更小(例如,一两个数量级)。有些人喜欢使用2的幂(32、128等)作为他们的批处理大小。在某些情况下,也有可能不使用批处理,并一次性训练所有数据(尽管不一定更好)。
另外两个值是“时间步”(您的时间维度大小)或每个样本序列具有的“帧”数量,以及“数据维度”(即每个时间步上您的数据向量的大小)。
例如,假设您的输入序列如下:X = [[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]]。我们可以看到,此序列的时间步3数据维度2
因此,您收到的ValueError很可能是由于此原因(错误甚至提示它期望3维)。此外,请确保您的数组是Numpy数组。
最后一条评论是,考虑到您说您总共有32个样本(即您的整个数据集包含32个样本),我认为使用批处理太少了;通常我见过的最小批处理大小是32,因此请在尝试使用批处理训练之前获取更多数据。希望这有所帮助。

非常感谢您的回答。我有一个更大的数据集,但我首先尝试使用一个简单的例子。所以我明白了您的意思,但由于我得到了一个错误,说API需要一个三维数组,那么我需要至少3个指标(特征)才能使模型工作? - André Heringer
2
没问题,如果您觉得有用,请考虑点赞。关于错误,就像我在答案中解释的那样。假设您想使用批量32,并且您的数据看起来像[[1,2],[3,4],[5,6]](因此形状为(3,2))。然后,您应该有batch_input_shape=(32,3,2)。现在清楚了吗? - DarkCygnus
1
我建议您在使用术语“度量标准”(通常是我们感兴趣的性能值)时要小心,因为它与“特征”(构成样本特征向量的元素)不同,两者一起使用可能会让人困惑 :) - DarkCygnus
很高兴能帮助你,@Ricky :) - DarkCygnus
@DarkCygnus 也有一个快速问题,就我而言,我的输入形状为(798,3),所以我的 batch_input_shape=(1, 1, 3),其中1=批次数,1=时间步长,3是我的维度,但它似乎是错误的。 - Ricky
@Ricky 和 Andre 情况一样,如果你的形状是 (798,3)(798 个 3D 数据向量的时间步长),那么假设批量大小为 32,则应该设置 batch_input_shape=(32, 798, 3) - DarkCygnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接