如何在培训期间更改批量大小?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在培训期间更改批量大小?相关的知识,希望对你有一定的参考价值。
在训练期间,在每个时代,我想改变批量大小(为experimental目的)。创建自定义Callback
似乎是合适的,但batch_size
不是Model
类的成员。
我看到的唯一方法是覆盖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批次。如果要将其封装在类中,也可以使用Sequence。
对于那些降落在这里的人,我发现在Keras中进行批量大小调整的最简单方法就是多次调用拟合(使用不同的批量大小):
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%的人来说,在网络中改变批量大小是合适的,有一个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
来简单地添加和删除维度。
以上是关于如何在培训期间更改批量大小?的主要内容,如果未能解决你的问题,请参考以下文章