我正在训练一个有两个输出的CovNet。我的训练样本如下:
[0, value_a1], [0, value_a2], ...
和
[value_b1, 0], [value_b2, 0], ....
我想生成自己的损失函数和包含mask_value = 0
的掩码对。我有这个功能,虽然我不确定它是否真的能满足我的需求。所以,我想写一些测试。
from tensorflow.python.keras import backend as K
from tensorflow.python.keras import losses
def masked_loss_function(y_true, y_pred, mask_value=0):
'''
This model has two target values which are independent of each other.
We mask the output so that only the value that is used for training
contributes to the loss.
mask_value : is the value that is not used for training
'''
mask = K.cast(K.not_equal(y_true, mask_value), K.floatx())
return losses.mean_squared_error(y_true * mask, y_pred * mask)
虽然,我不知道如何用keras测试这个功能?通常,这会传递给model.compile()
。像这样的东西:
x = [1, 0]
y = [1, 1]
assert masked_loss_function(x, y, 0) == 0
答案 0 :(得分:3)
我认为实现这一目标的一种方法是使用Keras后端功能。这里我们定义一个函数,它将两个张量作为输入,并作为输出返回张量:
from keras import Model
from keras import layers
x = layers.Input(shape=(None,))
y = layers.Input(shape=(None,))
loss_func = K.Function([x, y], [masked_loss_function(x, y, 0)])
现在我们可以使用loss_func
来运行我们定义的计算图:
assert loss_func([[[1,0]], [[1,1]]]) == [[0]]
请注意,keras后端函数Function
期望输入和输出参数是张量数组。此外,x
和y
需要一批具有未定义形状的张量,即张量数组。
答案 1 :(得分:0)
这是另一种解决方法,
x = [1, 0]
y = [1, 1]
F = masked_loss_function(K.variable(x), K.variable(y), K.variable(0))
assert K.eval(F) == 0