Python 中使用 Numpy 的卷积层

Prasanna 博士日期

我正在尝试使用 Numpy 在 Python 中实现卷积层。输入是一个形状为 的 4 维数组[N, H, W, C],其中:

  • N: 批量大小
  • H: 图像高度
  • W: 图像宽度
  • C: 通道数

卷积滤波器也是一个形状为 的 4 维数组[F, F, Cin, Cout],其中

  • F:方形过滤器的高度和宽度
  • Cin: 输入通道数 ( Cin = C)
  • Cout: 输出通道数

假设沿所有轴的步幅为 1,并且没有填充,则输出应为 shape 的 4 维数组[N, H - F + 1, W - F + 1, Cout]

我的代码如下:

import numpy as np

def conv2d(image, filter):
  # Height and width of output image
  Hout = image.shape[1] - filter.shape[0] + 1
  Wout = image.shape[2] - filter.shape[1] + 1

  output = np.zeros([image.shape[0], Hout, Wout, filter.shape[3]])

  for n in range(output.shape[0]):
    for i in range(output.shape[1]):
      for j in range(output.shape[2]):
        for cout in range(output.shape[3]):
          output[n,i,j,cout] = np.multiply(image[n, i:i+filter.shape[0], j:j+filter.shape[1], :], filter[:,:,:,cout]).sum()

  return output

这工作得很好,但使用四个 for 循环并且非常慢。有没有更好的方法来使用 Numpy 实现一个接受 4 维输入和过滤器,并返回一个 4 维输出的卷积层?

ZisIsNotZis

这是这种类似keras(?) 卷积的直接实现初学者可能难以理解,因为它使用了很多广播和步幅技巧。

from numpy.lib.stride_tricks import as_strided
def conv2d(a, b):
    a = as_strided(a,(len(a),a.shape[1]-len(b)+1,a.shape[2]-b.shape[1]+1,len(b),b.shape[1],a.shape[3]),a.strides[:3]+a.strides[1:])
    return np.einsum('abcijk,ijkd', a, b[::-1,::-1])

顺便说一句:如果您正在使用非常大的内核进行卷积,请改用基于傅立叶的算法。

编辑:[::-1,::-1]应在的情况下删除了卷积不涉及第一翻转内核(就像什么在tensorflow)。

编辑: np.tensordot(a, b, axes=3)性能比 好得多np.einsum("abcijk,ijkd", a, b),强烈推荐。于是,函数变为:

from numpy.lib.stride_tricks import as_strided

def conv2d(a, b):
  Hout = a.shape[1] - b.shape[0] + 1
  Wout = a.shape[2] - b.shape[1] + 1

  a = as_strided(a, (a.shape[0], Hout, Wout, b.shape[0], b.shape[1], a.shape[3]), a.strides[:3] + a.strides[1:])

  return np.tensordot(a, b, axes=3)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用keras python输出卷积层

来自分类Dev

使用Numpy在卷积层中实现反向传播

来自分类Dev

在神经网络中使用卷积层

来自分类Dev

仅使用NumPy的Python图像卷积

来自分类Dev

使用OpenCL在烤宽面条中使用卷积层

来自分类Dev

在CPU上使用卷积层时出错

来自分类Dev

使用 keras 在各个层上应用卷积

来自分类Dev

在python中仅使用numpy的3层神经网络

来自分类Dev

为什么我们在卷积神经网络的卷积层之后使用激活函数?

来自分类Dev

如何确定在卷积神经网络层中使用的特征图的数量?

来自分类Dev

在卷积层中使用自定义过滤器进行张量流

来自分类Dev

在python函数中使用numpy中的函数

来自分类Dev

在for循环中使用python numpy linspace

来自分类Dev

Python中使用numpy的动态数组

来自分类Dev

在Python中使用Numpy进行填充

来自分类Dev

在Python中使用Numpy进行字节交换

来自分类Dev

在python函数中使用numpy中的函数

来自分类Dev

在for循环中使用python numpy linspace

来自分类Dev

Python Keras如何在将卷积层转换为lstm层后更改输入的大小

来自分类Dev

Python Keras如何将密集层转换为卷积层

来自分类Dev

使用Python和Numpy将RGB图像与custon neighbout内核进行卷积

来自分类Dev

使用numpy进行简单卷积的意外结果

来自分类Dev

使用Numpy在Python中使用浮点舍入错误

来自分类Dev

在python中使用join()合并numpy数组元素

来自分类Dev

在Python中使用Pillow,Numpy导出的RGB图像仅为灰度

来自分类Dev

在numpy中使用python数值求解器求解方程

来自分类Dev

用numpy分隔数组以在python中使用matplotlib进行绘图

来自分类Dev

在Python中使用Pillow,Numpy导出的RGB图像仅为灰度

来自分类Dev

在Python 3.8.0中使用pylab和numpy时出错

Related 相关文章

  1. 1

    使用keras python输出卷积层

  2. 2

    使用Numpy在卷积层中实现反向传播

  3. 3

    在神经网络中使用卷积层

  4. 4

    仅使用NumPy的Python图像卷积

  5. 5

    使用OpenCL在烤宽面条中使用卷积层

  6. 6

    在CPU上使用卷积层时出错

  7. 7

    使用 keras 在各个层上应用卷积

  8. 8

    在python中仅使用numpy的3层神经网络

  9. 9

    为什么我们在卷积神经网络的卷积层之后使用激活函数?

  10. 10

    如何确定在卷积神经网络层中使用的特征图的数量?

  11. 11

    在卷积层中使用自定义过滤器进行张量流

  12. 12

    在python函数中使用numpy中的函数

  13. 13

    在for循环中使用python numpy linspace

  14. 14

    Python中使用numpy的动态数组

  15. 15

    在Python中使用Numpy进行填充

  16. 16

    在Python中使用Numpy进行字节交换

  17. 17

    在python函数中使用numpy中的函数

  18. 18

    在for循环中使用python numpy linspace

  19. 19

    Python Keras如何在将卷积层转换为lstm层后更改输入的大小

  20. 20

    Python Keras如何将密集层转换为卷积层

  21. 21

    使用Python和Numpy将RGB图像与custon neighbout内核进行卷积

  22. 22

    使用numpy进行简单卷积的意外结果

  23. 23

    使用Numpy在Python中使用浮点舍入错误

  24. 24

    在python中使用join()合并numpy数组元素

  25. 25

    在Python中使用Pillow,Numpy导出的RGB图像仅为灰度

  26. 26

    在numpy中使用python数值求解器求解方程

  27. 27

    用numpy分隔数组以在python中使用matplotlib进行绘图

  28. 28

    在Python中使用Pillow,Numpy导出的RGB图像仅为灰度

  29. 29

    在Python 3.8.0中使用pylab和numpy时出错

热门标签

归档