CLIP文本编码器报RuntimeError:维度不匹配问题求助
问题原因
你的输入y形状为[32, 392, 77],代表一个batch里32个样本,每个样本对应392条77长度的标签文本序列。但CLIP的text_encoder(即encode_text)处理逻辑要求:
- 输入必须是二维张量
[N, 77](N为文本序列总数,每个序列是77个token id); - 经过
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
额外注意事项
- 确认
classifier适配三维输入:如果原分类器是针对二维张量设计的,PyTorch的nn.Linear会自动兼容批量维度,无需额外修改; - 多标签场景的相似度逻辑可根据需求调整:比如替换平均聚合为最大池化,或者保留每个标签的相似度单独计算损失。
内容的提问来源于stack exchange,提问作者Fc0001
相关产品推荐
相关产品推荐

