目前,我的代码通过激活最大化成功地可视化了网络的更深层次。但是,为了获得更易解释的图像,我正在尝试不同的正则化方法。目前,我正在通过高斯卷积进行正则化。请参见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 / 2width相匹配。然后使用“ VALID”进行填充,您将获得较小但与输入相同大小的输出。
对于更好但更困难的解决方案,您可以在频域中工作。将图像转换为频域。然后将一些较高的频率归零,然后返回到空间域。
希望您已经解决了您的问题。
关于python - tf.conv2d高斯核卷积在Tensorflow中产生奇怪的边界效应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42783603/