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

CLIP模型张量形状不兼容错误的解决方案咨询

问题:CLIP模型损失函数形状不兼容错误解决

问题背景

当前使用CLIP模型时,模型输出形状如下:

  • image_model_output:(20, 256)
  • text_model_output:(20, 128, 256)

关键计算步骤及输出形状

  1. 计算logits
logits = (tf.matmul(caption_embeddings, image_embeddings, transpose_b=True))

输出形状:(20, 128, 20)

  1. 计算图像相似度
images_similarity = tf.matmul(
        image_embeddings, image_embeddings, transpose_b=True
    )

输出形状:(20,20)

  1. 计算文本相似度
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:57:18