【问题标题】:What is wrong with my multi-channel 1d convolution implemented in numpy (compared with tensorflow)我在 numpy 中实现的多通道 1d 卷积有什么问题(与 tensorflow 相比)
【发布时间】:2019-12-29 16:58:45
【问题描述】:

为了确保我对 TensorFlow 的卷积运算的理解,我在 numpy 中实现了带有多个通道的 conv1d。但是,我得到了不同的结果,我看不到问题所在。与 conv1d 相比,我的实现似乎将重叠值增加了一倍。

代码:

import tensorflow as tf
import numpy as np

# hand-written multi-channel 1D convolution operator

# "Data", dimensions:
# [0]: sample (2 samples)
# [1]: time index (4 indexes)
# [2]: channels (2 channels)
x = np.array([[1,2,3,4],[5,6,7,8]]).T
x = np.array([x, x+8], dtype=np.float32)

# "Filter", a linear kernel to be convolved along axis 1
y = np.array([[[2,8,6,5,7],[3,9,7,2,1]]], dtype=np.float32)

# convolution along axis=1
w1 = np.zeros(x.shape[:2] + y.shape[2:])
for i in range(1,x.shape[1]-1):
    w1[:,i-1:i+2,:] += x[:,i-1:i+2,:] @ y

# check against conv1d:
s = tf.Session()
w2 = s.run(tf.nn.conv1d(x, padding='VALID', filters=y))

但是,这会为 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)

似乎在我的版本中,与 conv1d 相比,重叠索引(中间 2)增加了一倍。但是,我不知道该怎么做,这里的除法似乎不是正确的,因为卷积是一个简单的乘加运算。

任何想法我做错了什么?提前致谢!

编辑:我得到与padding='SAME' 相同的结果。

【问题讨论】:

    标签: python numpy tensorflow convolution


    【解决方案1】:

    错误在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 的结果吗?可能是张量广播规则我没有完全理解。
    • 查看文档docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html。如果 a 是 N 维数组且 b 是 M 维数组(其中 M>=2),则它是 a 的最后一个轴和 b 的倒数第二个轴的 sum product:@ 987654330@
    • 好的,谢谢,确实我刚刚在 numpy 中玩过简单的 1D 操作,我认为我更好地制定了逻辑,额外的维度让我感到困惑。非常感谢!
    • 实际上@运算符是矩阵乘法,与高维数组的点积不同。但问题是元素的总和是根据需要完成的。
    • 我今天发布了一个新问题。我想知道您是否知道将滑动窗口表示为矩阵乘法的一部分的方法? stackoverflow.com/questions/59553815/…
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2018-02-11
    相关资源
    最近更新 更多