Sense-X / UniFormer

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

New dataset #97

Closed LEM0NTE closed 2 years ago

LEM0NTE commented 2 years ago

您好, 我在尝试迁移到新的数据集(例如UCF101)进行测试训练时遇到了问题。我已经查阅了issue#56, issue#17但仍未能解决。 实际上, 我根据issue56中提到的创建数据集方法已经成功的创建并进行了加载。但是在加载k400上预训练权重进行训练时,显示 image

我的确是复制了kinetics.py并将所有的kinetics都改为了ucf101-->ucf101.py。并且在train.yaml中修改MODEL.NUM_CLASSES = 101 但优化器似乎仍然保持了kinetics class = 400。我不知道应当在哪里修改这个值,希望能得到您的帮助。

Andy1621 commented 2 years ago

加在预训练模型之后,你需要将原本的linear层权重删除。你可以将模型打印一下,看看model的linear层输出是多少类。 修改MODEL.NUM_CLASSES 的时候,注意run.shell有无对应修改,run.shell的优先级更高会进行覆盖。

LEM0NTE commented 2 years ago

加在预训练模型之后,你需要将原本的linear层权重删除。你可以将模型打印一下,看看model的linear层输出是多少类。 修改MODEL.NUM_CLASSES 的时候,注意run.shell有无对应修改,run.shell的优先级更高会进行覆盖。

感谢您的回答。是我粗心搞错了.pth文件,原来的.pth文件保存了优化器的状态,所以提示了以上的错误。现在已经解决了。 但是想再向您请教在Imagenet上预训练的问题。比如我使用的是Uniformer的video任务,那我应该如何在Imagenet上做classify的预训练呢。是需要把模型代码中【B,C,T,H,W】都删掉T这个维度嘛。另外,比如训练后得到了一个uniformer_pre_Imagenet1K.pth的文件,我该如何使用它来在K400上进行后续的训练呢?

Andy1621 commented 2 years ago

一般没有Video预训练模型,在ImageNet上做分类这种问题设置,不过最近ICLR上有工作”SELF-SUPERVISED VIDEO PRETRAINING YIELDS STRONG IMAGE REPRESENTATIONS“,该工作指出video预训练模型可以在很多图像任务上效果较好。回到你原本的问题,如果非要做图像任务的话,需要对输入图片进行padding。

而先在ImageNet预训练,再在K400上微调,是比较常规的设置,我提供的代码便是如此操作。首先在模型初始化时,需要将一些2D卷积拓展为3D卷积,然后再权重加在时将ImageNet预训练权重进行展开,这个在代码中已经提供。

https://github.com/Sense-X/UniFormer/blob/c795a50563d4a68c277f04432ff50eab001bb8d2/video_classification/slowfast/models/uniformer.py#L387-L396

LEM0NTE commented 2 years ago

一般没有Video预训练模型,在ImageNet上做分类这种问题设置,不过最近ICLR上有工作”SELF-SUPERVISED VIDEO PRETRAINING YIELDS STRONG IMAGE REPRESENTATIONS“,该工作指出video预训练模型可以在很多图像任务上效果较好。回到你原本的问题,如果非要做图像任务的话,需要对输入图片进行padding。

而先在ImageNet预训练,再在K400上微调,是比较常规的设置,我提供的代码便是如此操作。首先在模型初始化时,需要将一些2D卷积拓展为3D卷积,然后再权重加在时将ImageNet预训练权重进行展开,这个在代码中已经提供。

https://github.com/Sense-X/UniFormer/blob/c795a50563d4a68c277f04432ff50eab001bb8d2/video_classification/slowfast/models/uniformer.py#L387-L396

首先十分感谢您的答复,是我的提问造成了歧义。我确实是想在Imagenet上进行预训练,然后迁移到K400进行微调。但是我目前遇到的困难是,我不知道该怎样让模型在Imagenet上进行训练。举例来讲,假如我只copy了uniformer的video_classification仓库,并且准备好了Imagenet数据集,接下来我要怎样进行操作呢~(比如模型需要进行怎样的修改之类的)

Andy1621 commented 2 years ago

图像预训练可以参考image_classification仓库,readme有比较详细的步骤可以参考一下

LEM0NTE commented 2 years ago

感谢您的耐心解答,我先去按照您的文档尝试,并关闭现在这个问题