【问题标题】:Create binary tensor, given a 2d tensor with indices in tensorflow创建二元张量,给定一个在张量流中具有索引的二维张量
【发布时间】:2017-10-12 06:54:02
【问题描述】:

我需要一个类似于 tf.one_hot 给我的张量,但我(有时)每行需要一个以上的 1

更具体地说,给定一个二维张量 A,当且仅当 A 在同一行中包含列索引作为值时,我需要一个在特定位置具有 1 的二维张量。

更糟糕的是,我给定的张量 A 是动态大小和填充的,但额外的一维张量为我提供了实际长度。

什么是有效的(内存和时间)方法?

这个问题的一些背景: 我正在为每个示例使用标签的可变子集进行多类分类。 因此,我计算了 softmax 的指数,并希望从不相关的类标签中减去一个大数字。

例如,给定输入:

indices = [[1, 4, 2, 5], [0, 4, 2, 0], [2, 4, 0, 0]]
real_length = [4, 3, 2]
shape = [3, 5]

indices 是我的填充二维张量(末尾有 0 个填充),其中每个值表示在输出张量中应该将哪个值设置为 1real_length 表示indices 的每一行中有多少个值(从左至右)是非填充值。 shape 是我需要的输出张量的形状,其中第一个维度与indices 相同,第二个维度是indices 中的任何值可能取的最大值,但不一定是indices 的最大值.

我需要:

[[0, 1, 1, 0, 1, 1], [1, 0, 1, 0, 1, 0], [0, 0, 1, 0, 1, 0]]

【问题讨论】:

  • 能否请您提供投反对票的理由?

标签: python tensorflow


【解决方案1】:

对于多重热编码:

方法一

您可以使用 tf.nn.embeddings_lookup 执行此操作,如下所示:

embeddings = tf.constant([[0,0,0], [0,0,1], [0,1,1], [1,1,1]])
labels = np.array([0,3,1,2,0])
encode_tensors = tf.nn.embedding_lookup(embeddings,labels)
sess.run(encode_tensors)

输出:

array([[0, 0, 0],
      [1, 1, 1],
      [0, 0, 1],
      [0, 1, 1],
      [0, 0, 0]], dtype=int32)

方法二

labels = np.array([1, 2, 0, 3, 0])
sess.run(tf.sequence_mask(labels, 3, dtype=tf.int8))

输出:

array([[1, 0, 0],
       [1, 1, 0],
       [0, 0, 0],
       [1, 1, 1],
       [0, 0, 0]], dtype=int8)

希望这会有所帮助!

【讨论】:

  • 第一种方法对于已经中等大小的嵌入长度来说效率很低。不幸的是,第二种方法对我没有帮助,因为我需要穿插 0 和 1,我会尝试稍微澄清一下这个问题。
  • 你能举例说明你具体需要什么吗?
  • 第一个不应该是 [0, 1, 1, 0, 1, 1] 吗??
  • 对不起,你的例子很难理解。 (我的错)你能解释一下为什么 real_length 和 shape 有用吗?
  • 编辑了问题。我很累,很难表达自己。不过感谢您对我的包容!
【解决方案2】:

我不确定我是否完全理解了您问题的所有细节,一个好的起点(这将从索引中产生您想要的输出)是:

indices = [[1, 4, 2, 5], [0, 4, 2, 0], [2, 4, 0, 0]]
one_hots = tf.one_hot(indices, 6)
tf.reduce_max(one_hots, axis=1)

(其中 6 是所需输出的第二维) 产生:

[[0., 1., 1., 0., 1., 1.],
 [1., 0., 1., 0., 1., 0.],
 [1., 0., 1., 0., 1., 0.]]

因此,使用one_hot,您基本上可以创建一个形状为 (3, 4, 6) 的张量,其中包含索引中每个元素的所有单个 one_hot 编码。
然后,您将它们全部折叠成一个“多热”表示,从而摆脱索引的第二维。

由于它不执行任何查找,而只是一个简单的one_hot编码+一个max操作,我认为它会足够高效。

希望它有所帮助:)

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 2019-09-15
    • 2022-09-29
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2021-06-27
    相关资源
    最近更新 更多