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创建为[输入通道,输出通道,内核高度,内核宽度]
格式,我的问题是,如何处理这种不匹配的格式?