You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CLIP文本编码器报RuntimeError:维度不匹配问题求助

问题原因

你的输入y形状为[32, 392, 77],代表一个batch里32个样本,每个样本对应392条77长度的标签文本序列。但CLIP的text_encoder(即encode_text)处理逻辑要求:

  1. 输入必须是二维张量[N, 77](N为文本序列总数,每个序列是77个token id);
  2. 经过token_embedding后转换为三维张量[N, 77, d_model],再通过permute(1,0,2)做维度转置。

而你传入的三维张量[32, 392, 77]会被token_embedding处理成四维张量[32, 392, 77, d_model],此时执行permute(1,0,2)就会触发维度不匹配错误——输入是4维,但转置操作只指定了3个维度。

解决办法

将三维输入y先展平为二维,传入text_encoder处理后,再将结果reshape回三维,适配多标签场景:

修改forward函数中处理y的部分:

def forward(self, batch): 
    x = batch['i']
    x = self.encoder(x)
    x = self.classifier(x)
    y = batch['l']
    batch_size, num_labels, seq_len = y.size()
    
    # 展平三维张量为二维:[32, 392, 77] -> [32*392, 77]
    y_flat = y.view(-1, seq_len)
    # 调用text_encoder处理
    y_encoded_flat = self.text_encoder(y_flat)
    # 将结果reshape回三维:[32*392, embedding_dim] -> [32, 392, embedding_dim]
    y = y_encoded_flat.view(batch_size, num_labels, -1)
    
    y = self.classifier(y)
    # 适配多标签的相似度计算:先对每个样本的标签做聚合(比如取平均)
    x_similarity = x @ x.T
    y_avg = y.mean(dim=1)
    y_similarity = y_avg @ y_avg.T
    
    targets = F.softmax(
      (x_similarity + y_similarity) / 2 * temperature, dim=-1
    )
    # 计算输出时适配三维y的形状,对多标签相似度取平均
    outputs = (x @ y.transpose(1,2)) / temperature
    outputs = outputs.mean(dim=-1)
    
    return outputs, targets
额外注意事项
  1. 确认classifier适配三维输入:如果原分类器是针对二维张量设计的,PyTorch的nn.Linear会自动兼容批量维度,无需额外修改;
  2. 多标签场景的相似度逻辑可根据需求调整:比如替换平均聚合为最大池化,或者保留每个标签的相似度单独计算损失。

内容的提问来源于stack exchange,提问作者Fc0001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:12:42