如何在Keras中正确定义自定义RMSE损失函数并解决张量赋值报错
报错原因
- Keras/TensorFlow的损失函数基于静态计算图运行,
Tensor类型对象不支持Python原生的下标赋值操作,你写的loss[i][j] *= xxx属于非法操作 - 损失函数运行时
y_true是张量结构,不能直接用Python原生for循环遍历、也不能直接用float()强制转换数值,这类操作会破坏计算图的构建逻辑
修复方案
直接使用张量内置的逐元素运算实现加权逻辑,不需要写循环,同时符合计算图运行要求,修复后代码如下:
import keras.backend as K def custom_rmse(y_true, y_pred): loss = K.square(y_pred - y_true) # 生成权重掩码:y_true小于0.15的位置权重为0.2,其余为0.8,逐元素运算无需嵌套循环 weight = K.where(y_true < 0.15, 0.2, 0.8) # 逐元素相乘完成加权,避开张量下标赋值的问题 loss = loss * weight loss = K.sqrt(K.sum(loss, axis=1)) return loss
上述代码完全实现了你原本的加权逻辑,同时兼容Keras计算图运行规则,运行效率也远高于Python原生循环实现。
内容的提问来源于stack exchange,提问作者Yusuf Falola
相关产品推荐
相关产品推荐

