slwang9353 / MobileFormer

MobileFormer in torch
66 stars 13 forks source link

Code issue #3

Open qdd1234 opened 3 years ago

qdd1234 commented 3 years ago

Hi, thanks for your reproduction. I find a small bug in your code. The small bug is shown in the picture. BatchNorm1d will raise an error when the batchsize of input is 1. When testing the model, the batchsize is set1, It will raise an error that BatchNorm1d requires input batchsize>1. I hope you can solve this small bug, Thanks! image

slwang9353 commented 3 years ago

您说中文的话我就中文回复了哈,因为我英文太一般了。 您说的test是训练之后inference一个样本进去,还是测试一下可用性的test? 按理说inference时,也就是mode是eval的时候,BN1d和2d是一样的用历史平均累计的mean和var做norm,应该不会抛出您描述的error; 如果是仅测试一下,也就是mode是train的时候,只有一个样本train进来的话,BN也确实没法做mean和var呀,这个应该是torch源码的限制,也就是只要使用BN,train的batch_size就必须>1了。 基于上面的描述,如果您是在第一种情况的话,您是不是忘了model.eval()?如果是第二种情况的话,按理来说只要是用了BN,应该是源码的限制不允许batch_size=1的。在使用BN的情况下train的batch_size=1这个问题我确实没想到应该如何解决。 如果上面说的没能解决您的问题的话,是不是我理解错了您的意思?或者您有什么修改建议吗?

qdd1234 commented 3 years ago

您说中文的话我就中文回复了哈,因为我英文太一般了。 您说的test是训练之后inference一个样本进去,还是测试一下可用性的test? 按理说inference时,也就是mode是eval的时候,BN1d和2d是一样的用历史平均累计的mean和var做norm,应该不会抛出您描述的error; 如果是仅测试一下,也就是mode是train的时候,只有一个样本train进来的话,BN也确实没法做mean和var呀,这个应该是torch源码的限制,也就是只要使用BN,train的batch_size就必须>1了。 基于上面的描述,如果您是在第一种情况的话,您是不是忘了model.eval()?如果是第二种情况的话,按理来说只要是用了BN,应该是源码的限制不允许batch_size=1的。在使用BN的情况下train的batch_size=1这个问题我确实没想到应该如何解决。 如果上面说的没能解决您的问题的话,是不是我理解错了您的意思?或者您有什么修改建议吗?

我确实是在训练状态下进行代码的调试,因为我想将Mobileformer应用到目标检测中。换成model.eval()后没有出现这个问题,但我想这个BatchNorm1d是不是可以不用加上,因为我看有些复现DyRelu的时候没有这个BatchNorm1d, 因为的确如果调试的话出现这个错误很让人苦恼,其实不是模型代码问题,而是torch的BatchNorm1d本身的要求,您看看这个BatchNorm1d是不是可以不用?

slwang9353 commented 3 years ago

您说中文的话我就中文回复了哈,因为我英文太一般了。 您说的test是训练之后inference一个样本进去,还是测试一下可用性的test? 按理说inference时,也就是mode是eval的时候,BN1d和2d是一样的用历史平均累计的mean和var做norm,应该不会抛出您描述的error; 如果是仅测试一下,也就是mode是train的时候,只有一个样本train进来的话,BN也确实没法做mean和var呀,这个应该是torch源码的限制,也就是只要使用BN,train的batch_size就必须>1了。 基于上面的描述,如果您是在第一种情况的话,您是不是忘了model.eval()?如果是第二种情况的话,按理来说只要是用了BN,应该是源码的限制不允许batch_size=1的。在使用BN的情况下train的batch_size=1这个问题我确实没想到应该如何解决。 如果上面说的没能解决您的问题的话,是不是我理解错了您的意思?或者您有什么修改建议吗?

我确实是在训练状态下进行代码的调试,因为我想将Mobileformer应用到目标检测中。换成model.eval()后没有出现这个问题,但我想这个BatchNorm1d是不是可以不用加上,因为我看有些复现DyRelu的时候没有这个BatchNorm1d, 因为的确如果调试的话出现这个错误很让人苦恼,其实不是模型代码问题,而是torch的BatchNorm1d本身的要求,您看看这个BatchNorm1d是不是可以不用?

如果一定要在train mode用batch_size=1的话,我觉得您可以替换成LN,替换成LN的话可能需要您自己写一个LN的layer。因为这个MLP层我的想法是固定:[Linear-Dropout-Ac] x N + [Linear-Dropout] + Norm这样的结构,这个BN是MLP层的post norm,直接去掉的话可能不利于收敛。我是以norm是一层保险,用了总比没用好的想法放在DynamicReLU里的,所以去掉也可以,但我的建议是换成LN。或者直接把DynamicReLU 层换成其他的DyReLU复现也可以,因为我觉得我对DyReLU的理解还不够到位,这种理解下的实现可能会有问题。 (顺便说一下我对DyReLU的理解,是我不太理解...DyReLU看起来太玄了...看起来确实是把全局信息放进来控制,应该会work,但是具体为什么work我还没理解。)