将字符串特征映射到整数索引的预处理层。
继承自:PreprocessingLayer
、Layer
、Module
用法
tf.keras.layers.StringLookup(
max_tokens=None, num_oov_indices=1, mask_token=None,
oov_token='[UNK]', vocabulary=None, idf_weights=None, encoding=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,则不会添加任何掩码项。默认为None
。 -
oov_token
仅在invert
为 True 时使用。返回 OOV 索引的令牌。默认为"[UNK]"
。 -
vocabulary
可选的。字符串数组或文本文件的字符串路径。如果传递一个数组,可以传递一个元组、列表、一维 numpy 数组或包含字符串词汇项的一维张量。如果传递文件路径,则该文件应包含词汇表中的每个术语一行。如果设置了此参数,则无需adapt()
图层。 -
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
图层是否已经适合数据。
该层通过基于表的词汇查找将一组任意字符串转换为整数输出。该层不会对输入字符串进行拆分或转换。对于不能分割和标记自然语言的层,请参阅TextVectorization
层。
该层的词汇表必须在构造时提供或通过 adapt()
学习。在 adapt()
期间,该层将分析数据集,确定单个字符串标记的频率,并从中创建词汇表。如果词汇表的大小有上限,则最常用的标记将用于创建词汇表,而所有其他标记将被视为词汇表外 (OOV)。
该层有两种可能的输出模式。当 output_mode
为 "int"
时,输入字符串将转换为它们在词汇表中的索引(整数)。当 output_mode
为 "multi_hot"
, "count"
或 "tf_idf"
时,输入字符串被编码到一个数组中,其中每个维度对应于词汇表中的一个元素。
词汇表可以选择性地包含掩码标记和 OOV 标记(可以选择性地占据词汇表中的多个索引,由 num_oov_indices
设置)。这些标记在词汇表中的位置是固定的。当 output_mode
为 "int"
时,词汇表将以掩码标记(如果已设置)开头,然后是 OOV 索引,然后是词汇表的其余部分。当 output_mode
为 "multi_hot"
, "count"
或 "tf_idf"
时,词汇表将以 OOV 索引开头,并且将删除掩码标记的实例。
有关预处理层的概述和完整列表,请参阅预处理指南。
例子:
使用已知词汇创建查找层
此示例使用预先存在的词汇表创建查找层。
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
[4, 0, 2]])>
使用经过调整的词汇表创建查找层
此示例创建一个查找层并通过分析数据集生成词汇表。
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup()
layer.adapt(data)
layer.get_vocabulary()
['[UNK]', 'd', 'z', 'c', 'b', 'a']
请注意,OOV 标记"[UNK]"
已添加到词汇表中。剩余的标记按频率排序( "d"
,首先出现 2 次),然后按逆序排序。
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup()
layer.adapt(data)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[5, 3, 1],
[1, 2, 4]])>
具有多个 OOV 索引的查找
此示例演示如何使用具有多个 OOV 索引的查找层。当使用多个 OOV 索引创建层时,任何 OOV 值都会散列到 OOV 存储桶的数量中,从而以确定性方式在集合中分配 OOV 值。
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["m", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[2, 4, 5],
[0, 1, 3]])>
请注意,OOV 值 'm' 的输出为 0,而 OOV 值 'z' 的输出为 1。in-vocab 项的输出索引从前面的示例(a 映射到 2 等)按顺序增加了 1为额外的 OOV 值腾出空间。
One-hot 输出
使用 output_mode='one_hot'
配置层。请注意,ont_hot 编码中的第一个 num_oov_indices
维度表示 OOV 值。
vocab = ["a", "b", "c", "d"]
data = tf.constant(["a", "b", "c", "d", "z"])
layer = tf.keras.layers.StringLookup(
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 = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(
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 = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(
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 = ["a", "b", "c", "d"]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(output_mode="tf_idf")
layer.set_vocabulary(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 = ["[UNK]", "a", "b", "c", "d"]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(output_mode="tf_idf")
layer.set_vocabulary(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 = ["a", "b", "c", "d"]
data = tf.constant([[1, 3, 4], [4, 0, 2]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab, invert=True)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=string, numpy=
array([[b'a', b'c', b'd'],
[b'd', b'[UNK]', b'b']], dtype=object)>
请注意,默认情况下,第一个索引对应于 oov 令牌。
正向和反向查找对
此示例演示如何使用标准查找层的词汇表来创建反向查找层。
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab)
i_layer = tf.keras.layers.StringLookup(vocabulary=vocab, invert=True)
int_data = layer(data)
i_layer(int_data)
<tf.Tensor:shape=(2, 3), dtype=string, numpy=
array([[b'a', b'c', b'd'],
[b'd', b'[UNK]', b'b']], dtype=object)>
在此示例中,输入值 "z"
导致输出 "[UNK]"
,因为 1000 不在词汇表中 - 它被表示为 OOV,并且所有 OOV 值在逆层中返回为 "[UNK]"
。另外,请注意,为了使逆向工作,您必须在调用 get_vocabulary()
之前直接或通过 adapt()
设置前向层词汇表。
相关用法
- Python tf.keras.layers.StackedRNNCells用法及代码示例
- Python tf.keras.layers.Subtract用法及代码示例
- Python tf.keras.layers.SimpleRNN用法及代码示例
- Python tf.keras.layers.SimpleRNNCell用法及代码示例
- Python tf.keras.layers.Softmax用法及代码示例
- Python tf.keras.layers.InputLayer用法及代码示例
- Python tf.keras.layers.serialize用法及代码示例
- Python tf.keras.layers.Dropout用法及代码示例
- Python tf.keras.layers.maximum用法及代码示例
- Python tf.keras.layers.LayerNormalization用法及代码示例
- Python tf.keras.layers.Conv2D用法及代码示例
- Python tf.keras.layers.RepeatVector用法及代码示例
- Python tf.keras.layers.Multiply用法及代码示例
- Python tf.keras.layers.Activation用法及代码示例
- Python tf.keras.layers.Conv1D用法及代码示例
- Python tf.keras.layers.experimental.preprocessing.PreprocessingLayer.adapt用法及代码示例
- Python tf.keras.layers.CategoryEncoding用法及代码示例
- Python tf.keras.layers.subtract用法及代码示例
- Python tf.keras.layers.experimental.preprocessing.HashedCrossing用法及代码示例
- Python tf.keras.layers.ZeroPadding3D用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.layers.StringLookup。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。