Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

batch_size / accum_batch_size #55

Closed
foralliance opened this issue May 10, 2018 · 11 comments
Closed

batch_size / accum_batch_size #55

foralliance opened this issue May 10, 2018 · 11 comments

Comments

@foralliance
Copy link

foralliance commented May 10, 2018

@sfzhang15 HI
比如说在执行ResNet101_COCO_320.py时,因为硬件的限制,只能将batch_size设置为4,但是accum_batch_size=32,相应的iter_size=8.
换句话说,不论batch_size为多少,因为iter_size的存在,accum_batch_size始终能保持32.所以说,不论batch_size是多少,始终是在处理32张图片后,才执行一次梯度下降。

那能否这样认为:

  1. 只要accum_batch_size不变,batch_size无论大小多少,都不会改变模型的训练效果,改变的只是模型训练的快慢.
  2. BN层的使用,需要配合一定数量的batch_size.这里的batch_size指的是'batch_size(4)'还是'accum_batch_size(32)'?
@sfzhang15
Copy link
Owner

@foralliance

  1. 不是的,因为BN层开了,所以每张卡每次前传的数量,会影响BN层,详见2
  2. BN层只在一张卡上的一次前传中进行统计,所以是4,即BN信息只在4张图上统计,统计的可能就会不稳定,影响效果。

@foralliance
Copy link
Author

foralliance commented May 10, 2018

@sfzhang15

所以,batch_size的大小还是会影响训练效果的.之所以会影响,主要是因为batch_size过小时,对BN层造成影响

@sfzhang15
Copy link
Owner

@foralliance
是的,有BN层且打开了的,每张卡每次前传的图片数量太少了,会导致BN层不稳定

@foralliance
Copy link
Author

foralliance commented May 10, 2018

@sfzhang15

那如果网络模型中没有BN层,或者说BN层没开,是不是可以理解成我前面说的:batch_size无论大小多少,都不会改变模型的训练效果,改变的只是模型训练的快慢.

@sfzhang15
Copy link
Owner

@foralliance
按照我自己对多卡以及itersize的理解,我觉得应该是的,不过也不一定对,你可以固定随机种子验证一下

@foralliance
Copy link
Author

@sfzhang15
many many thanks

@foralliance
Copy link
Author

@sfzhang15

还有一个点麻烦你,如果BN层配置如下:

layer {
bottom: "res5c_branch2b"
top: "res5c_branch2b"
name: "bn5c_branch2b"
type: "BatchNorm"
batch_norm_param {
use_global_stats: true
}
param {
lr_mult: 0.0
decay_mult: 0.0
}
param {
lr_mult: 0.0
decay_mult: 0.0
}
param {
lr_mult: 0.0
decay_mult: 0.0
}
}

是不是就是BN层没打开,相当于BN层的参数固定.

在RefineDet中,BN层设置如下:

layer {
  name: "bn_conv1"
  type: "BatchNorm"
  bottom: "conv1"
  top: "conv1"
}

所以,BN层打开,参数要学习

@sfzhang15
Copy link
Owner

sfzhang15 commented May 10, 2018

@foralliance
是的

@foralliance
Copy link
Author

@sfzhang15
thanks for your reply

@ujsyehao
Copy link

@foralliance
按照我自己对多卡以及itersize的理解,我觉得应该是的,不过也不一定对,你可以固定随机种子验证一下

我使用squeezenet分类网络测试过,分别设置了64x8/128x4/256x2一共3组实验,最终训练结果几乎一样,至于模型训练快慢看不出来明显差异。

@sfzhang15 打扰下,再问一个问题,如果我使用了在imagenet上训练的分类网络(此网络包含BN层),我使用这个分类网络作为目标检测网络的body网络时,在训练检测网络的过程中,对于body网络的BN层我是使用原来的BN参数在它的基础上学习,还是弃用原来BN参数,重新学习BN参数呢?

@sfzhang15
Copy link
Owner

@ujsyehao
如果你每张卡的图片数量足够多(至少5张),你可以弃用原来的BN统计结果,重新统计BN的结果。否则,你只能使用ImageNet上的BN统计结果。此外,应该不存在“在原来的BN参数基础上学习”这种操作,应该只有弃用或重新统计。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants