当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.keras.layers.IntegerLookup用法及代码示例


将整数特征映射到连续范围的预处理层。

继承自:PreprocessingLayerLayerModule

用法

tf.keras.layers.IntegerLookup(
    max_tokens=None, num_oov_indices=1, mask_token=None, oov_token=-1,
    vocabulary=None, vocabulary_dtype='int64', idf_weights=None,
    invert=False, output_mode='int', sparse=False,
    pad_to_max_tokens=False, **kwargs
)

参数

  • max_tokens 该层的最大词汇量。这仅应在调整词汇表或设置 pad_to_max_tokens=True 时指定。如果没有,词汇量没有上限。请注意,此大小包括 OOV 和掩码标记。默认为无。
  • num_oov_indices 要使用的词汇表外标记的数量。如果该值大于 1,则 OOV 输入被调制以确定它们的 OOV 值。如果此值为 0,OOV 输入将在调用层时导致错误。默认为 1。
  • mask_token 表示掩码输入的整数标记。当 output_mode"int" 时,令牌包含在词汇表中并映射到索引 0。在其他输出模式下,令牌不会出现在词汇表中,并且输入中的掩码令牌实例将被丢弃。如果设置为 None,则不会添加任何掩码项。默认为无。
  • oov_token 仅在 invert 为 True 时使用。返回 OOV 索引的令牌。默认为 -1。
  • vocabulary 可选的。整数数组或文本文件的字符串路径。如果传递一个数组,可以传递一个元组、列表、一维 numpy 数组或包含整数词汇项的一维张量。如果传递文件路径,则该文件应包含词汇表中的每个术语一行。如果设置了此参数,则无需adapt() 图层。
  • vocabulary_dtype 词汇术语的 dtype,例如 "int64""int32" 。默认为 "int64"
  • idf_weights 仅当 output_mode"tf_idf" 时有效。元组、列表、一维 numpy 数组或一维张量或与词汇表长度相同,包含浮点逆文档频率权重,该权重将乘以每个样本术语计数,以获得最终的 tf_idf 权重。如果设置了 vocabulary 参数,并且 output_mode"tf_idf" ,则必须提供此参数。
  • invert 仅当 output_mode"int" 时有效。如果为 True,则该层将索引映射到词汇项,而不是将词汇项映射到索引。默认为假。
  • output_mode 层输出的规范。默认为"int".值可以是"int","one_hot","multi_hot","count", 或者"tf_idf"配置层如下:
    • "int" :返回输入标记的词汇索引。
    • "one_hot" :将输入中的每个单独元素编码为与词汇表大小相同的数组,在元素索引处包含 1。如果最后一个维度是大小 1,将在该维度上进行编码。如果最后一个维度不是大小 1,将为编码输出附加一个新维度。
    • "multi_hot" :将输入中的每个样本编码为与词汇表大小相同的单个数组,其中样本中存在的每个词汇表项都包含一个 1。将最后一个维度视为样本维度,如果输入形状为 (..., sample_length),则输出形状将为 (..., num_tokens)。
    • "count" :与 "multi_hot" 一样,但 int 数组包含该索引处的标记出现在样本中的次数的计数。
    • "tf_idf" :与 "multi_hot" 一样,但应用 TF-IDF 算法来查找每个令牌槽中的值。对于"int" 输出,支持任何形状的输入和输出。对于所有其他输出模式,目前仅支持输出到 rank 2。
  • pad_to_max_tokens 仅当 output_mode"multi_hot" , "count""tf_idf" 时适用。如果为 True,即使词汇表中唯一标记的数量少于 max_tokens,输出的特征轴也会填充到 max_tokens,从而导致形状为 [batch_size, max_tokens] 的张量,而与词汇表无关尺寸。默认为假。
  • sparse 布尔值。仅当 output_mode"multi_hot" , "count""tf_idf" 时适用。如果为 True,则返回 SparseTensor 而不是密集的 Tensor 。默认为假。

属性

  • is_adapted 图层是否已经适合数据。

该层通过基于表的词汇表查找将一组任意整数输入标记映射到索引整数输出。该层的输出索引将连续排列,直到最大词汇大小,即使输入标记是非连续的或无界的。该层支持通过 output_mode 对输出进行编码的多种选项,并可选择支持词汇表外 (OOV) 标记和掩码。

该层的词汇表必须在构造时提供或通过 adapt() 学习。在 adapt() 期间,该层将分析数据集,确定单个整数标记的频率,并从中创建一个词汇表。如果词汇表的大小有上限,则最常用的标记将用于创建词汇表,而所有其他标记将被视为 OOV。

该层有两种可能的输出模式。当 output_mode"int" 时,输入整数将转换为它们在词汇表中的索引(整数)。当 output_mode"multi_hot" , "count""tf_idf" 时,输入整数被编码到一个数组中,其中每个维度对应于词汇表中的一个元素。

词汇表可以选择性地包含掩码标记和 OOV 标记(可以选择性地占据词汇表中的多个索引,由 num_oov_indices 设置)。这些标记在词汇表中的位置是固定的。当 output_mode"int" 时,词汇表将从索引 0 处的掩码标记开始,然后是 OOV 索引,然后是词汇表的其余部分。当 output_mode"multi_hot" , "count""tf_idf" 时,词汇表将以 OOV 索引开头,并且将删除掩码标记的实例。

