首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新分解层的权重?

如何更新分解层的权重?
EN

Stack Overflow用户
提问于 2017-01-17 14:20:24
回答 1查看 1.2K关注 0票数 8

我正在尝试开发一个反卷积层(确切地说,是一个转置卷积层)。

在前传中,我在后传做完全卷积(零填充卷积),做有效卷积(无填充卷积),将误差传递给前一层。

这些偏差的梯度很容易计算,这只是在多余维度上的平均问题。

问题是我不知道如何更新卷积滤波器的权重。梯度是多少?我肯定这是一个卷积运算,但我不知道怎么做。我试着用误差对输入进行有效的卷积,但没有结果。

EN

回答 1

Stack Overflow用户

发布于 2017-10-01 08:57:56

解卷解释

首先,反褶积是一个卷积层,只用于不同的目的,即过采样(为什么它有用在本论文中解释)。

例如,在这里,将2x2输入图像(蓝色底部图像)向上采样为4x4 (绿色顶部图像):

为了使其成为有效的卷积,首先对输入进行填充,使之成为6x6,然后应用3x3滤波器而不跨。就像在普通的卷积层,你可以选择不同填充物/跨步策略来产生你想要的图像大小。

反向传球

现在应该清楚的是,反褶积的反传是卷积层反传的局部情况,具有特殊的步长和填充。我认为您已经这样做了,但是对于任何跨步和填充,这里有一个天真(也不是非常有效)的实现:

代码语言:javascript
复制
# 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]

使用im2colcol2im可以更有效地完成同样的任务,但这只是一个实现细节。另一个有趣的事实是:卷积运算(包括数据和权值)的反向传递同样是卷积,但具有空间翻转滤波器。

下面是它的应用方式(简单的SGD):

代码语言:javascript
复制
# 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

正如你所看到的,这是非常简单的,只是需要理解你在应用同样的旧卷积。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41699513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档