tf.conv2d 高斯核卷积在 Tensorflow 中产生奇怪的边界效果

tf.conv2d gaussian kernel convolution gives strange border effect in Tensorflow

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

提前致谢! 干杯,

哇,很抱歉没有人回答您的问题。我不是专家,但我会试一试。首先,没有完美的解决方案。

最简单的方法就是看tf.pad。它有几种模式,可让您通过复制边缘来扩大图像。或者,您可能需要求助于 tf.tile。填充量应与您的内核 1/2 宽度相匹配。然后使用 'VALID' 进行填充,您将获得更小但与输入大小相同的输出。

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

希望您已经解决了问题。

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

我遇到了类似的问题,即我的输出图像周围有丑陋的边框。

我发现 conv2dpadding='SAME' 选项会在图像外部添加零。

在我的例子中,问题是我的图像有一个白色背景,颜色值为 255,因此 添加了一个黑色边框,结果 大颜色渐变.

也许这个想法可以帮助其他人,即使它已经快一年了......