DL之CNN优化技术:卷积神经网络算法简介之特有的优化技术及其代码实现——im2col技术等技术


热狗淡定
热狗淡定 2022-09-19 15:23:56 67452
分类专栏: 资讯

DL之CNN优化技术:卷积神经网络算法简介之特有的优化技术及其代码实现——im2col技术等技术

目录

im2col技术

im2col简介

im2col代码实现


im2col技术

im2col简介

1、im2col 的示意图

2、将滤波器的应用区域从头开始依次横向展开为1列

3、卷积运算的滤波器处理的细节:将滤波器纵向展开为1 列,并计算和im2col展开的数据的矩阵乘积,最后转换(reshape)为输出数据的大小

4、对输入数据展开池化的应用区域(2×2 的池化的例子)
池化的应用区域按通道单独展开

im2col代码实现

1、im2col技术应用在卷积层、池化层内

  1. CNN中各层间传递的数据是4维数据
  2. x = np.random.rand(10, 1, 28, 28) 随机生成数据,对应10个高为28、长为28、通道为1的数据
  3. print(x.shape)
  4. print(x[0].shape) 访问第1个数据
  5. print(x[0,0] ) 或者x[0][0],访问第1个数据的第1个通道的空间数据,即(1, 28, 28)
  6. 将这个im2col函数作为黑盒(不关心内部实现)使用:是一个10行左右的简单函数,im2col这一便捷函数具有以下接口。
  7. x1 = np.random.rand(1, 3, 7, 7) 批大小为1、通道为3的7*7的数据
  8. col1 = im2col(x1, 5, 5, stride=1, pad=0) im2col会考虑滤波器大小、步幅、填充,将输入数据展开为2维数组。第2维的元素个数均为75。这是滤波器(通道为3、大小为5*5)的元素个数的总和。
  9. print(col1.shape) 批大小为1时,im2col的结果是(9, 75)
  10. x2 = np.random.rand(10, 3, 7, 7) 10个数据
  11. col2 = im2col(x2, 5, 5, stride=1, pad=0)
  12. print(col2.shape) 批大小为10,所以保存了10倍的数据,即(90, 75)。
  13. def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
  14. """
  15. Parameters
  16. ----------
  17. input_data : 由(数据量, 通道, 高, 长)的4维数组构成的输入数据
  18. filter_h : 滤波器的高
  19. filter_w : 滤波器的长
  20. stride : 步幅
  21. pad : 填充
  22. Returns
  23. -------
  24. col : 2维数组
  25. """
  26. N, C, H, W = input_data.shape
  27. out_h = (H + 2*pad - filter_h)//stride + 1
  28. out_w = (W + 2*pad - filter_w)//stride + 1
  29. img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
  30. col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))
  31. for y in range(filter_h):
  32. y_max = y + stride*out_h
  33. for x in range(filter_w):
  34. x_max = x + stride*out_w
  35. col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
  36. col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
  37. return col
  38. 卷积层的实现:使用im2col来实现卷积层,通过使用im2col进行展开,基本上可以像实现全连接层的Affine层一样来实现
  39. (1)、但需要注意,在进行卷积层的反向传播时,必须进行im2col的逆处理,调用col2im函数
  40. class Convolution:
  41. def __init__(self, W, b, stride=1, pad=0): 卷积层的初始化方法将滤波器(权重)、偏置、步幅、填充作为参数接收。
  42. self.W = W
  43. self.b = b
  44. self.stride = stride
  45. self.pad = pad
  46. forward方法:卷积层的反向传播的实现,思路和Affine层类似。
  47. def forward(self, x):
  48. FN, C, FH, FW = self.W.shape 滤波器是4维形状(FN, C, FH, FW),即FilterNumber(滤波器数量)、Channel、FilterHeight、FilterWidth的缩写。
  49. N, C, H, W = x.shape
  50. out_h = int(1 + (H + 2*self.pad - FH) / self.stride)
  51. out_w = int(1 + (W + 2*self.pad - FW) / self.stride)
  52. col = im2col(x, FH, FW, self.stride, self.pad) 用im2col展开输入数据
  53. col_W = self.W.reshape(FN, -1).T 滤波器的展开,用reshape将滤波器展开为2维数组,将各个滤波器的方块纵向展开为1列
  54. 比如,(10, 3, 5, 5)形状的数组的元素个数共有750个,指定reshape(10,-1)后,就会转换成(10, 75)形状的数组。
  55. out = np.dot(col, col_W) + self.b 计算展开后的矩阵的乘积。
  56. out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
  57. transpose方法:将输出大小转换为合适的形状。基于NumPy的transpose会更改多维数组的轴的顺序,它通过指定索引(编号),更改轴的顺序。
  58. 比如:(N,H,W,C)对应索引(0,1,2,3) → (N,C,H,W)对应索引(0,3,1,2)
  59. return out
  60. 池化层的实现
  61. (1)、池化层的实现和卷积层相同,都使用im2col展开输入数据。不过,池化的情况下,在通道方向上是独立的,这一点和卷积层不同,池化的应用区域按通道单独展开。
  62. class Pooling:
  63. def __init__(self, pool_h, pool_w, stride=1, pad=0):
  64. self.pool_h = pool_h
  65. self.pool_w = pool_w
  66. self.stride = stride
  67. self.pad = pad
  68. def forward(self, x):
  69. 池化层的forward方法:展开之后,只需对展开的矩阵求各行的最大值,并转换为合适的形状即可。通过将输入数据展开为容易进行池化的形状,后面的实现就会变得非常简单。
  70. 思路:展开输入数据 → 求各行的最大值 → 转换为合适的输出大小。池化层的backward方法可参考ReLU层的实现中使用的max的反向传播
  71. N, C, H, W = x.shape
  72. out_h = int(1 + (H - self.pool_h) / self.stride)
  73. out_w = int(1 + (W - self.pool_w) / self.stride)
  74. 展开(1)
  75. col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
  76. col = col.reshape(-1, self.pool_h*self.pool_w)
  77. 最大值(2)
  78. out = np.max(col, axis=1) np.max(x, axis=1),就可以在输入x的第1 维的各个轴方向上求最大值。
  79. 转换(3)
  80. out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)
  81. return out

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=3256
赞同 0
评论 0 条
热狗淡定L0
粉丝 0 发表 7 + 关注 私信
上周热门
Kingbase用户权限管理  2020
信刻全自动光盘摆渡系统  1749
信刻国产化智能光盘柜管理系统  1419
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1013
银河麒麟打印带有图像的文档时出错  923
银河麒麟添加打印机时,出现“server-error-internal-error”  714
麒麟系统也能完整体验微信啦!  657
统信桌面专业版【如何查询系统安装时间】  632
统信操作系统各版本介绍  623
统信桌面专业版【全盘安装UOS系统】介绍  597
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!