使用stride_tricks

问题描述

我正在学习如何使用numpy的stride_tricks模块。因此,我正在使用它来实现一维卷积,并且由于要这样做,所以我也在尝试使用stride_tricks进行反向传播。

但是,我不确定如何解决 backprop部分中存在一个障碍:总和的上限(请参见下文)取决于索引l。我应该填充/遮罩wdLdc,否则最终的点积应包含可变数量的元素。我该怎么办?

前进通行证

对于前向传递,我使用X维向量xK维核w间的卷积定义(未填充):

convolution

所以代码是:

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)的尺寸相同,并将其应用于比内核更长的输入。

后退通行证

对于后向传递,我们有两个输入,因此有两个导数:

derivative with respect to kernel

derivative with respect to input

所以反向支持是:

backprop with respect to kernel

backprop with respect to input

因此以下代码(计算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 (将#修改为@)