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
1条答案
按热度按时间ztmd8pv51#
首先,一个重大的,公正的警告:
这是一个实现细节,切勿使用!
事实上,它可能正在消失。
话虽如此,这是一个小的优化,由所有图层类中的单个
layers.Masking
类使用。这是TensorFlow Keras的一部分(与TensorFlow本身相反)。当此属性存在并在层上设置为True
时,Keras框架假定输出掩码已经在__call__
调用中计算并放置到KerasTensor._layer_mask
属性中,并优化了对compute_mask
方法的调用,无论是在渴望模式还是在图形跟踪模式下。这就是全部。实际上,在输出
KerasTensor
上创建_layer_mask
属性也有同样的效果,而且如果不设置这两个属性,您确实可以避免有一天出现令人讨厌的意外。