代码之家  ›  专栏  ›  技术社区  ›  Merlin1896

TensorFlow中每个维度的元素数

  •  1
  • Merlin1896  · 技术社区  · 6 年前

    假设我有一个张量 y 有形状 (batch_size, n) 其中包含整数。我在找一个 张力流 从输入创建两个新张量的函数 Y .

    第一个返回值 w1 应该有形状 (批量,N) 并控制在适当的位置 b,i ,比中整数的倍数 y[b,i] 发生在 y[b] . 如果 Y〔B,I〕 是零,那么 w1[b,i]=0 . 例子:

    第二个返回值 w2 只应在每个批(或行)中的不同整数数(0除外)上包含一个 Y .

    y=np.array([[ 0,  0, 10, 10, 24, 24],  [99,  0,  0, 12, 12, 12]])
    w1,w2= get_w(y)
    #w1=[[0 , 0 , 0.5, 0.5, 0.5, 0.5],  [1, 0, 0, 0.33333333, 0.33333333, 0.33333333]]
    #w2=[0.5,0.5]
    

    那么,我怎样才能让tensorflow来做这个?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Vijay Mariappan    6 年前

    你可以使用 tf.unique_with_counts :

    y = tf.constant([[0,0,10,10,24,24],[99,0,0,12,12,12]], tf.int32)
    
    out_g = []
    out_c = []
    #for each row
    for w in tf.unstack(y,axis=0):
        # out gives unique elements in w 
        # idx gives index to the input w
        # count gives the count of each element of out in w
        out,idx, count = tf.unique_with_counts(w)
    
        #inverse of total non zero elements in w
        non_zero_count = 1/tf.count_nonzero(out)
    
        # gather the inverse of non zero unique counts
        g = tf.cast(tf.gather(1/count,idx), tf.float32) * tf.cast(tf.sign(w), tf.float32)
        out_g.append(g)
        out_c.append(non_zero_count)
    out_g = tf.stack(out_g)
    out_c = tf.stack(out_c)
    
    with tf.Session() as sess:
       print(sess.run(out_g))
       print(sess.run(out_c))
    
    #Output:
    
    #[[0.   0.    0.5   0.5        0.5        0.5       ]
    #[1.    0.    0.    0.33333334 0.33333334 0.33333334]]
    
    # [0.5 0.5]
    
        2
  •  0
  •   iacob    6 年前

    我不知道TensorFlow中有哪一个函数会产生这种情况,但使用列表理解来实现这一点相对简单:

    import tensorflow as tf
    import numpy as np
    
    y = np.array([[ 0,  0, 10, 10, 24, 24],  [99,  0,  0, 12, 12, 12]])
    y_ = [list(a) for a in y]
    
    w1 = [[b.count(x)**(-1.0) if x != 0 else 0 for x in b ] for b in y_]
    w2 = [len(set(b) - set([0]))**(-1.0) for b in y_]
    
    w1
    >>>[[0, 0, 0.5, 0.5, 0.5, 0.5], [1.0, 0, 0, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333]]
    w2
    >>>[0.5, 0.5]
    
    data_w1 = np.asarray(w1, np.float32)
    data_w2 = np.asarray(w2, np.float32)
    
    data_w1 = tf.convert_to_tensor(data_w1, np.float32)
    data_w2 = tf.convert_to_tensor(data_w2, np.float32)