im2col 是一种在卷积神经网络(CNN)中常用的技术,用于将输入图像数据转换为适合卷积操作的矩阵形式。通过这种转换,卷积操作可以被高效地实现为矩阵乘法,从而加速计算。
在传统的卷积操作中,卷积核(滤波器)在输入图像上滑动,逐个计算每个位置的卷积结果。这种操作在计算上非常耗时,尤其是在处理大图像和大卷积核时。im2col 技术通过将输入图像数据重新排列成矩阵形式,使得卷积操作可以利用高效的矩阵乘法来实现。
通过一个具体的例子来理解:
- 输入数据为:
I = np.array([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
],
[
[17, 18, 19, 20],
[21, 22, 23, 24],
[25, 26, 27, 28],
[29, 30, 31, 32]
],
[
[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]
] ]
- 卷积核为:
K = np.array([
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
],
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
],
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
] ])
阅读书籍说是img2col会将输入数据中应用滤波器的区域(3维方块)横向展开为1列。
在本例中输入数据中应用滤波器的区域为:
[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[17, 18, 19], [21, 22, 23],
[25, 26, 27]], [[33, 34, 35], [37, 38, 39], [41, 42, 43]]]
[[[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[18, 19, 20], [22, 23, 24],
[26, 27, 28]], [[34, 35, 36], [38, 39, 40], [42, 43, 44]]]
[[[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[21, 22, 23], [25, 26, 27],
[29, 30, 31]], [[37, 38, 39], [41, 42, 43], [45, 46, 47]]]
[[[6, 7, 8], [10, 11, 12], [14, 15, 16]], [[22, 23, 24], [26, 27,
28], [30, 31, 32]], [[38, 39, 40], [42, 43, 44], [46, 47, 48]]]
按我个人理解是img2col会将输入数据转换为 4*27 的矩阵即
第一行为 1,2,3,5,6,7,9,10,11,17,18,19,21,22,23,25,26,27,33,34,35,37,38,39,41,42,43 即第一次卷积运算所涉及到的输入数据
第二行为 2,3,4,6,7,8,10,11,12,18,19,20,22,23,24,26,27,28,34,35,36,38,39,40,42,43,44 即第二次卷积运算所涉及到的输入数据
第三行,第四行类似就不列举出来了
x2 = np.random.rand(1, 3, 4, 4)
col2 = im2col(x2, 3, 3, stride=1, pad=0)
print(col2.shape)
结果为:
(4, 27)
若是批大小为10,即保存10倍的数据
x2 = np.random.rand(10, 3, 4, 4)
col2 = im2col(x2, 3, 3, stride=1, pad=0)
print(col2.shape)
结果为:
(40, 27)
为什么我会认为是那么展开的呢?
是因为后续书中给出滤波器(卷积核)的展开代码为col_K = K.reshape(FN,-1).T
(FN为滤波器的数量,通过在reshape时指定为-1,reshape函数会自动计算-1维度上的元素个数,以使多维数组的元素个数前后一致。比如,(10, 3, 5, 5)形状的数组的元素个数共有750个,指定reshape(10,-1)后,就会转换成(10, 75)形状的数组)
本例对K进行运行:
col_K = K.reshape(1,-1).T
col_K
可得:
array([[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1],
[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1],
[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1]])
而im2col作用是将输入图像数据转换为适合卷积操作的矩阵形式,故我认为是按上述转换方法展开输入数据(和不展开运算结果一样),这样之后便可将展开后的输入数据与展开后的卷积核进行矩阵乘法(后续还需要将输出大小转换为合适的形状),使得卷积操作可以被高效地实现为矩阵乘法。
标签:10,26,27,22,im2col,卷积,神经网络,输入 From: https://blog.csdn.net/m0_49786943/article/details/143402288