im2col:image to column,即“从图像到矩阵”
Part1:为什么要用im2col函数
实现CNN中的卷积运算,若使用for循环:
1.需要几层for循环
2.NumPy存在使用for语句处理后变慢的缺点
(NumPy访问元素最好不使用for语句)
Part2:im2col函数的功能
将输入数据展开以适合滤波器(权重)
对于输入数据,将应用滤波器的区域横向展开为1列,即将数据展开为2维矩阵
Part3:im2col函数
im2col(input_data,filter_h,filter_w,stride=1,pad=0)
- input_data —— 由(数据量,通道,高,长)的4维数组构成的输入数据
- filter_h —— 滤波器的高
- filter_w —— 滤波器的长
- stride —— 步幅
- pad —— 填充
Part3:im2col函数的实现
import sys, os
import numpy as np
sys.path.append(os.pardir)
from common.util import im2col
x1 = np.random.rand(1, 3, 7, 7) # 批大小为1、通道为3的7x7数据
col1 = im2col(x1, 5, 5, stride=1, pad=0)
print(col1.shape) # (9,75)
x2 = np.random.rand(10, 3, 7, 7) # 10个数据
col2 = im2col(x2, 5, 5, stride=1, pad=0)
print(col2.shape) # (90,75)
如上所述的两个im2col函数实现的例子,均为数据形状相同(通道为3的7x7数据)的数据,第一个例子的批大小为1,第二个批大小为10。在两个例子中,第2维的元素个数均为75,这是滤波器(通道为3、大小为5x5)的元素个数的总和。
Q1: 输出矩阵为什么是9和90行的?
A1: 原始矩阵是7x7的,步幅为1,填充为0,所以5x5的卷积核在每个方向要“走”3次,因此3x3=9;
也就是说,当步幅设置为1、填充设置为1时,原始矩阵扩充为9x9的矩阵,这样5x5的卷积核在每个方向要“走”5次,这时候的输出矩阵即为5x5=25行;
Q2: 什么是批?
A2: 这里的批可以类比成图的张数,而通道数可以理解为在每张图片上提取的层数。
斋藤康毅.深度学习原理入门:基于Python的理论与实现[M].北京:人民邮电出版社,2020.