Hashing
类keras.layers.Hashing(
num_bins, mask_value=None, salt=None, output_mode="int", sparse=False, **kwargs
)
一个用于哈希和分箱分类特征的预处理层。
该层将分类输入转换为哈希输出。它将整数或字符串逐个元素地转换为固定范围内的整数。稳定的哈希函数使用 tensorflow::ops::Fingerprint
在所有平台上一致地产生相同的输出。
该层默认使用 FarmHash64,通过充分混合输入位,它能在不同平台之间提供一致的哈希输出,并且在调用之间保持稳定,不受设备和上下文的影响。
如果你想混淆哈希输出,你还可以在构造函数中传入一个随机的 salt
参数。在这种情况下,该层将使用 SipHash64 哈希函数,其中 salt
值作为哈希函数的附加输入。
注意: 该层内部使用了 TensorFlow。它不能与除 TensorFlow 之外的任何后端一起用作模型编译计算图的一部分。但是,在急切执行模式下,它可以与任何后端一起使用。它也可以始终作为任何后端(在模型本身之外)的输入预处理流水线的一部分使用,这是我们推荐使用该层的方式。
注意: 该层可以在 tf.data
流水线中安全使用(无论你使用的是哪个后端)。
示例 (FarmHash64)
>>> layer = keras.layers.Hashing(num_bins=3)
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
array([[1],
[0],
[1],
[1],
[2]])>
示例 (FarmHash64) 带掩码值
>>> layer = keras.layers.Hashing(num_bins=3, mask_value='')
>>> inp = [['A'], ['B'], [''], ['C'], ['D']]
>>> layer(inp)
array([[1],
[1],
[0],
[2],
[2]])
示例 (SipHash64)
>>> layer = keras.layers.Hashing(num_bins=3, salt=[133, 137])
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
array([[1],
[2],
[1],
[0],
[2]])
示例 (Siphash64 带单个整数,等同于 salt=[133, 133]
)
>>> layer = keras.layers.Hashing(num_bins=3, salt=133)
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
array([[0],
[0],
[2],
[1],
[0]])
参数
mask_value
对应的分箱,因此如果设置了 mask_value
,有效的分箱数量是 (num_bins - 1)
。None
表示不添加掩码项,哈希将从索引 0 开始。默认为 None
。None
,则使用 FarmHash64 哈希函数。它还支持包含两个无符号整数的元组/列表,详见参考论文。默认为 None
。"int"
、"one_hot"
、"multi_hot"
或 "count"
,按如下方式配置层:"int"
: 直接返回整数分箱索引。"one_hot"
: 将输入中的每个独立元素编码为一个与 num_bins
大小相同的数组,在输入元素对应的分箱索引处包含一个 1。如果最后一维大小为 1,则在该维度上编码。如果最后一维大小不为 1,则为编码输出附加一个新维度。"multi_hot"
: 将输入中的每个样本编码为一个与 num_bins
大小相同的单个数组,对于样本中存在的每个分箱索引都包含一个 1。将最后一维视为样本维度,如果输入形状是 (..., sample_length)
,则输出形状将是 (..., num_bins)
。"count"
: 与 "multi_hot"
类似,但整数数组包含分箱索引在样本中出现的次数计数。默认为 "int"
。"one_hot"
、"multi_hot"
和 "count"
输出模式。仅支持 TensorFlow 后端。如果为 True
,则返回 SparseTensor
而不是密集 Tensor
。默认为 False
。输入形状
一个字符串、一个字符串列表,或形状为 (batch_size, ...,)
的 int32
或 int64
张量。
输出形状
形状为 (batch_size, ...)
的 int32
张量。
参考