Tensorflow 如何使用tf.summary.image()以[batch,Channel,width,height](NCHW)顺序在tensorboard中可视化图像?
首先,我想使用Tensorflow 如何使用tf.summary.image()以[batch,Channel,width,height](NCHW)顺序在tensorboard中可视化图像?,tensorflow,tensorboard,Tensorflow,Tensorboard,首先,我想使用tf.reformate() 我原以为tf.reformate()会改变 [批次,阵列]->[批次,宽度,高度,通道](NHWC)订单 但在实践中,它改变了 [批次,阵列]->[批次,通道,宽度,高度](NCHW)订单 例如: a = np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
tf.reformate()
我原以为
tf.reformate()
会改变[批次,阵列]
->[批次,宽度,高度,通道]
(NHWC)订单但在实践中,它改变了
[批次,阵列]
->[批次,通道,宽度,高度]
(NCHW)订单
例如:
a = np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]])
print(a.shape)
# [batch_size, channels, height, width]
b = sess.run(tf.reshape(a, shape=[2, 3, 4, 4]))
# [batch_size, height, width, channels]
c = sess.run(tf.reshape(a, shape=[2, 4, 4, 3]))
print(b)
print('*******')
print(c)
结果是:
(2, 48)
[[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]]
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]]]
*******
[[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[13 14 15]
[16 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 1]
[ 2 3 4]]
[[ 5 6 7]
[ 8 9 10]
[11 12 13]
[14 15 16]]]
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[13 14 15]
[16 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 1]
[ 2 3 4]]
[[ 5 6 7]
[ 8 9 10]
[11 12 13]
[14 15 16]]]]
因此,我将conv和pooling层的data\u format='channels\u first'
更改为使用NCHW顺序的重塑张量。事实上,训练是很好的--verbose:
它给出了更好的结果,正如@mrry在中提到的,我认为这是可以理解的,因为NCHW是cuDNN的默认顺序
但是,我无法使用tf.summary.image()
将图像添加到摘要中,因为所需的张量形状应该是[批次大小、高度、宽度、通道]
顺序
此外,如果我按[批次、宽度、高度、通道]
顺序对输入图像进行训练和可视化,则表示图像不正确。
值得一提的是,培训效果不如使用
[批次、通道、宽度、高度]
顺序
有几个问题:1。为什么
tf.reformate()
transform[batch,array]
->(NCHW)顺序而不是(NHWC)顺序?我用tf CPU和GPU进行了测试,结果相同。我还使用了np.reforme(),也是同样的结果。(这就是为什么我可能会误解这里的某些内容)2。如何使用tf.summary.image()按(NCHW)顺序在tensorboard中可视化图像?(问题#2通过@Maosi Chen的建议解决了。谢谢)
我已经在GPU(1.4版)上训练了模型,图像来自CIFAR-10数据集。
谢谢您可以通过
tf.transpose
()对维度进行重新排序
请注意,perm
元素是源张量(a
)的维度索引
结果:
(2, 48) [[[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]]
[[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]]]
******* [[[[ 1 1 1] [ 2 2 2] [ 3 3 3] [ 4 4 4]]
[[ 5 5 5] [ 6 6 6] [ 7 7 7] [ 8 8 8]]
[[ 9 9 9] [10 10 10] [11 11 11] [12 12 12]]
[[13 13 13] [14 14 14] [15 15 15] [16 16 16]]]
[[[ 1 1 1] [ 2 2 2] [ 3 3 3] [ 4 4 4]]
[[ 5 5 5] [ 6 6 6] [ 7 7 7] [ 8 8 8]]
[[ 9 9 9] [10 10 10] [11 11 11] [12 12 12]]
[[13 13 13] [14 14 14] [15 15 15] [16 16 16]]]]
您可以通过
tf.transpose
()对尺寸进行重新排序
请注意,perm
元素是源张量(a
)的维度索引
结果:
(2, 48) [[[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]]
[[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]]]
******* [[[[ 1 1 1] [ 2 2 2] [ 3 3 3] [ 4 4 4]]
[[ 5 5 5] [ 6 6 6] [ 7 7 7] [ 8 8 8]]
[[ 9 9 9] [10 10 10] [11 11 11] [12 12 12]]
[[13 13 13] [14 14 14] [15 15 15] [16 16 16]]]
[[[ 1 1 1] [ 2 2 2] [ 3 3 3] [ 4 4 4]]
[[ 5 5 5] [ 6 6 6] [ 7 7 7] [ 8 8 8]]
[[ 9 9 9] [10 10 10] [11 11 11] [12 12 12]]
[[13 13 13] [14 14 14] [15 15 15] [16 16 16]]]]
我尝试了difference
perm
组合,但它似乎没有像我们预期的那样工作。同样根据我上面的例子,你认为应该是哪个tf.transpose()。谢谢你对问题1怎么看?它最初一定是这样排列的。你需要知道原始的顺序,然后再重塑它,把它转换成想要的4D张量。我同意。这有点模糊,因为当我使用MNIST时,通道=1,tf.reforme()
对于tensorboard上的训练和可视化效果很好。我尝试了differenceperm
组合,但它似乎没有像我们预期的那样工作。同样根据我上面的例子,你认为应该是哪个tf.transpose()。谢谢你对问题1怎么看?它最初一定是这样排列的。你需要知道原始的顺序,然后再重塑它,把它转换成想要的4D张量。我同意。这有点模糊,因为当我使用MNIST时,通道=1,tf.reforme()
对于tensorboard上的训练和可视化效果很好。