Sense-X/UniFormer

New dataset

LEM0NTE opened this issue · 6 comments

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

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

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

加在预训练模型之后,你需要将原本的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上进行后续的训练呢?

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

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

def inflate_weight(self, weight_2d, time_dim, center=False):
if center:
weight_3d = torch.zeros(*weight_2d.shape)
weight_3d = weight_3d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1)
middle_idx = time_dim // 2
weight_3d[:, :, middle_idx, :, :] = weight_2d
else:
weight_3d = weight_2d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1)
weight_3d = weight_3d / time_dim
return weight_3d

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

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

def inflate_weight(self, weight_2d, time_dim, center=False):
if center:
weight_3d = torch.zeros(*weight_2d.shape)
weight_3d = weight_3d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1)
middle_idx = time_dim // 2
weight_3d[:, :, middle_idx, :, :] = weight_2d
else:
weight_3d = weight_2d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1)
weight_3d = weight_3d / time_dim
return weight_3d

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

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

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