Keras LSTM上的batch_input_shape元组

And*_*ger 4 python lstm keras rnn

我有以下特征向量,每个样本包含一个特征,总共有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))
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,第一个是批量大小,但另外两个呢?它们是每个样品的特征数量和样品数量吗?在这种情况下,batch_size的值应该是多少?

目前收到错误消息:

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

编辑:这是模型声明:

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
Run Code Online (Sandbox Code Playgroud)

Dar*_*nus 6

上的"状态" LSTM Keras序列模式指南(最底部),我们可以看到这三个要素是指:

预期的输入批量形状:(batch_size,timesteps,data_dim).请注意,我们必须提供完整的batch_input_shape,因为网络是有状态的.批次k中的索引i的样本是批次k-1中的样本i的后续.

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

因此,您可能希望批量大小小于数据集的大小.没有唯一值,但您希望它比所有数据按比例缩小(比如一个或两个订单).有些人喜欢使用2(32,128等)的功率作为批量大小.在某些情况下,也可能根本不使用批次,并立即训练所有数据(尽管不一定更好).

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

例如,假设你的输入序列是这样的X = [[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]].我们可以看到这个序列的时间步长是,3data_dim2.

所以,ValueError你得到的很可能是由于这个(错误甚至暗示它预计3个暗淡).此外,请确保您的阵列是Numpy阵列.

作为最后一条评论,假设您说您总共有32个样本(即您的整个数据集包含32个样本),我认为数据太少而无法使用批次; 通常我看到的最小批量是32,所以在尝试使用批量培训之前,请考虑获取更多数据.希望这可以帮助.

  • 没问题,如果您觉得有用,请考虑点赞。关于错误,就像我在答案中解释的那样。假设您想使用一批“32”,并且您的数据看起来像“[[1,2],[3,4],[5,6]]”(因此形状为“(3, 2)”)。然后,你应该有`batch_input_shape=(32, 3, 2)`。现在清楚了吗? (2认同)