哈希层

[源代码]

Hashing

tf_keras.layers.Hashing(
    num_bins, mask_value=None, salt=None, output_mode="int", sparse=False, **kwargs
)

一个用于对分类特征进行哈希和分箱的预处理层。

此层将分类输入转换为哈希输出。它以元素级的方式将整数或字符串转换为固定范围内的整数。稳定的哈希函数使用tensorflow::ops::Fingerprint在所有平台上始终如一地产生相同的输出。

此层默认使用FarmHash64,它在不同的平台上提供一致的哈希输出,并且在调用过程中是稳定的,无论设备和上下文如何,通过彻底混合输入位。

如果您想混淆哈希输出,您也可以在构造函数中传递一个随机的salt参数。在这种情况下,该层将使用SipHash64哈希函数,其中salt值作为哈希函数的额外输入。

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

示例(FarmHash64)

>>> layer = tf.keras.layers.Hashing(num_bins=3)
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
<tf.Tensor: shape=(5, 1), dtype=int64, numpy=
  array([[1],
         [0],
         [1],
         [1],
         [2]])>

带有掩码值的示例(FarmHash64)

>>> layer = tf.keras.layers.Hashing(num_bins=3, mask_value='')
>>> inp = [['A'], ['B'], [''], ['C'], ['D']]
>>> layer(inp)
<tf.Tensor: shape=(5, 1), dtype=int64, numpy=
  array([[1],
         [1],
         [0],
         [2],
         [2]])>

示例(SipHash64)

>>> layer = tf.keras.layers.Hashing(num_bins=3, salt=[133, 137])
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
<tf.Tensor: shape=(5, 1), dtype=int64, numpy=
  array([[1],
         [2],
         [1],
         [0],
         [2]])>

示例(Siphash64 使用单个整数,与salt=[133, 133]相同)

>>> layer = tf.keras.layers.Hashing(num_bins=3, salt=133)
>>> inp = [['A'], ['B'], ['C'], ['D'], ['E']]
>>> layer(inp)
<tf.Tensor: shape=(5, 1), dtype=int64, numpy=
  array([[0],
         [0],
         [2],
         [1],
         [0]])>

参数

  • num_bins: 哈希分箱的数量。请注意,这包括mask_value分箱,因此如果设置了mask_value,则有效的分箱数量为(num_bins - 1)
  • mask_value: 表示掩码输入的值,这些输入映射到索引 0。None表示不会添加掩码项,哈希将从索引 0 开始。默认为None
  • salt: 单个无符号整数或 None。如果传递,则使用的哈希函数将是 SipHash64,这些值用作额外的输入(在密码学中称为“盐”)。这些值应该是非零的。如果为None,则使用 FarmHash64 哈希函数。它也支持 2 个无符号整数的元组/列表,详情请参见参考论文。默认为None
  • output_mode: 层输出的规范。值可以是"int""one_hot""multi_hot""count",如下配置层
    • "int": 直接返回整数分箱索引。
    • "one_hot": 将输入中的每个单个元素编码为与num_bins大小相同的数组,在输入的分箱索引处包含一个 1。如果最后一维的大小为 1,则将在该维度上进行编码。如果最后一维的大小不是 1,则将为编码输出附加一个新维度。
    • "multi_hot": 将输入中的每个样本编码为与num_bins大小相同的单个数组,对于样本中存在的每个分箱索引,包含一个 1。将最后一维视为样本维度,如果输入形状为(..., sample_length),则输出形状将为(..., num_tokens)
    • "count": 与"multi_hot"相同,但整数数组包含分箱索引在样本中出现的次数。默认为"int"
  • sparse: 布尔值。仅适用于"one_hot""multi_hot""count"输出模式。如果为 True,则返回SparseTensor而不是密集的Tensor。默认为False
  • **kwargs: 用于构建层的关键字参数。

输入形状

一个或多个字符串、int32 或 int64 TensorSparseTensorRaggedTensor,形状为(batch_size, ...,)

输出形状

一个 int64 TensorSparseTensorRaggedTensor,形状为(batch_size, ...)。如果任何输入是RaggedTensor,则输出为RaggedTensor,否则如果任何输入是SparseTensor,则输出为SparseTensor,否则输出为Tensor

参考