我的问题是,如果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