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

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_dimstf.squeeze来简单地添加和删除维度。

以上是关于如何在培训期间更改批量大小?的主要内容,如果未能解决你的问题,请参考以下文章

更改片段时显示 ProgressBar - Android

设置批量大小*和*神经网络的训练迭代次数?

调整片段中 TextView 的文本大小

如何将Word中的嵌入式图片批量更改为非嵌入式?

如何在屏幕方向更改时附加片段?

如何更改片段 Kotlin