haihuangcode / CMG

The official implementation of Achieving Cross Modal Generalization with Multimodal Unified Representation (NeurIPS '23)
160 stars 2 forks source link

三种模态的特征序列长度都不同,怎么修改Cross_VQEmbeddingEMA_AVT模块 #10

Open yhd-123 opened 1 month ago

yhd-123 commented 1 month ago

如果audio_feat,video_feat,text_feat的特征序列长度都不同,AVT_VQVAE_Encoder中的self.Cross_quantizer = Cross_VQEmbeddingEMA_AVT(n_embeddings, self.hidden_dim)传播会出错。

v_ph = torch.reshape(v_ph, ((B, T, M))) # [BxT, M] -> [B, T, M] RuntimeError: shape '[16, 99, 400]' is invalid for input of size 236800

Cross_VQEmbeddingEMA_AVT部分怎么修改代码,我想直接用audio_feat,video_feat,text_feat通过AVT_VQVAE_Encoder获取量化后语义对齐的特征表示audio_vq,video_vq,text_vq,进行下游任务。

haihuangcode commented 1 month ago

音频和视频一般都是对齐的吧?文本的话我在代码里是用lstm强行给他序列化到与其他模态一致的长度。

如果你想要利用长度不同的模态进行模型的预训练,有2种选择:1、将所有模态长度对齐,不过这样可能导致语义不一致的内容强制对齐从而效果不好,具体看怎么做了。2、将所有模态的序列长度都压缩为1,平均或者卷积之类的都行,然后对比学习用InfoNCE或者其他方式,不使用需要序列的CPC。

如果你不是需要重新预训练,而是想直接通过feat得到vq,直接调用AVT_VQVAE_Encoder类中的Audio_VQ_Encoder、Video_VQ_Encoder、Text_VQ_Encoder这几个函数就行。

如果回答对你有帮助,可以帮忙点个star。

yhd-123 commented 1 month ago

因为音频特征是用VGGISH提取的,视频特征是用I3D提取的,所以导致相同的视频提取的音频特征和视频特征的序列长度不一致。那将所有模态的序列长度都压缩为1,平均或者卷积之类的都行,然后对比学习用InfoNCE或者其他方式,不使用需要序列的CPC,语义对齐效果是不是差不多

haihuangcode commented 1 month ago

因为音频特征是用VGGISH提取的,视频特征是用I3D提取的,所以导致相同的视频提取的音频特征和视频特征的序列长度不一致。那将所有模态的序列长度都压缩为1,平均或者卷积之类的都行,然后对比学习用InfoNCE或者其他方式,不使用需要序列的CPC,语义对齐效果是不是差不多

我之前有试过直接把模态序列平均后的结果用InfoNCE对齐,印象里是有接近CPC的水平的,不过你这边换了提取特征的方式我就没法保证了。

yhd-123 commented 1 month ago

好的,明白了,谢谢!