可视化张量流中卷积层的输出

pan*_*ari 34 conv-neural-network tensorflow

我正在尝试使用该函数可视化tensorflow中卷积层的输出tf.image_summary.我已经在其他情况下成功使用它(例如可视化输入图像),但是在这里正确地重塑输出有一些困难.我有以下转换层:

img_size = 256
x_image = tf.reshape(x, [-1,img_size, img_size,1], "sketch_image")

W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
Run Code Online (Sandbox Code Playgroud)

所以输出h_conv1会有形状[-1, img_size, img_size, 32].只是使用tf.image_summary("first_conv", tf.reshape(h_conv1, [-1, img_size, img_size, 1]))不考虑32个不同的内核,所以我基本上在这里切换不同的功能图.

我怎样才能正确地重塑它们?或者是否有另一个帮助函数可用于在摘要中包含此输出?

mda*_*ust 34

我不知道辅助函数,但是如果你想看到所有的过滤器,你可以将它们打包成一个图像,并且有一些奇特的用途tf.transpose.

所以如果你有一个imagesx ixx iyx 的张量channels

>>> V = tf.Variable()
>>> print V.get_shape()

TensorShape([Dimension(-1), Dimension(256), Dimension(256), Dimension(32)])
Run Code Online (Sandbox Code Playgroud)

所以在这个例子ix = 256iy=256,channels=32

首先切掉1个图像,然后删除image尺寸

V = tf.slice(V,(0,0,0,0),(1,-1,-1,-1)) #V[0,...]
V = tf.reshape(V,(iy,ix,channels))
Run Code Online (Sandbox Code Playgroud)

接下来在图像周围添加几个零填充像素

ix += 4
iy += 4
V = tf.image.resize_image_with_crop_or_pad(image, iy, ix)
Run Code Online (Sandbox Code Playgroud)

然后重塑所以,与其32个频道你有4×8渠道,让打电话给他们cy=4,并cx=8.

V = tf.reshape(V,(iy,ix,cy,cx)) 
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分.tf似乎以C顺序返回结果,numpy的默认值.

如果展平,则当前顺序将列出第一个像素的所有通道(迭代cxcy),然后列出第二个像素的通道(递增ix).ix在递增到下一行(iy)之前穿过像素行().

我们想要将图像布置在网格中的顺序.因此ix,在沿着一行通道(cx)行进之前,你会看到一行图像(),当你到达通道行的末尾时,你会步入图像的下一行(iy)以及当你用完或行时在图像中,您将增加到下一行通道(cy).所以:

V = tf.transpose(V,(2,0,3,1)) #cy,iy,cx,ix
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢np.einsum花哨的转座,为了便于阅读,但它还tf 没有.

newtensor = np.einsum('yxYX->YyXx',oldtensor)
Run Code Online (Sandbox Code Playgroud)

无论如何,既然像素的顺序正确,我们可以安全地将它压平成2d张量:

# image_summary needs 4d input
V = tf.reshape(V,(1,cy*iy,cx*ix,1))
Run Code Online (Sandbox Code Playgroud)

尝试一下tf.image_summary,你应该得到一个小图像网格.

下面是按照此处的所有步骤后获得的图像.

在此输入图像描述