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

TensorFlow2.7中使用Keras CosineSimilarity损失函数报错问题

解决TF 2.7中使用CosineSimilarity损失训练Stellargraph GCN的类型错误

错误原因

TF 2.7原生Keras.losses.CosineSimilarity内部计算时会引入浮点型epsilon(默认值1e-12),当你的标签数据为int64类型时,执行Maximum操作会触发类型不匹配——该操作期望输入为int64,但epsilon是浮点型,导致报错。

解决方案

方案1:自定义余弦相似度损失,统一数据类型

手动实现损失函数,先将标签转换为浮点型再计算,避免类型冲突:

import tensorflow as tf
from tensorflow.keras import losses

class CustomCosineSimilarity(losses.Loss):
    def __init__(self, axis=-1, epsilon=1e-12, name="cosine_similarity"):
        super().__init__(name=name)
        self.axis = axis
        self.epsilon = epsilon

    def call(self, y_true, y_pred):
        # 将int64标签转换为float32
        y_true = tf.cast(y_true, tf.float32)
        # 归一化计算余弦相似度
        y_true = tf.linalg.l2_normalize(y_true, axis=self.axis)
        y_pred = tf.linalg.l2_normalize(y_pred, axis=self.axis)
        cosine_similarity = tf.reduce_sum(y_true * y_pred, axis=self.axis)
        # 返回1 - 余弦相似度作为损失(和原生实现逻辑一致)
        return 1 - cosine_similarity

替换原损失函数,同时修正指标实例化的错误:

model.compile(
    optimizer=optimizers.Adam(learning_rate=0.001),
    loss=CustomCosineSimilarity(),
    metrics=[Precision()],  # 需传入Precision实例,而非类
)

方案2:修改数据生成器的标签类型

直接在train_gen和val_gen中将输出的标签转换为float32类型,比如在生成器的返回逻辑中添加:

# 假设生成器返回(x, y),修改为:
return x, tf.cast(y, tf.float32)

额外注意点

  • 原代码中EarlyStopping监控的val_F1,当前指标列表中仅包含Precision,需确认是否已自定义F1指标,否则会触发监控指标不存在的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:55:21