57.1_使用im2col展开
57.1 使用im2col展开
im2col是一个用于展开输入数据的函数,它将输入数据展开为卷积核易于处理的形式。如图57-1所示,它从作为输入数据的三阶张量中取出了应用卷积核的区域(准确来说是从包括批量大小在内的四阶张量中取出应用卷积核的区域)。

图57-1 展开卷积核的应用区域
如图57-1所示,首先取出应用卷积核的区域,然后将取出的区域变为一列,最终将其转换为矩阵(二阶张量)。这就是im2col函数所做的处理。

Chainer的im2col执行了图57-1中第一阶段的处理(不包括reshape部分的处理)。这是因为一旦取出了应用卷积核的区域,后面就可以通过张量积①进行必要的计算。由于我们使用了矩阵的乘积,所以本书需要完成到reshape部分的处理。另外,DeZero中使用的im2col函数有一个名为to_matrix的标志位,只有当这个标志位为True时,图57-1中的reshape部分才会被一并处理。
通过im2col将输入数据展开后,将卷积层的卷积核(过滤器)扩展为一列,然后计算两个矩阵的乘积,具体如图57-2所示。

图57-2 基于输入数据和卷积核的矩阵乘积的计算
如图57-2所示,首先计算矩阵的乘积。这个矩阵乘积的输出也是矩阵(二阶张量)。最后,输出转换为三阶张量(准确来说是包含批量大小在内的四阶张量)。以上就是卷积层的实现流程。

在进行卷积运算时使用im2col展开输入数据后,元素的数量大多会大于原来的数量。因此,使用了im2col的实现需要大量的内存空间。不过由于可以使用矩阵的乘积进行计算,所以矩阵库优化过的函数能发挥很大的作用。