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
属性具有相同的效果。如果不设置这两个属性,总有一天你会避免一个令人讨厌的惊喜。