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
相关产品推荐
相关产品推荐

