如何在训练期间更改批量大小?
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_dims
和 tf.squeeze
简单地添加和删除维度。
在训练期间,在每个时期,我想更改批量大小(用于 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.
对于来到这里的其他人,我发现在 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_dims
和 tf.squeeze
简单地添加和删除维度。