问题描述
我正在学习如何使用numpy的stride_tricks
模块。因此,我正在使用它来实现一维卷积,并且由于要这样做,所以我也在尝试使用stride_tricks进行反向传播。
但是,我不确定如何解决 backprop部分中存在一个障碍:总和的上限(请参见下文)取决于索引l
。我应该填充/遮罩w
或dLdc
,否则最终的点积应包含可变数量的元素。我该怎么办?
前进通行证
对于前向传递,我使用X
维向量x
和K
维核w
之间的卷积定义(未填充):
所以代码是:
def conv1d(x,w):
X = len(x)
K = len(w)
tx = np.lib.stride_tricks.as_strided(x,shape=(X-K+1,K),strides=(x.strides[0],x.strides[0])
)
return np.dot(tx,w)
这里一切正常,因为我们将tx
的第一个轴设置为与输出(X - K + 1
)的尺寸相同,并将其应用于比内核更长的输入。
后退通行证
对于后向传递,我们有两个输入,因此有两个导数:
所以反向支持是:
因此以下代码(计算dLdx
的部分)不起作用,因为它始终实现总和为k=X-K+1
的总和,但应在l
处停止:
def backprop(dLdc,x,w):
X = len(x)
K = len(w)
tx = np.lib.stride_tricks.as_strided(x,x.strides[0]))
tw = np.lib.stride_tricks.as_strided(w,X),strides=(-w.strides[0],w.strides[0]))
dLdx = np.dot(dLdc,tx)
dLdw = np.dot(dLdc,tw)
return dLdx,dLdw
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)