【问题标题】:Correctly using the numpy's convolve with an image正确使用 numpy 与图像的卷积
【发布时间】:2019-08-28 00:24:39
【问题描述】:

我正在观看 Andrew Ng's videos on CNN 并希望将 6 x 6 图像与 3 x 3 过滤器进行卷积。我用 numpy 处理这个问题的方式如下:

image = np.ones((6,6))
filter = np.ones((3,3))

convolved = np.convolve(image, filter)

运行这个会报错:

ValueError: object too deep for desired array

我可以从numpy documentation of convolve了解如何正确使用convolve方法。

另外,有没有办法用 numpy 进行跨步卷积?

【问题讨论】:

    标签: python numpy image-processing conv-neural-network convolution


    【解决方案1】:

    np.convolve 函数,不幸的是,仅适用于 1-D 卷积。这就是你得到错误的原因;你需要一个允许你执行二维卷积的函数。

    然而,即使它确实有效,你实际上是操作错误。机器学习中所谓的卷积在数学中更恰当地称为互相关。它们实际上几乎相同。卷积涉及翻转滤波器矩阵,然后执行互相关。

    要解决您的问题,您可以查看scipy.signal.correlate(另外,不要使用filter 作为名称,因为您会影响内置函数):

    from scipy.signal import correlate
    
    image = np.ones((6, 6))
    f = np.ones((3, 3))
    
    correlate(image, f)
    

    输出:

    array([[1., 2., 3., 3., 3., 3., 2., 1.],
           [2., 4., 6., 6., 6., 6., 4., 2.],
           [3., 6., 9., 9., 9., 9., 6., 3.],
           [3., 6., 9., 9., 9., 9., 6., 3.],
           [3., 6., 9., 9., 9., 9., 6., 3.],
           [3., 6., 9., 9., 9., 9., 6., 3.],
           [2., 4., 6., 6., 6., 6., 4., 2.],
           [1., 2., 3., 3., 3., 3., 2., 1.]])
    

    这是完全互相关的标准设置。如果你想删除rely on the zero-padding的元素,传递mode='valid'

    from scipy.signal import correlate
    
    image = np.ones((6, 6))
    f = np.ones((3, 3))
    
    correlate(image, f, mode='valid')
    

    输出:

    array([[9., 9., 9., 9.],
           [9., 9., 9., 9.],
           [9., 9., 9., 9.],
           [9., 9., 9., 9.]])
    

    【讨论】:

    • 我看到输出是一个8x8 矩阵。根据我观看的视频,它必须是 4x4 矩阵。
    • @SuhailGupta 8x8 数组是由全互相关产生的,这是默认的。如果您在机器学习上下文中执行互相关,您可能只需要未填充元素的互相关,您可以使用mode='valid' 获得。我已经编辑了我的答案以反映这一点。
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2021-06-12
    • 2013-09-26
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多