jinhong-ni / DEQFusion

PyTorch Implementation of Deep Equilibrium Multimodal Fusion
11 stars 2 forks source link

最终平衡特征输入到分类层发生了错误 #3

Open Jinzeyuu opened 3 months ago

Jinzeyuu commented 3 months ago
    fused_features, jacobian_loss, trace = self.deq_fusion(x_visual, x_audio)
    # print('fused_features', fused_features.shape)

    fused_features = fused_features[-1]#获取列表的最后一位特征
    fused_features=fused_features.mean([-1])#在时间维度上的平均池化表示
    print('fused_features1', fused_features.shape)
    x1 = self.classifier_1(fused_features)

您好,这是我的特征融合部分,我想将最终的平衡特征用于分类。经过您的指导,目前的fused_features能够不断的迭代产生最终的平衡特征。但是目前发生了如下的错误,我没有找到解决办法,您有什么好的建议吗。

x torch.Size([16, 128, 15]) injection_feature torch.Size([16,128, 15]) x torch.Size([16, 128, 15]) injection_feature torch.Size([16,128, 15]) x torch.Size([16, 128, 15]) injection_feature torch.Size([16,128, 15]) 11 x torch.Size([16, 128, 15]) injection_feature torch.Size([16,128, 15]) x torch.Size([16, 128, 15]) injection_feature torch.Size([16,128, 15]) fused_features1 torch.Size([16, 128]) x1 torch.Size([16, 8])

process finished with code -1073741819(0xc0000005)

Jinzeyuu commented 3 months ago

作者您好!经我这段时间的修改,这个问题重复出现,希望得到您的帮助。在我得到了经过DEQ融合后的特征和雅正比损失,我之前的损失定义为交叉熵损失,这样会报以上相同错误,定义为交叉熵损失+雅正比损失也会报错。单独定义为雅正比损失不会报错,但最终的效果极差且每到第4个epoch将会报显存不足,我想大概是损失函数的原因导致无法充分训练。

jinhong-ni commented 3 months ago

应该你算crossentropy的部分有问题,上面这个log我也没法看出来是啥问题。建议再检查下出logits的部分

Jinzeyuu commented 3 months ago

应该你算crossentropy的部分有问题,上面这个log我也没法看出来是啥问题。建议再检查下出logits的部分

可是我的交叉熵损失没有改动,并且之前我没有加DEQ融合网络,使用的交叉注意力机制是能完美运行的。

jinhong-ni commented 3 months ago

非常抱歉,从现有的信息来看我也没办法定位具体问题是什么。 一些debug建议:看看具体报错,是不是算loss部分的维度对不上。如果是的话,看看加上DEQ fusion后logits输出维度和没加能work的版本的维度有区别吗,分别是什么。

Jinzeyuu commented 3 months ago

非常抱歉,从现有的信息来看我也没办法定位具体问题是什么。 一些debug建议:看看具体报错,是不是算loss部分的维度对不上。如果是的话,看看加上DEQ fusion后logits输出维度和没加能work的版本的维度有区别吗,分别是什么。

加DEQ后或交叉注意力机制后的形状均为(16,8)。我的网络很奇怪,他没有报错,只是程序每次到loss.backward前向传播时就会出现process finished with code -1073741819(0xc0000005)

jinhong-ni commented 3 months ago

这个就不是很清楚了,看样子我猜测可能是一些系统的问题。建议重新装一下环境再试试,如果还不行我也不太明白咋解决了,不好意思

Jinzeyuu commented 3 months ago

这个就不是很清楚了,看样子我猜测可能是一些系统的问题。建议重新装一下环境再试试,如果还不行我也不太明白咋解决了,不好意思

好的,谢谢

Jinzeyuu commented 3 months ago

这个就不是很清楚了,看样子我猜测可能是一些系统的问题。建议重新装一下环境再试试,如果还不行我也不太明白咋解决了,不好意思 另外,我还想请问一个问题。在cmu-mosi的model.py文件中BertFinetuneInn类下的forward中。 def forward(self, hidden_states,pooled_output,audio_data,attention_mask): attention_mask = attention_mask.squeeze(1) attentionmask = attention_mask.permute(0, 2, 1) text_data = hidden_states text_data = text_data.transpose(1, 2) text_data = self.proj_t(text_data) text_data = text_data.transpose(1, 2) text_data_1 = text_data.reshape(-1).cpu().detach().numpy() weights = np.sqrt(np.linalg.norm(text_data_1,ord=2)) text_data = text_data/weights audio_data = audio_data.transpose(1, 2) audio_data = self.proj_a(audio_data) audio_data = audio_data.transpose(1, 2) text_att = torch.matmul(text_data,text_data.transpose(-1, -2)) text_att1 = self.activation(text_att) audio_att = torch.matmul(audio_data,audio_data.transpose(-1, -2)) audio_att = self.activation(audio_att) audio_weight_1 = self.audio_weight_1 text_weight_1 = self.text_weight_1 bias = self.bias

fusion_att =text_weight_1text_att1 + audio_weight_1audio_att + bias

fusion_feature = text_weight_1text_att1 + audio_weight_1audio_att + bias fusion_att, jacbian_loss, trace = self.featureFusion(-1, audio_att, text_att1, fusion_feature) fusion_att = fusion_att[-1] fusion_att1 = self.activation(fusion_att) fusion_att = fusion_att+ attention_mask+ attentionmask fusion_att = nn.Softmax(dim=-1)(fusion_att) fusion_att = self.dropout1(fusion_att) fusion_data = torch.matmul(fusion_att,hidden_states) fusion_data = fusion_data+hidden_states hidden_states_new = self.dense(fusion_data) hidden_states_new = self.dropout(hidden_states_new) hidden_states_new = self.LayerNorm1(hidden_states_new) hidden_states_new = hidden_states_new[:,0] return hidden_states_new,text_att1,fusion_att1,jacbian_loss,trace 其中的hidden_states为什么是文本数据输入,这里不是隐藏层的初始状态吗?最终的结果中hidden_states_new为最终的融合特征,fusion_att为注意力权重吗? 我的网络是直接使用的fusion_att作为融合特征,这几个变量的意义和关联我不是很明白,希望得到您的解答。如果我要使用经过多模态DEQ融合后的特征,应该使用哪一个进行classifier?

jinhong-ni commented 3 months ago

hidden_states_new,可以参考https://github.com/jinhong-ni/DEQFusion/blob/main/experiments/CMU-MOSI/model.py#L1483

Jinzeyuu commented 3 months ago

用,可以参考 https://github.com/jinhong-ni/DEQFusion/blob/main/experiments/CMU-MOSI/model.py#L1483`hidden_states_new`

那么这个hidden_states在这里是代表什么呢?

jinhong-ni commented 3 months ago

It's just a variable name.

Jinzeyuu commented 3 months ago

它只是一个变量名称。

在您的代码中,hidden_states先赋值给了text_data 。然后融合注意力出来的注意力分数*hidden_states+hidden_states作为了最终的融合特征,我的输入为x_visual、x_audio,我想请问的是hidden_states应该怎么定义,经过DEQ融合网络出来的注意力分数怎么处理,我最终的融合特征怎么和x_visual、x_audio相关且做残差。 在您的代码中,文本数据和音频数据与最终的注意力分数、融合特征之间我始终没有明白,如果您有时间,可否向我讲解一下?