自定义Keras损失函数,根据条件创建零梯度

我的问题是,如果y_true取某些特定值时,我不希望权重被调整。由于我正在使用的RNN的特性,我不希望简单地从训练数据中移除这些样本。

有没有办法在Keras中编写具有这种行为的条件损失函数?

例如:如果y_true为负数,则应用零梯度,使模型中的参数不发生变化;如果y_true为正数,则loss = losses.mean_squared_error(y_true, y_pred)


回答:

您可以定义一个自定义损失函数,并简单地使用K.switch来有条件地获得零损失:

from keras import backend as Kfrom keras import lossesdef custom_loss(y_true, y_pred):    loss = losses.mean_squared_error(y_true, y_pred)    return K.switch(K.flatten(K.equal(y_true, 0.)), K.zeros_like(loss), loss)

测试:

from keras import modelsfrom keras import layersmodel = models.Sequential()model.add(layers.Dense(1, input_shape=(1,)))model.compile(loss=custom_loss, optimizer='adam')weights, bias = model.layers[0].get_weights()x = np.array([1, 2, 3])y = np.array([0, 0, 0])model.train_on_batch(x, y)# 检查训练批次后的参数是否未发生变化>>> (weights == model.layers[0].get_weights()[0]).all()True>>> (bias == model.layers[0].get_weights()[1]).all()True

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注