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
.
所以如果你有一个images
x ix
x iy
x 的张量channels
>>> V = tf.Variable()
>>> print V.get_shape()
TensorShape([Dimension(-1), Dimension(256), Dimension(256), Dimension(32)])
Run Code Online (Sandbox Code Playgroud)
所以在这个例子ix = 256
中iy=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的默认值.
如果展平,则当前顺序将列出第一个像素的所有通道(迭代cx
和cy
),然后列出第二个像素的通道(递增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
,你应该得到一个小图像网格.
下面是按照此处的所有步骤后获得的图像.
归档时间: |
|
查看次数: |
19665 次 |
最近记录: |