目前,我的代码成功地通过激活最大化可视化网络的更深层。然而,为了获得更可解释的图像,我正在尝试不同的正则化方法。目前我正在通过高斯卷积进行正则化。请参阅Yosinski通过深度可视化了解神经网络。
为此,我在损失函数中添加了高斯损失。我正在使用Python& Tensorflow。通过(每次迭代)从当前图像中减去模糊图像来计算高斯损失,从而引导网络产生更模糊的最终图像。
首先,高斯内核由大小为4x4组成。 然后,我通过tf.conv2d为每个颜色通道执行一个卷积与代码:( gauss_var是高斯内核,维度为[4,4,1,1])
# unstack 3 channel image
[tR, tG, tB] = tf.unstack(input_image, num=3, axis=3)
# give each one a fourth dimension in order to use it in conv2d
tR = tf.expand_dims(tR, 3)
tG = tf.expand_dims(tG, 3)
tB = tf.expand_dims(tB, 3)
#convolve each input image with the gaussian filter
tR_gauss = tf.nn.conv2d(tR, gauss_var, strides=[1, 1, 1, 1], padding='SAME')
tG_gauss = tf.nn.conv2d(tG, gauss_var, strides=[1, 1, 1, 1], padding='SAME')
tB_gauss = tf.nn.conv2d(tB, gauss_var, strides=[1, 1, 1, 1], padding='SAME')
我通过这样做来计算差异:
# calculate difference
R_diff = tf.subtract(tR, tR_gauss)
G_diff = tf.subtract(tR, tG_gauss)
B_diff = tf.subtract(tR, tB_gauss)
并将其分成一个数字:
total_diff = tf.add_n([R_diff, G_diff, B_diff])
gaussian_loss = tf.reduce_sum(total_diff)
问题是生成的图像始终在边框处显示条形,并且颜色为蓝色。 This是一个过度夸张的最终图像示例。
我很确定这种边界效应与conv2d有关,但我不知道如何改变它。到目前为止,我已尝试使用不同的内核大小,虽然边界发生了变化,但它们仍然存在。将填充从“相同”更改为“有效”会导致不同的输出尺寸,这也是有问题的。关于如何解决这个问题的任何想法?
提前致谢! 干杯,
答案 0 :(得分:2)
我的输出图像边缘有一个类似的问题。
我发现padding='SAME'
的{{1}}选项会在图像外部添加零。
在我的情况下问题是,我的图像有白色背景,颜色值为255,因此添加了黑色边框,这会产生大的颜色渐变强>
也许这个想法可以帮助别人,即使它差不多一年之后......
答案 1 :(得分:1)
最简单的方法是查看tf.pad。这有两种模式,允许您通过复制边缘来增长图像。或者,您可能需要求助于tf.tile。填充量应与内核1/2宽度匹配。然后使用' VALID'对于填充,您将获得较小但输出大小相同的输出。
要获得更好,更困难的解决方案,您可以在频域中工作。将图像转换为频域。然后将一些更高的频率归零,然后返回空间域。
希望你已经解决了问题。
答案 2 :(得分:1)
对于未来的读者,此link指向使用tf.nn.depthwise_conv2d
来避免边缘问题的小项目。