【问题标题】:Create binary tensor from vector in tensorflow从张量流中的向量创建二进制张量
【发布时间】:2018-05-28 17:06:26
【问题描述】:

我从带有N 整数条目的一维numpy 数组x(或张量流张量)开始。每个条目都小于或等于N。 我现在想创建一个形状为(N,N) 的张量Y(即一个NxN 矩阵),其中Y[i,j]=0 如果x[i]!=x[j]Y[i,j]=1 如果x[i]==x[j]

以 numpy 为例:

import numpy as np
x=np.array([1,2,1,2,3,4,2])
Y=np.zeros((x.shape[0],x.shape[0]))
for i in range(x.shape[0]):
    for j in range(x.shape[0]):
        if x[i]==x[j]:
            Y[i,j]=1

输出

array([[ 1.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  1.,  0.,  0.,  1.]])

如何在纯 tensorflow 代码中高效地创建相同的函数?

并且:如果我有一个额外的批处理维度,那么输入 x 的形状为 (B,N) 并且我期望输出 Y 的形状为 (B,N,N)。这些批次都是相互独立的。

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    x 重塑为两个不同的形状,(B, 1, N)(B, N, 1),以便它们可以正确广播,然后比较这两个张量,结果将是您所需要的 1True 和 @987654326 @被False:

    import tensorflow as tf    
    import numpy as np
    x=np.array([1,2,1,2,3,4,2])
    
    t = tf.constant(x)
    
    r = tf.cast(
      tf.equal(
        tf.reshape(t, (-1, 1, t.shape[-1].value)), 
        tf.reshape(t, (-1, t.shape[-1].value, 1))
      ), tf.int8)
    
    sess = tf.Session()
    
    sess.run(r)
    #array([[[1, 0, 1, 0, 0, 0, 0],
    #        [0, 1, 0, 1, 0, 0, 1],
    #        [1, 0, 1, 0, 0, 0, 0],
    #        [0, 1, 0, 1, 0, 0, 1],
    #        [0, 0, 0, 0, 1, 0, 0],
    #        [0, 0, 0, 0, 0, 1, 0],
    #        [0, 1, 0, 1, 0, 0, 1]]], dtype=int8)
    

    【讨论】:

      【解决方案2】:
      import tensorflow as tf
      x = tf.constant([1,2,1,2,3,4,2])
      x = tf.expand_dims(x, axis=0)
      x = tf.tile(x, [x.shape[1], 1])
      x_ = tf.transpose(x)
      Y = tf.where(tf.equal(x,x_), tf.ones_like(x), tf.zeros_like(x))
      

      你有你的向量x。您将 dims 扩展为具有矩阵 [1, x.shape]。然后你重复它以获得沿线的相同向量的副本。因此,x[i] == x[j] 等价于 x == x_ 其中 x_ 是矩阵 x 的转置。

      tf.where 是一个条件张量。您给出条件 (x == x_),对于每个元素,如果为真,它将采用第一个值 (tf.ones_like),如果为假,它将采用第二个值 (tf.zeros_like)。那些*_like(x) 函数正在生成一个充满 0 或 1 的张量,其形状与 x 相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 2017-10-12
        • 2020-07-15
        • 1970-01-01
        • 2019-10-15
        • 2022-09-29
        • 2021-04-04
        相关资源
        最近更新 更多