在反卷积(转置卷积)层中添加偏差

数据挖掘 神经网络 美国有线电视新闻网 卷积
2022-02-20 13:56:52

我的问题是关于转置卷积操作(通常也称为反卷积或上卷积)。例如,在 TensorFlow 中,我指的是一层。

我的问题是,在应用这一层时,我们如何/何时添加偏置(截距)项?

当使用“常规”卷积时,我们这样做:

conv_output = tf.nn.conv2d(input, kernel, strides, padding='VALID')
conv_output = tf.nn.bias_add(conv_output, bias)

在应用反卷积层时我们如何做到这一点?我的困惑出现了,因为我的顾问告诉我将上卷积可视化为伪逆卷积层(在卷积对输入进行下采样,而转置卷积对其进行上采样的意义上是逆的。我知道它们在数学上不是逆的。)

按照他的说法:

正则卷积:conv = x.w + b

转置卷积:(x = (conv - b).W其中 w 和 W 不相同)。

上面的等式是否正确?有些事情让我感到不安。

在这种情况下,既然我们正在“倒退”,我们是否应该这样做:

deconv_output = tf.nn.bias_add(input, -1 * bias)
deconv_output = tf.nn.conv2d_transpose(deconv_output, kernel, strides, padding='VALID')

或者我们应该在应用转置卷积之后添加偏差,就像我们在“常规”卷积中所做的那样?

1个回答

我们正在倒退,因为我们正在上采样,因此与标准卷积层相反,就像你说的那样,但我们更普遍地在神经网络中继续前进。出于这个原因,我会在卷积操作之后添加偏差。这是标准做法:首先应用矩阵点积(也称为仿射变换),然后在最终应用非线性之前添加偏差。

使用转置卷积,我们并没有完全反转前向(下采样)卷积——这样的操作在数学中被称为逆卷积或反卷积我们正在执行(转置)卷积操作,它返回与生成相关激活图相同的输入维度,但不保证实际值与原始输入相同。

你可以从这里的各种卷积操作的动画中看到,转置卷积基本上是一个普通的卷积,但增加了膨胀/填充以获得所需的输出尺寸。诀窍是保留像素之间的定位映射。

获取这些动画的论文中,他们解释了转置卷积本质上是如何反向执行卷积步骤:

...,虽然内核w相乘来计算,但它也定义了一个转置卷积,其前向和后向通过由下式计算分别相乘。CCTCT(CT)T=C

支持我观点的另一个来源:在PyTorch 实现中,似乎偏差被添加到卷积结果的输出中。