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上的训练和可视化效果很好。我尝试了difference
perm
组合,但它似乎没有像我们预期的那样工作。同样根据我上面的例子,你认为应该是哪个
tf.transpose()。谢谢你对问题1怎么看?它最初一定是这样排列的。你需要知道原始的顺序,然后再重塑它,把它转换成想要的4D张量。我同意。这有点模糊,因为当我使用MNIST时,通道=1,
tf.reforme()
对于tensorboard上的训练和可视化效果很好。