有关预处理层的概述和完整列表,请参阅预处理指南。

例子:

使用已知词汇创建查找层

此示例使用预先存在的词汇表创建查找层。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])  # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
       [4, 0, 2]])>

使用经过调整的词汇表创建查找层

此示例创建一个查找层并通过分析数据集生成词汇表。

data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup()
layer.adapt(data)
layer.get_vocabulary()
[-1, 42, 1138, 1000, 36, 12]

请注意,OOV 标记 -1 已添加到词汇表中。剩余的标记按频率排序(42,有 2 次出现,是第一个),然后按逆排序顺序。

data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup()
layer.adapt(data)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[5, 2, 1],
       [1, 3, 4]])>

具有多个 OOV 索引的查找

此示例演示如何使用具有多个 OOV 索引的查找层。当使用多个 OOV 索引创建层时,任何 OOV 令牌都会散列到 OOV 存储桶的数量中,从而以确定性的方式在集合中分配 OOV 令牌。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [37, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[2, 4, 5],
       [1, 0, 3]])>

请注意,OOV 标记 37 的输出为 1,而 OOV 标记 1000 的输出为 0。in-vocab 术语的输出索引从前面的示例中增加了 1(12 映射到 2 等),以便为额外的OOV令牌。

One-hot 输出

使用 output_mode='one_hot' 配置层。请注意,ont_hot 编码中的第一个 num_oov_indices 维度表示 OOV 值。

vocab = [12, 36, 1138, 42]
data = tf.constant([12, 36, 1138, 42, 7]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    vocabulary=vocab, output_mode='one_hot')
layer(data)
<tf.Tensor:shape=(5, 5), dtype=float32, numpy=
  array([[0., 1., 0., 0., 0.],
         [0., 0., 1., 0., 0.],
         [0., 0., 0., 1., 0.],
         [0., 0., 0., 0., 1.],
         [1., 0., 0., 0., 0.]], dtype=float32)>

Multi-hot 输出

使用 output_mode='multi_hot' 配置层。请注意,multi_hot 编码中的第一个 num_oov_indices 维度表示 OOV 令牌

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    vocabulary=vocab, output_mode='multi_hot')
layer(data)
<tf.Tensor:shape=(2, 5), dtype=float32, numpy=
  array([[0., 1., 0., 1., 1.],
         [1., 0., 1., 0., 1.]], dtype=float32)>

令牌计数输出

使用 output_mode='count' 配置层。与 multi_hot 输出一样,输出中的第一个 num_oov_indices 维度表示 OOV 标记。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    vocabulary=vocab, output_mode='count')
layer(data)
<tf.Tensor:shape=(2, 5), dtype=float32, numpy=
  array([[0., 1., 0., 1., 2.],
         [2., 0., 1., 0., 1.]], dtype=float32)>

TF-IDF 输出

使用 output_mode='tf_idf' 配置层。与 multi_hot 输出一样,输出中的第一个 num_oov_indices 维度表示 OOV 标记。

每个令牌箱将输出 token_count * idf_weight ,其中 idf 权重是每个令牌的逆文档频率权重。这些应与词汇一起提供。请注意,OOV 令牌的 idf_weight 将默认为传入的所有 idf 权重的平均值。

vocab = [12, 36, 1138, 42]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    output_mode='tf_idf', vocab, idf_weights=idf_weights)
layer(data)
<tf.Tensor:shape=(2, 5), dtype=float32, numpy=
  array([[0.  , 0.25, 0.  , 0.6 , 0.8 ],
         [1.0 , 0.  , 0.75, 0.  , 0.4 ]], dtype=float32)>

要指定 oov 标记的 idf 权重,您需要传递整个词汇表,包括前导 oov 标记。

vocab = [-1, 12, 36, 1138, 42]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    output_mode='tf_idf', vocab, idf_weights=idf_weights)
layer(data)
<tf.Tensor:shape=(2, 5), dtype=float32, numpy=
  array([[0.  , 0.25, 0.  , 0.6 , 0.8 ],
         [1.8 , 0.  , 0.75, 0.  , 0.4 ]], dtype=float32)>

在tf_idf模式下适配层时,每个输入样本都将被视为一个文档,每个令牌的idf权重将计算为log(1 + num_documents / (1 + token_document_count)).

逆向查找

此示例演示如何使用此层将索引映射到标记。 (您也可以将 adapt()inverse=True 一起使用,但为简单起见,我们将在此示例中传递词汇。)

vocab = [12, 36, 1138, 42]
data = tf.constant([[1, 3, 4], [4, 0, 2]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, invert=True)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[  12, 1138,   42],
       [  42,   -1,   36]])>

请注意,默认情况下,第一个索引对应于 oov 令牌。

正向和反向查找对

此示例演示如何使用标准查找层的词汇表来创建反向查找层。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
i_layer = tf.keras.layers.IntegerLookup(
    vocabulary=layer.get_vocabulary(), invert=True)
int_data = layer(data)
i_layer(int_data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[  12, 1138,   42],
       [  42,   -1,   36]])>

在此示例中,输入标记 1000 导致输出 -1,因为 1000 不在词汇表中 - 它被表示为 OOV,并且所有 OOV 标记在逆层中返回为 -1。另外,请注意,要使逆向工作,您必须在调用 get_vocabulary() 之前直接或通过 adapt() 设置前向层词汇表。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.layers.IntegerLookup。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。