PyTorch 中的散列叉积转换

问题描述 投票:0回答:1

我想实现一个散列叉积转换,就像 Keras 使用的那样:

>>> layer = keras.layers.HashedCrossing(num_bins=5, output_mode='one_hot')
>>> feat1 = np.array([1, 5, 2, 1, 4])
>>> feat2 = np.array([2, 9, 42, 37, 8])
>>> layer((feat1, feat2))
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
array([[0., 0., 1., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]], dtype=float32)>
>>> layer2 = keras.layers.HashedCrossing(num_bins=5, output_mode='int')
>>> layer2((feat1, feat2))
<tf.Tensor: shape=(5,), dtype=int64, numpy=array([2, 0, 4, 0, 2])>

该层使用“哈希技巧”执行分类特征的交叉。从概念上讲,转换可以被认为是: hash(concatenate(features)) % num_bins。

我很难理解

concatenate(features)
部分。我是否必须对每“对”特征进行哈希处理?

与此同时,我尝试了这个:

>>> cross_product_idx = (feat1*feat2.max()+1 + feat2) % num_bins
>>> cross_product = nn.functional.one_hot(cross_product_idx, num_bins)

它可以工作,但不使用哈希函数可能会导致分布问题

python numpy tensorflow keras
1个回答
0
投票

我可以追踪到代码的this部分,他们只是使用“X”作为来自各种功能的一组交叉值的字符串分隔符。

我正在努力理解连接(功能)部分。我是否必须对每“对”特征进行哈希处理?

如果要交叉两个特征,对于每个特征的每对值,您需要以某种方式“组合”它们(这就是他们所说的“串联”)。我从代码中看到的连接只是使用分隔符“X”的字符串连接。

因此,如果您有

feature A: "A1", "A2"
feature B: "B1", "B2", "B3"
,您需要这样做

  • hash("A1_X_B1") % num_bins
  • hash("A1_X_B2") % num_bins
  • hash("A1_X_B3") % num_bins
  • hash("A2_X_B1") % num_bins
  • hash("A2_X_B2") % num_bins
  • hash("A2_X_B2") % num_bins

然后根据需要对这些数字进行 one-hot 编码。

© www.soinside.com 2019 - 2024. All rights reserved.