Keras自定义相对均方根误差损失函数类型不匹配报错如何解决
问题修复方案
报错信息:
TypeError: Input 'y' of 'Sub' Op has type uint8 that does not match type float32 of argument 'x'
该报错核心原因是张量运算类型不匹配:Keras模型输出的预测值y_pred默认是float32类型,而你传入的真实标签y_train、验证集标签为uint8类型(多为未做类型转换的原始数据常见类型),减法运算要求运算符两边数据类型一致,因此触发错误。
你可以按以下步骤修复:
- 第一步:修正标签数据类型与验证集配置错误
你当前验证集的标签参数填写错误,不应该传入预测值y_predict,需替换为测试集真实标签y_test,同时将所有标签统一转换为float32类型:
# 转换标签类型 y_train = y_train.astype("float32") y_test = y_test.astype("float32") # 修正后的训练代码,验证集标签替换为真实值y_test model_history = model.fit( x=[l_train, s_train,w_train], y=y_train, validation_data=([l_test, s_test , w_test], y_test), epochs=500, batch_size=10, verbose=1)
- 第二步:优化自定义损失函数,彻底避免类型问题
你当前损失函数中的变量n如果未提前定义为全局变量也会触发报错,且分子分母的n可以直接约掉,同时可以在损失函数内部主动做类型转换,避免后续再出现同类问题:
def relative_root_mean_squared_error(y_true, y_pred): # 主动将y_true转换为和y_pred一致的类型 y_true = K.cast(y_true, K.dtype(y_pred)) # 约掉分子分母的n,简化计算公式 return K.sqrt(K.mean(K.square(y_pred - y_true))) / K.mean(y_true) * 100
- 可选优化点
你当前是回归任务,metrics选择accuracy没有实际意义,准确率是分类任务的评估指标,可以替换为回归常用的评估指标:
model.compile(optimizer = "adam", loss = relative_root_mean_squared_error, metrics =["mae", "mse"])
内容的提问来源于stack exchange,提问作者mobbbbbbbi
相关产品推荐
相关产品推荐

