Python Tensorflow和Numpy数据格式不匹配

Python Tensorflow和Numpy数据格式不匹配,python,tensorflow,deep-learning,tensor,Python,Tensorflow,Deep Learning,Tensor,使用此代码: 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)

使用此代码:

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\u normal([kernel\u height,kernel\u width,input\u channel,output\u chchannel],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)
但它似乎不能正常工作。谢谢你的帮助。

你需要什么

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.        ]]]]
你需要

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.        ]]]]

谢谢您的详细回答,但正如我提到的,我在我的模型中使用此数据格式
[内核高度、内核宽度、输入通道、输出通道]
。因此,您提出的方法与我的任务不匹配。由于您使用了
[输入通道、输出通道、内核高度、内核宽度]
@AliAbbasi tf与其他dl平台一样具有固定的数据格式。如果你在处理图像,W应该是[BHWC]格式。所以我想知道Tensorflow使用BHWC,但对于Numpy,它的顺序是相反的BCHW,所以你说它没有问题,TF可以处理它?我说得对吗?@Aliabasi对不起,我没能理解你的意思。我想你只需要用适当的形状格式化掩码。我的意思是在Tensorflow中,权重是
[内核高度,内核宽度,输入通道,输出通道]
格式,当我想创建一个4维Numpy数组作为掩码时,Numpy创建为
[输入通道,输出通道,内核高度,内核宽度]
格式,我的问题是如何处理这种不匹配的格式?谢谢您的详细回答,但正如我提到的,我在我的模型中使用这种数据格式
[内核高度、内核宽度、输入通道、输出通道]
。因此,您提出的方法与我的任务不匹配。由于您使用了
[输入通道、输出通道、内核高度、内核宽度]
@AliAbbasi tf与其他dl平台一样具有固定的数据格式。如果你在处理图像,W应该是[BHWC]格式。所以我想知道Tensorflow使用BHWC,但对于Numpy,它的顺序是相反的BCHW,所以你说它没有问题,TF可以处理它?我说得对吗?@Aliabasi对不起,我没能理解你的意思。我想你只需要用适当的形状格式化掩码。我的意思是在Tensorflow中,权重是
[内核高度,内核宽度,输入通道,输出通道]
格式,当我想创建一个4维Numpy数组作为掩码时,Numpy创建为
[输入通道,输出通道,内核高度,内核宽度]
格式,我的问题是,如何处理这种不匹配的格式?