如何将基于示例的参数添加到自定义 keras 损失函数?
How to add example based parameter to custom keras loss function?
我想在 keras 中使用自定义损失函数,每个训练示例都有一个不同的参数。
from keras import backend as K
def my_mse_loss_b(b):
def mseb(y_true, y_pred):
return K.mean(K.square(y_pred - y_true)) + b
return mseb
我读到 here y_true 和 y_pred 总是传递给损失函数,所以你需要创建包装函数。
model.compile(loss=my_mse_loss_b(df.iloc[:,2]), optimizer='adam', metrics=['accuracy'])
问题是当我拟合模型时出现错误,因为函数假定传递的参数与批次一样长。另一方面,我希望每个示例都有自己的参数。
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [20] vs. [10000]
[[node gradients/loss_2/dense_3_loss/mseb/weighted_loss/mul_grad/BroadcastGradientArgs (defined at C:\Users\flis1\Miniconda3\envs\Automate\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_keras_scratch_graph_1129]
Function call stack:
keras_scratch_graph
它说的形状不兼容。 20 是批量大小,10000 是我的训练数据集的大小和所有参数的大小。
如果我添加的参数是批量的大小,我可以拟合模型,但正如我所说,我希望在示例的基础上传递参数。
在您的情况下,由于您的参数 b
与其训练示例紧密耦合,因此将其作为基本事实的一部分是有意义的。您可以像下面这样重写损失函数:
def mseb(y_true, y_pred):
y_t, b = y_true[0], y_true[1]
return K.mean(K.square(y_pred - y_t)) + b
然后用
训练你的模型
model.compile(loss=mseb)
b = df.iloc[:,2]
model.fit(X,(y,b))
我想在 keras 中使用自定义损失函数,每个训练示例都有一个不同的参数。
from keras import backend as K
def my_mse_loss_b(b):
def mseb(y_true, y_pred):
return K.mean(K.square(y_pred - y_true)) + b
return mseb
我读到 here y_true 和 y_pred 总是传递给损失函数,所以你需要创建包装函数。
model.compile(loss=my_mse_loss_b(df.iloc[:,2]), optimizer='adam', metrics=['accuracy'])
问题是当我拟合模型时出现错误,因为函数假定传递的参数与批次一样长。另一方面,我希望每个示例都有自己的参数。
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [20] vs. [10000]
[[node gradients/loss_2/dense_3_loss/mseb/weighted_loss/mul_grad/BroadcastGradientArgs (defined at C:\Users\flis1\Miniconda3\envs\Automate\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_keras_scratch_graph_1129]
Function call stack:
keras_scratch_graph
它说的形状不兼容。 20 是批量大小,10000 是我的训练数据集的大小和所有参数的大小。
如果我添加的参数是批量的大小,我可以拟合模型,但正如我所说,我希望在示例的基础上传递参数。
在您的情况下,由于您的参数 b
与其训练示例紧密耦合,因此将其作为基本事实的一部分是有意义的。您可以像下面这样重写损失函数:
def mseb(y_true, y_pred):
y_t, b = y_true[0], y_true[1]
return K.mean(K.square(y_pred - y_t)) + b
然后用
训练你的模型model.compile(loss=mseb)
b = df.iloc[:,2]
model.fit(X,(y,b))