什么是自我_compute_output_and_mask_joint=是否在tf.keras.layers.Maski



tf.keras.layers.Masking层的__init__(...)中将_compute_output_and_mask_jointly设置为True,除了告诉它在call(...)中做什么之外,这个属性还能做什么?

def __init__(self, mask_value=0., **kwargs):
...
self._compute_output_and_mask_jointly = True

此外,掩模已经创建并应用于call(...)中。compute_mask(...)的用途是什么?似乎是多余的。

def compute_mask(self, inputs, mask=None):
return tf.reduce_any(tf.not_equal(inputs, self.mask_value), axis=-1)
def call(self, inputs):
boolean_mask = tf.reduce_any(
tf.not_equal(inputs, self.mask_value), axis=-1, keepdims=True)
outputs = inputs * tf.cast(boolean_mask, inputs.dtype)
# Compute the mask and outputs simultaneously.
outputs._keras_mask = tf.squeeze(boolean_mask, axis=-1)  # pylint: disable=protected-access
return outputs

首先,一个沉重而公平的警告:


这是一个实现细节,永远不要使用它

事实上,它可能正在退出


话虽如此,这是一个小的优化,由所有层类中的单个layers.Masking类使用。这是TensorFlow Keras的一部分(与TensorFlow本身相反(。当该属性存在并在层上设置为True时,Keras框架假设输出掩码已经在__call__调用中计算并放入KerasTensor._layer_mask属性中,并在热切模式和图形跟踪模式下优化对compute_mask方法的调用。这就是全部。十一点之前没有魔法。

实际上,在输出KerasTensor上创建_layer_mask属性具有相同的效果。如果不设置这两个属性,总有一天你会避免一个令人讨厌的惊喜。

相关内容

最新更新