1
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.model_selection import cross_val_score
def build_model():

  model2=Sequential()
  model2.add(LSTM(8,batch_input_shape=(12,12,1),stateful=True))
  model2.add(Dense(8))
  model2.add(Dense(8))
  model2.add(Dense(1))
  model2.compile(loss='mse',optimizer='adam')
  return model2
model=KerasRegressor(build_fn=build_model, epochs=50, batch_size=12, verbose=0)
kfold = KFold(n_splits=5, random_state=np.random.seed(7))
score=cross_val_score(model,ts_x,ts_y,cv=kfold,scoring='neg_mean_squared_error')

ts_x.shape 是 (228,12,1) ts_y.shape 是 (228,1,1) 正如我们在这里看到的,我现在有 228 个样本,但是当我运行它时: ValueError: In a stateful network, you should only pass inputs with a number of samples that can be divided by the batch size. Found: 183 samples. 我想知道为什么它创建了 183 个样本228 个样本?

4

1 回答 1

0

错误是什么意思:
你提供的batch_size是12,就是12每次训练过程都要记录。现在,您的总记录是228,不是 的倍数12,因此最后一批没有足够的记录来训练。
然而,这不是问题所在。您还使用 5 折交叉验证。这意味着您的数据集分为 5 个部分,其中 1 个部分保持不变作为验证集,而模型在其他 4 个部分上进行训练。这些部分的长度为228/5 = 45.6228*4/5 = 182.4 (~ 183)
因此,发生的模型训练实际上183是一次记录在案的,这又不是12.

潜在的解决方案:
您可以尝试将 设置batch_size为 183 (1,3,61,183) 的因子,这不会给您太多合理的选择。
因此,您可以尝试将您的值更改n_splits为接近的值(例如 6),这样它228 * (n_splits - 1)/n_splits的因子就接近 10(如果n_splits610是可能batch_size的 s 之一)

除此之外,很抱歉我没有使用 tensorflow 的经验,因为我使用了 pytorch,即使最后一批不是完整的批次,pytorch 也不会显示错误。不过,您可以查看 tensorflow 的文档和他们自己的 q/a 论坛以获得另一个答案。

我希望这可以解决您的问题,或者至少可以引导您朝着正确的方向寻求解决方案。

于 2021-05-14T04:02:15.907 回答