【问题标题】:Tensorflow and Numpy mismatch data formatTensorFlow 和 Numpy 不匹配数据格式
【发布时间】:2017-06-29 12:32:52
【问题描述】:

使用此代码:

import tensorflow as tf  

w = tf.Variable(tf.random_normal( [ 3 , 3 , 1 , 1  ], stddev = 0.01 )) 
if __name__ == '__main__': 
    initVar = tf.global_variables_initializer()  
    with tf.Session() as sess:  
        sess.run(initVar) 
        print w.eval()

由于w = tf.Variable(tf.random_normal( [kernel_height, kernel_width, input_channel, output_chhannel], stddev = 0.01 ))的数据格式,我希望看到这样的矩阵:

[[[[ -0.004  0.003  0.006]
   [ -0.005 -0.008  0.001]
   [  0.006  0.007  0.002]]]]

但它会打印:

[[[[ 0.001]] 
  [[-0.031]] 
  [[-0.005]]]

 [[[ 0.006]] 
  [[ 0.011]] 
  [[ 0.006]]]

 [[[ 0.008]] 
  [[-0.001]] 
  [[ 0.014]]]]

我想要的是将我的权重张量值与 0 和 1 的常数张量一一相乘,以获得如下的掩码权重:

w = [[[[ -0.004  0.003  0.006]
       [ -0.005 -0.008  0.001]
       [  0.006  0.007  0.002]]]]

mask = [[[[ 1  1  1]
          [ 1  1  0]
          [ 0  0  0]]]]

w * mask =  [[[[ -0.004  0.003  0.006]
               [ -0.005 -0.008  0.   ]
               [  0.     0.     0.   ]]]]

我使用的代码是这样的:

    mask = np.ones((3, 3, 1, 1), dtype=np.float32)
    mask[1, 2, :, :] = 0.
    mask[2, :, :, :] = 0. 

    weight = tf.get_variable("weight", [3, 3, 1, 1], tf.float32, tf.contrib.layers.xavier_initializer()) 

    weight *= tf.constant(mask, dtype=tf.float32)

但似乎它不能正常工作。感谢您的帮助。

【问题讨论】:

    标签: python tensorflow deep-learning tensor


    【解决方案1】:

    你需要

    w = tf.Variable(tf.random_normal([1, 1, 3, 3], stddev=0.01)) 
    

    最后,你可以使用

    import tensorflow as tf 
    import numpy as np
    
    mask = np.ones((1, 1, 3, 3), dtype=np.float32)
    mask[:, :, 1, 2] = 0.
    mask[:, :, 2, :] = 0. 
    
    print(mask)
    
    weight = tf.get_variable("weight", [3, 3, 1, 1], tf.float32, tf.contrib.layers.xavier_initializer())
    weight *= tf.transpose( tf.constant(mask, dtype=tf.float32) )
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(tf.transpose(weight).eval())
    

    你会得到

    [[[[ 1.  1.  1.]
       [ 1.  1.  0.]
       [ 0.  0.  0.]]]]
    
    [[[[ 0.88993669  0.80872607  0.57259583]
       [ 0.5067296  -0.20804334 -0.        ]
       [ 0.          0.          0.        ]]]]
    

    【讨论】:

    • 感谢您的详细回答,但正如我所提到的,我在我的模型中使用了这种数据格式 [kernel_height, kernel_width, input_channel, output_channel]。因此,您提出的方法与我的任务不匹配。由于您使用了[ input_channel, output_channel, kernel_height, kernel_width]
    • @AliAbbasi tf 具有与其他 dl 平台一样的固定数据格式。如果是处理图片,W应该是[BHWC]格式。
    • 所以我想知道Tensorflow使用BHWC但使用Numpy,它是BCHW的倒序,所以你说它没有问题,TF可以处理吗?我说的对吗?
    • @AliAbbasi 对不起,我无法理解你的意思。我认为您只需要使用适当的形状格式化 mask
    • 我的意思是在 Tensorflow 中权重是 [kernel_height, kernel_width, input_channel, output_channel] 格式,当我想创建一个 4 维 Numpy 数组作为 Mask 时,Numpy 将它创建为 [ input_channel, output_channel, kernel_height, kernel_width] 格式,我的问题是如何处理这种不匹配的格式?
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2017-11-04
    • 2021-12-08
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多