tf.conv2d高斯核卷积在Tensorflow中给出了奇怪的边界效应

时间:2017-03-14 10:34:41

标签: python tensorflow gaussian convolution

目前,我的代码成功地通过激活最大化可视化网络的更深层。然而,为了获得更可解释的图像,我正在尝试不同的正则化方法。目前我正在通过高斯卷积进行正则化。请参阅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有关,但我不知道如何改变它。到目前为止,我已尝试使用不同的内核大小,虽然边界发生了变化,但它们仍然存在。将填充从“相同”更改为“有效”会导致不同的输出尺寸,这也是有问题的。关于如何解决这个问题的任何想法?

提前致谢! 干杯,

3 个答案:

答案 0 :(得分:2)

我的输出图像边缘有一个类似的问题。

我发现padding='SAME'的{​​{1}}选项会在图像外部添加零。

在我的情况下问题是,我的图像有白色背景,颜色值为255,因此添加了黑色边框,这会产生大的颜色渐变

也许这个想法可以帮助别人,即使它差不多一年之后......

答案 1 :(得分:1)

哇,对不起,没有人回答你的问题。我不是专家,但我会尝试一下。首先,没有完美的解决方案。

最简单的方法是查看tf.pad。这有两种模式,允许您通过复制边缘来增长图像。或者,您可能需要求助于tf.tile。填充量应与内核1/2宽度匹配。然后使用' VALID'对于填充,您将获得较小但输出大小相同的输出。

要获得更好,更困难的解决方案,您可以在频域中工作。将图像转换为频域。然后将一些更高的频率归零,然后返回空间域。

希望你已经解决了问题。

答案 2 :(得分:1)

对于未来的读者,此link指向使用tf.nn.depthwise_conv2d来避免边缘问题的小项目。