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



问题和错误:ValueError: Number of mask dimensions must be specified, even if some dimensions are None. E.g. shape=[None] is ok, but shape=None is not.

的故事:

我被迫实现自定义损失函数是为了处理我有"空"的问题。标签行在我的数据-我找不到一种方法来实现动态输出形状。

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)

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

解决问题的方法是遵循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)

不需要深入到我无法理解的细节(因此解释),损失函数存在于图模式中。在图形模式下,batch没有维度,因为它还没有被定义。

解决方案是使用tf.py_function,它允许您显式调用非图函数,(因此您知道那里的维数)。

相关内容

  • 没有找到相关文章

最新更新