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

标签 python tensorflow gaussian convolution

目前,我的代码通过激活最大化成功地可视化了网络的更深层。但是,为了获得更具解释性的图像,我正在尝试不同的正则化方法。目前我正在通过高斯卷积进行正则化。请参阅 Yosinski 的《通过深度可视化了解神经网络》。

为此,我在损失函数中添加了高斯损失。我正在使用 Python 和 TensorFlow。高斯损失是通过(每次迭代)从当前图像中减去模糊图像来计算的,从而引导网络产生更模糊的最终图像。

首先,高斯核的大小为 4x4。 然后,我使用代码通过 tf.conv2d 对每个颜色 channel 与该内核执行卷积:(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”会导致不同的输出尺寸,这也是有问题的。关于如何解决这个问题的任何想法?

提前致谢! 干杯,

最佳答案

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

我发现 padding='SAME' conv2d 的选项在图像外部添加零。

在我的例子中,问题是我的图像有一个白色背景,颜色值为 255,所以添加了一个黑色边框,这导致了一个大的颜色渐变.

也许这个想法可以帮助其他人,即使是将近一年后......

关于python - tf.conv2d 高斯核卷积在 Tensorflow 中产生奇怪的边界效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783603/

相关文章:

python - 为最后一个空格拆分字符串的最佳方法

python - 在单轴上绘制值和标签(一维散点图)

python - tf.layers.conv2d和tf.contrib.slim.conv2d之间的区别

debugging - 有没有办法将 Tensorflow 中的中间输出保存到文件中?

matlab - 稀疏 GP 回归的初始种子

r - 使用 RandomFields 包绘制随机高斯场的实现会产生空白图。为什么?

python - 高斯过程 scikit-learn - 异常

python - 在 Python 中读取文件时的编码问题

python - 使用颜色图从图像中提取所有颜色

android - 运行 TensorFlow graph Android 的输出维度问题