首页 > 解决方案 > 如何在自定义 tf.keras.layers.Layer 中支持遮罩

问题描述

我正在实现一个tf.keras.layers.Layer需要支持屏蔽的自定义。

考虑以下场景

embedded = tf.keras.layer.Embedding(input_dim=vocab_size + 1, 
                                    output_dim=n_dims, 
                                    mask_zero=True)
x = MyCustomKerasLayers(embedded)

现在根据文档

mask_zero: 输入值 0 是否是一个特殊的“填充”值,应该被屏蔽掉。这在使用可能采用可变长度输入的循环层时很有用。如果这是 True ,则模型中的所有后续层都需要支持屏蔽,否则将引发异常。如果 mask_zero 设置为 True,则索引 0 不能在词汇表中使用(input_dim 应该等于词汇表的大小 + 1)。

我想知道,这是什么意思?浏览TensorFlow 的自定义层指南tf.keras.layer.Layer文档,不清楚应该做些什么来支持屏蔽

  1. 如何支持屏蔽?

  2. 如何从过去的图层访问蒙版?

  3. 假设输入(batch, time, channels)或 `(batch, time) 掩码看起来会有所不同吗?它们的形状会是什么?

  4. 我如何将它传递到下一层?

标签: pythontensorflowkeras

解决方案


  1. 为了支持屏蔽,应该compute_mask在自定义层内实现该方法

  2. call要访问掩码,只需在方法中添加参数作为第二个位置参数mask,它就可以访问(例如call(self, inputs, mask=None)

  3. 这个猜不出来,是layer的before负责计算mask

  4. 一旦你实现了compute_mask将掩码传递到下一层,就会自动发生 - 不包括模型子类化的情况,在这种情况下,由你来计算掩码并传递它们。

例子:

class MyCustomKerasLayers(tf.keras.layers.Layer):
    def __init__(self, .......):
        ...

    def compute_mask(self, inputs, mask=None):
        # Just pass the received mask from previous layer, to the next layer or 
        # manipulate it if this layer changes the shape of the input
        return mask

    def call(self, input, mask=None):
        # using 'mask' you can access the mask passed from the previous layer

请注意,此示例仅传递蒙版,如果图层将输出与接收到的形状不同的形状,则应相应更改蒙版compute_mask以传递正确的

编辑

现在解释也包含在tf.keras遮罩和填充文档中。


推荐阅读