我有以下特征向量,每个样本包含一个特征,总共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
答案 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,所以在尝试使用批量培训之前,请考虑获取更多数据。希望这会有所帮助。