Keras LSTM上的batch_input_shape元组

时间:2017-10-27 20:04:29

标签: python keras lstm 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))

根据this文章,第一个是批量大小,但另外两个呢?它们是每个样品的特征数量和样品数量吗? 在这种情况下,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

1 个答案:

答案 0 :(得分:5)

根据关于“有状态”LSTM的this Keras顺序模型指南(在最底部),我们可以看到这三个元素的含义:

  

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

您已经发现的第一个是在训练期间使用的批量大小。您应该选择多少部分取决于您的具体问题,但主要取决于数据集的大小。如果您指定批量大小为" ".join(re.sub(r'\b(?!xbox360|ps4)\w*\d\w*'," ",string1).split()) 且数据集包含x个样本,则在培训期间,您的数据将分为N组(批次),每个组N/x

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

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

例如,假设您的输入序列看起来像x。我们可以看到此序列的X = [[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]]时间步长3 data_dim

所以,你得到的2很可能是由于这个(错误甚至暗示它预计会有3个暗淡)。另外,请确保您的阵列是Numpy数组。

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