图像识别与卷积神经网络
徐徐 抱歉选手

图像识别的特征

Property1: 图像的pattern模式是远小于整张图片的,因此生成一个pattern只需要注意图像的一小部分;

Property2:一张图片中不同的区域可能存在相同的pattern;

因此可以使用Convolution卷积。


Property3:对图片采样过后不会改变图像所要表达的东西,因此可以对图像做subsampling减小大小;

因此可以使用Max Pooling。


根据以上三个特性设计出的CNN架构:

(Convolution — Max Pooling) X N times — Faltten — fully connected feedforward network

卷积层(nn.Conv2d卷积层 — nn.BatchNorm2d归一化 — nn.ReLU激活层 — nn.MaxPool2d最大池化层),可叠加很多层,作用是提取出特征。

全链接层(nn.Linear — nn.ReLU — nn.Linear),作用是对提取出的特征进行分类。

AlphaGo能够使用CNN是因为它和图像有相似的特性。

具体实现

图片的表示方式

对于黑白图片,每一个pixel就只有0,1两个取值,是一个二维矩阵。

对于彩色图片,用RGB表示,每个pixel用0~255范围内的三个值表示,是三个二维矩阵。(因此我们的一张图片除了长和宽还拥有了高)

Convolution

依据Property1,为了生成一个pattern,需要使用filter。filter也是一个矩阵,维度需要自己选择。一个filter对应到图片中的某一个子矩阵做内积(对应元素相乘后整体再相加),然后向右移动stride=n个单位元素,从左至右从上至下一次移动。

filter移动的方向,要有具体意义。

比如在文本识别中使用CNN,每一个单词都有一个vector,filter移动的方向一定是多个完整单词的vector的组合的方向,把一个vector拆分多次移动是没有具体语义的。

当一个filter对一张图片完成一次移动之后,会生成一个新的矩阵。当新的矩阵中有相同的元素时,就代表有相同的pattern在这张图中,对应到Property2。

以上过程对每一个滤波器都来一边就得到了对这张图像的Feature Map。

全链接网络和卷积的关系

卷积就是内积之和,相当于两个向量做inner product。

全链接网络中给每个input一个weight然后把它们相加添一个bias得到输出,这个形式和卷积相似。可以把图像的二维矩阵转换成一维向量,按照index/row方向拼接成一个向量。

对应起来就是,filter的作用对象就是这个向量中的某些分量,filter就是全链接网络每一个neuron的weight,内积之后的结果就是该neuron的输出。

重要的是对于每一个filter,他们的weight都是相同的,通过实现shared weights可以实现神经网络较少的参数。

Max Pooling

Feature Map中是每一个filter作用于原图像后得到的Matrix。把该Matrix中的数据均分成几组,每组内进行基础的数学运算(如取平均,取最大),每组的多个数据变成一个数据。目的是为了让图像缩小。

Flatten

flatten就是把Feature Map中多层Matrix拉直成一个vector,每个matrix从左至右从上至下拉直成一个vector,多个matrix前后拼接在一起。

作为输入连接到全连接网络中去。

如何训练

for each filter

定义degree of the activation of the k-th filter为

意思是把图像通过该滤波器之后得到matrix的所有元素的和当作这个滤波器对这张图片响应的大小。

想知道第k个filter的作用是什么,就需要照一张图片作为输入,能够让第k个filter被激活的程度最大。也就是找最大值的问题,可以用gradient descent来求。和之前不知道weight,需要依据输入用梯度下降把参数weightupdate出来不同,现在是把输入的图像当作需要找的参数用gradient descent做update,因为作为weight的filter的是已经固定的。

因此对于每个filter,都可以训练出一个能让该filter的degree of the activation最大化的pattern。注意结果不是一个完整的图片,而可能是某一种纹理,重复出现的pattern。

for fully connected NN

在全连接层的每一个neuron的作用是什么呢?

当找一个图像作为input输入,每一个neuron对这张图片都有不同的输出$a_i$,我们需要找出能够让该neuron输出最大结果的input图像。注意此处的input图像已经开始处理整张图了,而不是图的一小部分。

当找一个图像作为input输入,最终的输出$y_i$要被最大化,确定能够让该output layer输出最大结果的input图像。但是输出的结果可能和人类辨识图像的方式不同;所以需要添加一些constraint(例如L1 Regularization),让输出更容易被人类理解。

  • 本文标题:图像识别与卷积神经网络
  • 本文作者:徐徐
  • 创建时间:2020-11-04 11:16:32
  • 本文链接:https://machacroissant.github.io/2020/11/04/cnn-intro/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论