Hashing 层

[源代码]

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,并将这些值用作附加输入(在密码学中称为“salt”)。这些值应为非零。如果为 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

参考