【问题标题】:Where is the center Pixel of an even filter (6x6) in Matlab (imfilter) and TensorFlow (tf.nn.conv2d)?Matlab(imfilter)和TensorFlow(tf.nn.conv2d)中偶数滤波器(6x6)的中心像素在哪里?
【发布时间】:2018-07-20 08:33:00
【问题描述】:

对于我的硕士论文,我目前正在将卷积运算从 Matlab 代码移植到 TensorFlow(Python API)。例外是在 Matlab 中使用了偶数 filter_size (6x6)。

通过调试 Matlab 的输出和我的 TensorFlow 代码,我认识到来自 Matlab 的函数 imfilter 的行为方式与 TensorFlow 中的 tf.nn.conv2d 操作不同。我得到的平均值和标准值不同,最小值和最大值相同。

我可以确认,我在 Matlab 和 TF 上的权重值是相同的,并且重新整形是正确的。 Bias 只是一个标量,所以这也不是问题。

我的假设是函数 imfilter (Matlab) 和 tf.nn.conv2d (TF) 不使用相同的中心像素进行卷积,因为奇数内核大小的输出是相似的。因此,对于奇数内核大小,两个函数的操作相似。

这是 Matlab 代码的 sn-p:

imfilter(input_data(:,:,j), conv_subfilter, 'same', 0, 'conv');

conv_subfilter 是一个 6x6x48 过滤器内核,正在卷积一个 Width x Heigth x 48 图像 - 结果是一个深度为 1 的图像,对于 TF 和 Matlab 而言

这是我的 TF 代码的 sn-p:

h_conv3_ip = convolution2d(max_pool_conv2, W_conv3_ip, b_conv3_ip, [1, 1, 1, 1], 'SAME', "h_conv3_ip")

def convolution2d(x, W, b, strides, padding, name):
    conv2d = tf.nn.conv2d(x, W, strides=strides, padding=padding, name=name) 
    conv2d = tf.add(conv2d, b, name=name) 
    return conv2d

谁能告诉我内核中心是否是问题所在。别的? 提前感谢您的帮助!

【问题讨论】:

  • 对于从 1 开始的索引,中心元素是 floor(N/2) + 1
  • 谢谢。我想这适用于 Matlab 中的函数 imfilter 。但是 TensorFlow 中内核的中心在哪里?
  • 如果你让图像和滤镜都成为脉冲(值 1 嵌入零),你会得到什么?

标签: python matlab tensorflow deep-learning


【解决方案1】:

我发现计算中心像素的正确公式是:floor(([m n] +1) /2)。 我在一个 10x10 的补丁上测试它,它是用 1 初始化的。过滤器 6x6 也被初始化为 1。在左上边界我得到了 16 的值,无论是 TF 还是 Matlab 卷积。 所以中心像素的索引没有区别。

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2016-02-13
    • 2012-11-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多