TensorFlow中model.compile设置Huber损失delta参数触发TypeError怎么办?
如何在Keras中为Huber损失设置自定义delta参数?
你遇到的错误是因为直接调用huber(delta=0.1)时,函数会立刻尝试计算损失,但此时缺少训练时才会传入的y_true和y_pred参数,因此触发TypeError。下面是两种正确的设置方式:
方法一:使用Huber损失类(推荐)
keras.losses.huber本质是Huber类的快捷调用,当需要自定义参数时,直接实例化Huber类即可:
import numpy as np import tensorflow as tf from tensorflow import keras # 创建数据集 x = np.random.rand(10, 1) y = 2 * x + np.random.randn(10, 1) * 0.1 # 定义模型 model = keras.Sequential([ keras.layers.Dense(1, input_shape=[1]) ]) # 编译模型(使用Huber类实例化并设置delta) model.compile(loss=keras.losses.Huber(delta=0.1), optimizer='adam') # 训练模型 model.fit(x, y, epochs=5)
方法二:用Lambda函数包装损失函数
如果你偏好使用函数形式,可以用Lambda函数封装,确保huber函数在训练时能接收到y_true和y_pred参数:
model.compile(loss=lambda y_true, y_pred: keras.losses.huber(y_true, y_pred, delta=0.1), optimizer='adam')
补充说明
loss="huber":Keras会自动实例化一个使用默认参数(delta=1.0)的Huber损失对象。loss=huber:直接传递损失函数本身,Keras会在训练时自动传入y_true和y_pred参数。- 而
huber(delta=0.1)是直接执行了损失计算,但此时没有传入必须的y_true和y_pred,因此报错。
内容的提问来源于stack exchange,提问作者iris_hu
相关产品推荐
相关产品推荐

