Sense-X / UniFormer

[ICLR2022] official implementation of UniFormer
Apache License 2.0
828 stars 111 forks source link

Test result lower than paper #92

Closed LEM0NTE closed 2 years ago

LEM0NTE commented 2 years ago

哈喽,我使用您的模型(s8*8)以及您提供的K400数据集做了完整的训练(100个epoch),没有使用Imagenet进行预训练。经过测试,发现最好的精度为75.1,这低于您发布的78.4。我看到您在其他issue中回答可能是数据集划分引起的误差,但我不确定这个差距是否是正常的。 此外,关于sthV2数据集,我从mmaction那边查看了相关的准备方法。请问您在使用的时候也是根据mm,使用denseflow进行的抽帧并生成帧文件列表的操作吗? 另外,我注意到您在不同的模型中使用了不同的head_dim = 64/32。请问根据您的经验,这样的设置会有什么样的影响呢?并且我注意到MViT等模型使用的是[96,192,384,768], head_dim = 96这样的设置。这样会提升参数量和Flops,但您并没有沿用这样的设置,请问是精度没有进一步的提升嘛? 最后想问的是,您在K400数据集训练之后,如果需要对K600或者sth等数据集做测试。就加载K400的预训练模型然后在新的数据集上进行训练嘛?请问这种根据新数据集微调的训练大概需要多少个epoch,训练细节有什么需要注意的呢,比如模型有什么需要调整的嘛,还是说根据您提供的yaml文件进行相应的调整就可以了~ 感谢您的工作!

Andy1621 commented 2 years ago
  1. "没有使用Imagenet进行预训练“,这个结果是正常的,release的s8x8使用了ImageNet预训练模型进行微调。
  2. 对于SthV2数据集,当时使用的是其他同事抽帧的数据集,按照30FPS采样,短边裁剪320,结果会比原始分辨率的稍差。你可以按照mmaction的处理,或者直接用decord读取原始的video训练,都是可以的,可以先用我提供的脚本在你处理的数据集上复现训练,对一下结果。
  3. 在相同的embed_dim情况下,不同的head_dim对param和FLOPs没有影响,更小的head_dim或者说更多的head,训练显存开销会更大,精度会略微提升。不同论文的结构基本都是作者自己探索过的,权衡FLOPs设置的结构参数,没有固定的设计标准。在UniFormer里,因为使用的是全局attention,FLOPs较大,所以相对embed_dim会小一些,head_dim采用64是比较常规的设置。
  4. K400训练后,无法直接对其他数据集测试。如果要训K600,需要单独使用相同的参数从头训练。如果要训sth,最好是加在K400预训练的模型,我都提供了相应的yaml和shell脚本。
Andy1621 commented 2 years ago

As there is no more activity, I am closing the issue, don't hesitate to reopen it if necessary.

LEM0NTE commented 2 years ago

您好,我已经按照您的建议成功的处理好了sth模型,并且验证了uniformer_16x3x1_preK400模型的精度,与您公布的结果完全一致。 但是还想再咨询您,对于在K400预训练好的模型,想在sthv2数据集进行微调应该怎么进行呢?是直接使用sthv2的config文件,加载比如"uniformer_s8x8_k400_epoch100.pth"(我自己复现的checkpoint),来继续进行训练嘛。还是说要比如冻结网络的backbone,只让最后的fc层进行训练呢?

Andy1621 commented 2 years ago

按照我提供的config训练即可,在模型代码中指定model_path,并修改yaml文件 https://github.com/Sense-X/UniFormer/blob/c795a50563d4a68c277f04432ff50eab001bb8d2/video_classification/slowfast/models/uniformer.py#L17-L26

训练时不需要冻结网络