IntegerLookup 类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,
name=None,
**kwargs
)
一个将整数映射到(可能已编码的)索引的预处理层。
该层通过基于表的词汇查找,将一组任意的整数输入令牌映射到索引整数输出。该层的输出索引将连续排列,直到达到最大词汇大小,即使输入令牌是非连续的或无界的。该层支持通过 `output_mode` 进行输出编码的多种选项,并具有对词汇外 (OOV) 令牌和掩码的可选支持。
该层的词汇必须在构造时提供,或通过 `adapt()` 进行学习。在 `adapt()` 过程中,该层将分析数据集,确定各个整数令牌的频率,并从中创建词汇。如果词汇大小受限,则使用最频繁的令牌来创建词汇,所有其他令牌将被视为 OOV。
该层有两种可能的输出模式。当 `output_mode` 为 `"int"` 时,输入整数将被转换为它们在词汇表中的索引(一个整数)。当 `output_mode` 为 `"multi_hot"`、`"count"` 或 `"tf_idf"` 时,输入整数将被编码为数组,其中每个维度对应于词汇表中的一个元素。
词汇表可以选择性地包含一个掩码令牌以及一个 OOV 令牌(OOV 令牌可以根据 `num_oov_indices` 的设置占用词汇表中的多个索引)。这些令牌在词汇表中的位置是固定的。当 `output_mode` 为 `"int"` 时,词汇表将以索引 0 处的掩码令牌开始,然后是 OOV 索引,最后是其余的词汇。当 `output_mode` 为 `"multi_hot"`、`"count"` 或 `"tf_idf"` 时,词汇表将以 OOV 索引开始,而掩码令牌的实例将被丢弃。
注意:此层在内部使用 TensorFlow。它不能作为具有 TensorFlow 以外任何后端模型的已编译计算图的一部分。但是,当以 eager 模式运行时,它可以与任何后端一起使用。它也可以始终用作任何后端(模型外部)的输入预处理管道的一部分,我们推荐使用这种方式使用此层。
注意:此层可以在 tf.data 管道中使用(与您使用的后端无关)。
参数
pad_to_max_tokens=True 时才应指定此项。如果为 None,则词汇表大小没有上限。请注意,此大小包括 OOV 和掩码标记。默认为 None。1。"int"、"one_hot"、"multi_hot"、"count" 或 "tf_idf",配置层如下:"int":返回输入标记的词汇表索引。"one_hot":将输入中的每个单独元素编码到一个与词汇表大小相同的数组中,该数组在元素索引处包含一个 1。如果最后一个维度的大小为 1,则在该维度上进行编码。如果最后一个维度不为 1,则会附加一个新维度用于编码输出。"multi_hot": 将输入中的每个样本编码为与词汇表大小相同的单个数组,其中包含一个 1 来表示样本中存在的每个词汇项。如果输入形状为 `(..., sample_length)`,则将最后一个维度视为样本维度,输出形状将为 `(..., num_tokens)`。"count":与 "multi_hot" 相同,但整数数组包含该索引处标记在样本中出现的次数。"tf_idf": 与 `"multi_hot"` 类似,但应用 TF-IDF 算法来查找每个令牌槽中的值。对于 `"int"` 输出,输出形状与输入形状匹配。对于 `"one_hot"` 输出,输出形状为 `input_shape + (vocabulary_size,)`,其中 `input_shape` 可以是任意秩。对于其他输出模式(`"multi_hot"`、`"count"`、`"tf_idf"`),输出形状为 `(batch_size, vocabulary_size)`。默认为 `"int"`。"multi_hot"、"count" 和 "tf_idf" 输出模式。仅受 TensorFlow 后端支持。如果为 True,则返回 SparseTensor 而不是密集 Tensor。默认为 False。示例
使用已知词汇表创建查找层
此示例使用预先存在的词汇表创建查找层。
>>> vocab = [12, 36, 1138, 42]
>>> data = np.array([[12, 1138, 42], [42, 1000, 36]]) # Note OOV tokens
>>> layer = IntegerLookup(vocabulary=vocab)
>>> layer(data)
array([[1, 3, 4],
[4, 0, 2]])
使用自适应词汇表创建查找层
此示例创建一个查找层,并通过分析数据集生成词汇表。
>>> data = np.array([[12, 1138, 42], [42, 1000, 36]])
>>> layer = IntegerLookup()
>>> layer.adapt(data)
>>> layer.get_vocabulary()
[-1, 42, 1138, 1000, 36, 12]
请注意,OOV 令牌 -1 已添加到词汇表中。其余令牌按频率排序(出现 2 次的 42 排在第一),然后按反向排序。
>>> data = np.array([[12, 1138, 42], [42, 1000, 36]])
>>> layer = IntegerLookup()
>>> layer.adapt(data)
>>> layer(data)
array([[5, 2, 1],
[1, 3, 4]])
多 OOV 索引查找
此示例演示了如何使用具有多个 OOV 索引的查找层。当层创建时具有多个 OOV 索引时,任何 OOV 令牌都会被哈希到 OOV 桶的数量中,从而将 OOV 令牌确定性地分布在集合中。
>>> vocab = [12, 36, 1138, 42]
>>> data = np.array([[12, 1138, 42], [37, 1000, 36]])
>>> layer = IntegerLookup(vocabulary=vocab, num_oov_indices=2)
>>> layer(data)
array([[2, 4, 5],
[1, 0, 3]])
请注意,OOV 令牌 37 的输出为 1,而 OOV 令牌 1000 的输出为 0。词汇表内的令牌的输出索引比前面的示例增加了 1(12 映射到 2,依此类推),以便为额外的 OOV 令牌腾出空间。
One-hot 输出
使用 `output_mode='one_hot'` 配置该层。请注意,one_hot 编码中的前 `num_oov_indices` 维代表 OOV 值。
>>> vocab = [12, 36, 1138, 42]
>>> data = np.array([12, 36, 1138, 42, 7]) # Note OOV tokens
>>> layer = IntegerLookup(vocabulary=vocab, output_mode='one_hot')
>>> layer(data)
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)
多热输出
使用 `output_mode='multi_hot'` 配置该层。请注意,multi_hot 编码中的前 `num_oov_indices` 维代表 OOV 令牌。
>>> vocab = [12, 36, 1138, 42]
>>> data = np.array([[12, 1138, 42, 42],
... [42, 7, 36, 7]]) # Note OOV tokens
>>> layer = IntegerLookup(vocabulary=vocab, output_mode='multi_hot')
>>> layer(data)
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 = np.array([[12, 1138, 42, 42],
... [42, 7, 36, 7]]) # Note OOV tokens
>>> layer = IntegerLookup(vocabulary=vocab, output_mode='count')
>>> layer(data)
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 令牌。
每个令牌 bin 将输出 `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 = np.array([[12, 1138, 42, 42],
... [42, 7, 36, 7]]) # Note OOV tokens
>>> layer = IntegerLookup(
... output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
>>> layer(data)
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 = np.array([[12, 1138, 42, 42],
... [42, 7, 36, 7]]) # Note OOV tokens
>>> layer = IntegerLookup(
... output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
>>> layer(data)
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 = np.array([[1, 3, 4], [4, 0, 2]])
>>> layer = IntegerLookup(vocabulary=vocab, invert=True)
>>> layer(data)
array([[ 12, 1138, 42],
[ 42, -1, 36]])
请注意,默认情况下,第一个索引对应于 oov 标记。
前向和逆向查找对
此示例演示如何使用标准查找层的词汇表创建逆向查找层。
>>> vocab = [12, 36, 1138, 42]
>>> data = np.array([[12, 1138, 42], [42, 1000, 36]])
>>> layer = IntegerLookup(vocabulary=vocab)
>>> i_layer = IntegerLookup(
... vocabulary=layer.get_vocabulary(), invert=True)
>>> int_data = layer(data)
>>> i_layer(int_data)
array([[ 12, 1138, 42],
[ 42, -1, 36]])
在此示例中,输入令牌 1000 导致输出为 -1,因为 1000 不在词汇表中 - 它被表示为 OOV,并且所有 OOV 令牌在反向层中都返回 -1。此外,请注意,为了使反向工作,您必须在调用 `get_vocabulary()` 之前,通过直接设置或通过 `adapt()` 来设置前向层的词汇表。