self._compute_output_and_mask_joinally = True在tf.keras.layers.蒙版图层中有什么作用?

oogrdqng  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(129)

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
ztmd8pv5

ztmd8pv51#

首先,一个重大的,公正的警告:

这是一个实现细节,切勿使用!

事实上,它可能正在消失。

话虽如此,这是一个小的优化,由所有图层类中的单个layers.Masking类使用。这是TensorFlow Keras的一部分(与TensorFlow本身相反)。当此属性存在并在层上设置为True时,Keras框架假定输出掩码已经在__call__调用中计算并放置到KerasTensor._layer_mask属性中,并优化了对compute_mask方法的调用,无论是在渴望模式还是在图形跟踪模式下。这就是全部。
实际上,在输出KerasTensor上创建_layer_mask属性也有同样的效果,而且如果不设置这两个属性,您确实可以避免有一天出现令人讨厌的意外。

相关问题