从Tensorflow文档中,当使用Keras子类API时,他们给出了如何将掩码传递给实现掩蔽的其他层的示例。我想知道这是明确需要的,还是在嵌入层有mask_zero=True之后才正确处理。
class MyLayer(layers.Layer):
  def __init__(self, **kwargs):
    super(MyLayer, self).__init__(**kwargs)
    self.embedding = layers.Embedding(input_dim=5000, output_dim=16, mask_zero=True)
    self.lstm = layers.LSTM(32)
  def call(self, inputs):
    x = self.embedding(inputs)
    # Note that you could also prepare a `mask` tensor manually.
    # It only needs to be a boolean tensor
    # with the right shape, i.e. (batch_size, timesteps).
    mask = self.embedding.compute_mask(inputs)
    output = self.lstm(x, mask=mask)  # The layer will ignore the masked values
    return output
layer = MyLayer()
x = np.random.random((32, 10)) * 100
x = x.astype('int32')
layer(x)我的困惑来自于文档的另一个领域,即:
掩蔽 该层支持用可变的时间步骤对输入数据进行掩蔽。若要将掩码引入数据,请使用嵌入层,将mask_zero参数设置为True。
这似乎意味着,如果mask_zero=True不需要对后续层执行进一步的命令。
发布于 2020-02-14 20:52:29
如果您阅读了有关掩蔽层的内容,它还将支持在开始使用掩码之后,所有其他层都会自动获得掩码。
引用:
对于输入张量中的每个时间步骤(张量中的维#1 ),如果输入张量在该时间步骤中的所有值都等于mask_value,那么时间步骤将在所有下游层(只要它们支持掩蔽)被屏蔽(跳过)。 如果任何下游层不支持掩蔽,但接收到这样的输入掩码,则会引发异常。
这个其他链接也声明了相同的内容。掩码将传播到所有层。
引用:
当使用Functional或Sequential时,由嵌入层或掩蔽层生成的掩码将通过网络传播到任何能够使用它们的层(例如,RNN层)。Keras将自动获取与输入相对应的掩码,并将其传递给任何知道如何使用它的层。
第二个链接确实充满了关于掩蔽的细节。
请注意,您显示的代码用于自定义嵌入。如果您教您如何“创建和传递”一个掩码,如果您想要创建一个图层,将创建一个掩码。它基本上是显示正常嵌入层所做的事情。
因此,我们可以得出这样的结论:如果您使用的是一个普通的Embedding层,那么您所需要的就是mask_zero=True,所有的东西都会顺流而下。
发布于 2022-01-30 07:51:05
除了给出高层次的答案外,让我们看看一些重要的技术细节。
如果有疑问,请检查掩蔽源代码,了解它是如何工作的。
_keras_mask属性添加到张量中,该属性标记要跳过的条目,从而有效地让其他API方法知道它。supports_masking属性测试自己是否有一个层支持掩码。示例:tf.keras.layers.GlobalMaxPool1D().supports_maskingnot_equal和any标记剩余的内容)import tensorflow ast f
arr = np.arange(6).reshape((1,6,1))
arr_masked = tf.keras.layers.Masking(mask_value=5)(arr)
print(arr_masked._keras_mask)
print(arr_masked.numpy())发布于 2020-03-03 15:46:59
我认为您必须在子类层中从一层到另一层传递掩码。来自Tensorflow文档:引用
注意,在子类模型或层的调用方法中,掩码不会自动传播,因此需要手动将掩码参数传递给任何需要掩码的层。
https://stackoverflow.com/questions/60232970
复制相似问题