Python 我用numpy实现的多通道1d卷积有什么问题(与tensorflow相比)

Python 我用numpy实现的多通道1d卷积有什么问题(与tensorflow相比),python,numpy,tensorflow,convolution,Python,Numpy,Tensorflow,Convolution,为了确保我理解TensorFlow的卷积运算,我在numpy中使用多个通道实现了conv1d。然而,我得到了不同的结果,我看不出问题所在。与conv1d相比,我的实现似乎是重叠值的两倍 代码: 但是,这对w1和w2给出了不同的结果: In [13]: w1 # Numpy result Out[13]: array([[[ 17., 53., 41., 15., 12.], [ 44., 140., 108., 44., 40.], [ 54., 1

为了确保我理解TensorFlow的卷积运算,我在numpy中使用多个通道实现了conv1d。然而,我得到了不同的结果,我看不出问题所在。与conv1d相比,我的实现似乎是重叠值的两倍

代码:

但是,这对w1和w2给出了不同的结果:

In [13]: w1 # Numpy result
Out[13]: 
array([[[ 17.,  53.,  41.,  15.,  12.],
        [ 44., 140., 108.,  44.,  40.],
        [ 54., 174., 134.,  58.,  56.],
        [ 32., 104.,  80.,  36.,  36.]],

       [[ 57., 189., 145.,  71.,  76.],
        [124., 412., 316., 156., 168.],
        [134., 446., 342., 170., 184.],
        [ 72., 240., 184.,  92., 100.]]])

In [14]: w2 # Tensorflow result
Out[14]: 
array([[[ 17.,  53.,  41.,  15.,  12.],
        [ 22.,  70.,  54.,  22.,  20.],
        [ 27.,  87.,  67.,  29.,  28.],
        [ 32., 104.,  80.,  36.,  36.]],

       [[ 57., 189., 145.,  71.,  76.],
        [ 62., 206., 158.,  78.,  84.],
        [ 67., 223., 171.,  85.,  92.],
        [ 72., 240., 184.,  92., 100.]]], dtype=float32)
在我的版本中,重叠索引(中间的2)似乎比conv1d增加了一倍。然而,我不知道该怎么做,除法在这里似乎不是正确的,因为卷积是一种简单的乘加运算

知道我做错了什么吗?提前谢谢


编辑:我使用
padding='same'
得到了相同的结果。错误在for循环中的
+=
中。您计算两次
w1[:,1,:]
w1[:,2,:]
,并将它们添加到自身中。只需将
+=
替换为
=
,或者只需执行以下操作:

>>> x @ y
array([[[ 17.,  53.,  41.,  15.,  12.],
        [ 22.,  70.,  54.,  22.,  20.],
        [ 27.,  87.,  67.,  29.,  28.],
        [ 32., 104.,  80.,  36.,  36.]],

       [[ 57., 189., 145.,  71.,  76.],
        [ 62., 206., 158.,  78.,  84.],
        [ 67., 223., 171.,  85.,  92.],
        [ 72., 240., 184.,  92., 100.]]], dtype=float32)

谢谢这不是张量乘法而不是卷积吗?我认为
+=
是卷积定义的一部分。否则的话,它会不会抛出2/3的结果?也许是张量广播规则我还没有完全理解。看一下文档。如果a是一个N-D数组,b是一个M-D数组(其中M>=2),它是a的最后一个轴和b的第二个到最后一个轴的和积:
dot(a,b)[i,j,k,M]=sum(a[i,j:]*b[k,:,M])
好的,谢谢,事实上我刚刚在numpy中玩过简单的1D操作,我认为我的逻辑更好,额外的维度让我感到困惑。非常感谢!实际上,@运算符是矩阵乘法,不同于高维数组的点积。但问题是元素的求和是根据需要完成的。今天我发布了一个新问题,与。。我想知道你是否知道一种将滑动窗口表示为矩阵乘法的一部分的方法?
>>> x @ y
array([[[ 17.,  53.,  41.,  15.,  12.],
        [ 22.,  70.,  54.,  22.,  20.],
        [ 27.,  87.,  67.,  29.,  28.],
        [ 32., 104.,  80.,  36.,  36.]],

       [[ 57., 189., 145.,  71.,  76.],
        [ 62., 206., 158.,  78.,  84.],
        [ 67., 223., 171.,  85.,  92.],
        [ 72., 240., 184.,  92., 100.]]], dtype=float32)