在自定义损失函数keras中使用boolean_mask

xa9qqrwz  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(141)

问题和错误:第一个月
故事:
我被迫实现了一个自定义的损失函数,以处理数据中标签行为"空"的问题-我找不到实现动态输出形状的方法。
A(极小样本输出):

True
[[[0, 1, 0, 0, 0], [0, 0, 0, 0, 0]]
Predict
[[0.1, 0.65, 0.1, 0.1, 0.05], [0.01, .99, 0, 0, 0]]

在这个示例中,第二个项目只是一个填充的空白,因此,我的输入形状是(None,50,300),我的(固定)输出是(None,50,5)。

def myLoss(y_true, y_pred):
    
    intermediate_tensor = tf.math.reduce_sum(tf.abs(y_true), 1)
    zero_vector = tf.zeros(shape=(1,1), dtype=tf.int64)
    bool_mask = tf.squeeze(tf.not_equal(intermediate_tensor, zero_vector))
    print(y_true)
    print(y_pred)
    print(intermediate_tensor)
    print(bool_mask)
    omit_true = tf.boolean_mask(y_true, bool_mask)
    omit_pred = tf.boolean_mask(y_pred, bool_mask)
    
    loss = tf.keras.losses.CategoricalCrossentropy()
    return loss(omit_true, omit_pred)

我只是不知道如何解决这个问题。

ny6fqffe

ny6fqffe1#

你的问题的一个解决方案是特别遵循https://stackoverflow.com/a/48986289/11194702的建议,因为你知道布尔掩码是一维的,你需要用.set_shape([None])设置它的形状。

def myLoss(y_true, y_pred):
    
    intermediate_tensor = tf.math.reduce_sum(tf.abs(y_true), 1)
    zero_vector = tf.zeros(shape=(1,1), dtype=tf.int64)
    bool_mask = tf.reshape(tf.not_equal(intermediate_tensor, zero_vector), (-1,))
    bool_mask.set_shape([None])

    print(y_true)
    print(y_pred)
    print(intermediate_tensor)
    print(bool_mask)
    omit_true = tf.boolean_mask(y_true, bool_mask)
    omit_pred = tf.boolean_mask(y_pred, bool_mask)
    
    loss = tf.keras.losses.CategoricalCrossentropy()
    return loss(omit_true, omit_pred)
7xllpg7q

7xllpg7q2#

在这里我不想深入到超出我理解范围的细节(也不想解释),损失函数存在于图形模式中,在图形模式中,batch没有维数,因为它还没有定义。
解决方案是使用tf.py_function,它允许您显式调用一个非图形函数(因此您知道那里的维数)。

相关问题