Bap*_*cht 8 machine-learning convolution deep-learning deconvolution
我正在尝试开发一个反卷积层(或准确的转置卷积层).
在前向传递中,我做了一个完整的卷积(零填充卷积)在后向传递中,我做了一个有效的卷积(没有填充的卷积)将错误传递给前一层
偏差的梯度很容易计算,只需要在多余尺寸上求平均值.
问题是我不知道如何更新卷积滤波器的权重.什么是渐变?我确定这是一个卷积操作,但我不知道如何.我尝试了输入的有效卷积和错误但无济于事.
首先,反卷积是一个卷积层,仅用于不同的目的,即上采样(本文解释了为什么它有用)。
例如,这里2x2
输入图像(底部蓝色图像)被上采样为4x4
(顶部绿色图像):
为了使其成为有效的卷积,首先对输入进行填充以使其成为6x6
,然后在3x3
不跨步的情况下应用滤波器。就像在普通的卷积层中一样,您可以选择不同的填充/跨步策略来生成您想要的图像大小。
现在应该清楚,反卷积的反向传递是卷积层反向传递的部分情况,具有特定的步幅和填充。我认为您已经完成了,但是这里有一个针对任何步幅和填充的幼稚(而且不是很有效)的实现:
# input: x, w, b, stride, pad, d_out
# output: dx, dw, db <- gradients with respect to x, w, and b
N, C, H, W = x.shape
F, C, HH, WW = w.shape
N, C, H_out, W_out = d_out.shape
x_pad = np.pad(x, pad_width=((0, 0), (0, 0), (pad, pad), (pad, pad)), mode='constant', constant_values=0)
db = np.sum(d_out, axis=(0, 2, 3))
dw = np.zeros_like(w)
dx = np.zeros_like(x_pad)
for n in xrange(N):
for f in xrange(F):
filter_w = w[f, :, :, :]
for out_i, i in enumerate(xrange(0, H, stride)):
for out_j, j in enumerate(xrange(0, W, stride)):
dw[f, :, :, :] += d_out[n, f , out_i, out_j] * x_pad[n, :, i:i+HH, j:j+WW]
dx[n, :, i:i+HH, j:j+WW] += filter_w * d_out[n, f, out_i, out_j]
dx = dx[:,:,1:H+1,1:W+1]
Run Code Online (Sandbox Code Playgroud)
im2col
使用和可以更有效地完成同样的工作col2im
,但这只是一个实现细节。另一个有趣的事实:卷积运算(对于数据和权重)的向后传递又是一个卷积,但具有空间翻转的滤波器。
下面是它的应用方式(简单的 SGD):
# backward_msg is the message from the next layer, usually ReLu
# conv_cache holds (x, w, b, conv_params), i.e. the info from the forward pass
backward_msg, dW, db = conv_backward(backward_msg, conv_cache)
w = w - learning_rate * dW
b = b - learning_rate * db
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它非常简单,只需要了解您正在应用相同的旧卷积。
归档时间: |
|
查看次数: |
697 次 |
最近记录: |