如何在训练期间更改批量大小?

How to change the batch size during training?

在训练期间,在每个时期,我想更改批量大小(用于 experimental 目的)。 创建自定义 Callback 似乎是合适的,但 batch_size 不是 Model class.

的成员

我看到的唯一方法是覆盖 fit_loop 并在每个循环中将 batch_size 公开给回调。有没有更干净或更快速的方式来做到这一点而不使用回调?

我认为最好使用自定义数据生成器来控制您传递给训练循环的数据,这样您就可以生成不同大小的批次,即时处理数据等。这是一个概要:

def data_gen(data):
  while True: # generator yields forever
    # process data into batch, it could be any size
    # it's your responsibility to construct a batch
    yield x,y # here x and y are a single batch

现在您可以使用 model.fit_generator(data_gen(data), steps_per_epoch=100) 进行训练,每个时期将产生 100 个批次。如果您想将其封装在 class.

中,也可以使用 Sequence

对于来到这里的其他人,我发现在 Keras 中调整批量大小的最简单方法就是多次调用 fit(使用不同的批量大小):

model.fit(X_train, y_train, batch_size=32, epochs=20)

# ...continue training with a larger batch size
model.fit(X_train, y_train, batch_size=512, epochs=10) 

对于大多数用途,接受的答案是最好的,不要更改批量大小。在 99% 的情况下,出现这个问题时可能有更好的方法。

对于那些确实有例外情况的 1% 人来说,更改批量大小 mid-network 是合适的,有一个 git 讨论很好地解决了这个问题:

https://github.com/keras-team/keras/issues/4807

总结一下:Keras 不希望您更改批量大小,因此您需要作弊并添加一个维度并告诉 keras 它正在使用 batch_size 1。例如,您的批量10 张 cifar10 图片的大小为 [10, 32, 32, 3],现在变为 [1, 10, 32, 32, 3]。您需要在整个网络中适当地重塑它。使用 tf.expand_dimstf.squeeze 简单地添加和删除维度。