CLIP模型张量形状不兼容错误的解决方案咨询
问题:CLIP模型损失函数形状不兼容错误解决
问题背景
当前使用CLIP模型时,模型输出形状如下:
image_model_output:(20, 256)text_model_output:(20, 128, 256)
关键计算步骤及输出形状
- 计算logits
logits = (tf.matmul(caption_embeddings, image_embeddings, transpose_b=True))
输出形状:(20, 128, 20)
- 计算图像相似度
images_similarity = tf.matmul( image_embeddings, image_embeddings, transpose_b=True )
输出形状:(20,20)
- 计算文本相似度
captions_similarity = tf.matmul( caption_embeddings, caption_embeddings, transpose_b=True )
输出形状:(20, 128, 128)
报错场景
最初计算targets时因维度不兼容报错,使用tf.expand_dims(image_embeddings, axis=1)扩展维度后可运行,但执行损失函数时:
targets = keras.activations.softmax( (captions_similarity + images_similarity) / (2 * self.temperature) ) captions_loss = keras.losses.categorical_crossentropy( y_true=targets, y_pred=logits, from_logits=True )
出现错误:ValueError: Shapes (2, 128, 128) and (2, 128, 1) are incompatible
解决方案
核心问题是**targets与logits形状不匹配**,需对齐两者维度并遵循CLIP对比损失逻辑:
1. 修正targets的维度与生成逻辑
logits形状为(batch_size, num_captions_per_image, num_images)(20=batch_size,128=单图对应文本数,20=图像数),因此targets需为对应形状的匹配矩阵,即每个文本对应batch内的关联图像:
# 生成batch内图像的one-hot匹配矩阵,形状(20,20) image_target = tf.eye(20) # 扩展维度并重复,适配单图128个文本的形状,最终得到(20,128,20) targets = tf.repeat(tf.expand_dims(image_target, axis=1), repeats=128, axis=1) # 可选:用温度系数调整softmax分布 targets = keras.activations.softmax(targets / self.temperature)
2. 验证维度匹配
修正后的targets形状为(20,128,20),与logits形状完全一致,此时调用categorical_crossentropy不会再出现形状不兼容错误。
3. 额外:修正相似度相加的逻辑(若需保留)
若一定要通过文本+图像相似度生成targets,需先对齐两者维度:
- 将
images_similarity扩展为(20,128,20),再与调整维度后的captions_similarity运算(需确认业务逻辑是否合理,因为文本相似度原形状为(20,128,128),直接相加逻辑需适配任务需求)。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

