从这里开始,将介绍重中之重,卷积神经网络(Convolutional Neural Network,CNN)。CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。
整体结构
首先要认识的是CNN的整体结构,和之前一样,CNN也由组装层来构建。不过,CNN中额外出现了卷积层(Convolution层)和池化层(Pooling层)。
之前的神经网络中,相邻层的所有神经元之间都有连接,这被称为全连接。
而在CNN中,新增了两个层后,CNN的层的连接顺序是“Convolution - ReLU -(Pooling) ”(Pooling层有时会被省略)。这可以理解为之前的“Affine - ReLU”连接被替换成了“Convolution - ReLU -(Pooling)”连接。
靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affi ne - Softmax”组合。这些都是一般的CNN中比较常见的结构。
卷积层
CNN中出现了一些特有的术语,比如填充、步幅等。此外,各层中传递的数据是有形状的数据(比如,3维数据),这与之前的全连接网络不同。
全连接层存在的问题
在全连接层中,数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是输入时,3维数据直接被拉平到了1维数据。
3维形状中有很多信息,以及隐藏的有值得提取的本质模式,但是因为全连接层忽视形状,将全部输入数据作为相同的神经元处理,所以无法利用与形状相关的信息。
而卷积层可以保持形状不变,当输入数据是图像可以直接以3维数据的形式接收输入,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以正确理解图像等具有“形状”的数据。
另外,CNN中,有时将卷积层的输入输出数据称为特征图。其中,卷积层的输入数据称为输入特征图,输出数据称为输出特征图。这些概念等价。
卷积运算
卷积层的处理称为卷积运算,相当于图像处理的“滤波器运算”。
如图所示,卷积运算对输入数据应用滤波器。滤波器简单来说就是权重,运算的时候对应位置相乘,最后叠算总和,运算次数是以一定间隔滑动窗口。
在全连接的神经网络中,除了权重参数,还存在偏置。CNN中,滤波器的参数就对应之前的权重。包含偏置的卷积运算的处理流如图所示:
填充
即进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0)。填充是卷积运算中经常会用到的处理。如图所示的是“幅度为1的填充”,是指用幅度为1像素的0填充周围。
通过填充,大小为(4,4)的输入数据变成了(6,6)的形状。然后,应用大小为(3,3)的滤波器,生成了大小为(4,4)的输出数据。如果将填充设为2,则输入数据的大小变为(8,8);如果将填充设为3,则大小变为(10,10)。
使用填充主要是为了调整输出的大小。比如,对大小为(4,4)的输入数据应用(3,3)的滤波器时,输出大小变为(2,2),相当于输出大小比输入大小缩小了2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为1,那么相对于输入大小(4,4),输出大小也保持为原来的(4,4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。
步幅
应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,结果如图所示:
对输入大小为(7,7)的数据,以步幅2应用了滤波器。通过将步幅设为2,输出大小变为(3,3)。像这样,步幅可以指定应用滤波器的间隔。
增大步幅,输出大小会变小,而增大填充,输出大小会变大。假设输入大小为(H,W),滤波器大小为(FH,FW),输出大小为
(OH,OW),填充为P,步幅为S。可以得到:
这样就只要代入值就可以计算大小,虽然只要代入值就可以计算输出大小,但是所设定的值必须使公式可以分别除尽。当输出大小无法除尽时(结果是小数时),需要采取报错等对策。根据深度学习的框架的不同,当值无法除尽时,有时会向最接近的整数四舍五入,不进行报错而继续运行。
3维数据的卷积运算
图像是3维数据,除了高、长方向之外,还需要处理通道方向。这纵深方向(通道方向)上特征图增加了。通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。
需要注意的是,在3维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。在这个例子中,输入数据和滤波器的通道数一致,均为3。滤波器大小可以设定为任意值(不过,每个通道的滤波器大小要全部相同)。这个例子中滤波器大小为(3,3),但也可以设定为(2,2)、(1,1)、(5,5)等任意值。再强调一下,通道数只能设定为和输入数据的通道数相同的值(本例中为3)。
结合方块思考
将数据和滤波器结合长方体的方块来考虑,3维数据的卷积运算会很容易理解。把3维数据表示为多维数组时,书写顺序为(channel, height, width)。
在这个例子中,数据输出是1张特征图。所谓1张特征图,换句话说,就是通道数为1的特征图。那么,如果要在通道方向上也拥有多个卷积运算的输出,就需要用到多个滤波器。
通过应用FN个滤波器,输出特征图也生成了FN个。如果将这FN个特征图汇集在一起,就得到了形状为(FN,OH,OW)的方块。将这个方块传给下一层,就是CNN的处理流。
关于卷积运算的滤波器,也必须考虑滤波器的数量。因此,作为4维数据,滤波器的权重数据要按(output_channel, input_ channel, height, width)的顺序书写。
卷积运算中(和全连接层一样)存在偏置。如果进一步追加偏置的加法运算处理,则结果如下面的图所示。
每个通道只有一个偏置。这里,偏置的形状是(FN, 1, 1),滤波器的输出结果的形状是(FN, OH, OW)。这两个方块相加时,要对滤波器的输出结果(FN, OH, OW)按通道加上相同的偏置值。
批处理
神经网络的处理中进行了将输入数据打包的批处理。之前的全连接神经网络的实现也对应了批处理,通过批处理,能够实现处理的高效化和学习时对mini-batch的对应。
如果希望卷积运算也同样对应批处理,为此,需要将在各层间传递的数据保存为4维数据。具体地讲,就是按(batch_num, channel, height, width)的顺序保存数据。
在各个数据的开头添加了批用的维度。像这样,数据作为4维的形状在各层间传递。这里需要注意的是,网络间传递的是4维数据,对这N个数据进行了卷积运算。也就是说,批处理将N次的处理汇总成了1次进行。