1. 概述
卷积神经网络,即 CNN (Convolutional Neural Networks)。它不同于传统的神经网络 (下一层的节点与上一层的节点都是有连接的,即是全连接的) 。
常见的CNN结构:LeNet-5、AlexNet、VGGNet等;
其主要应用与图像处理问题中;
与传统神经网络类似,也是层级的网络结构,但是其不同层次中运算形式不同。
2. 网络层次结构
- 输入层 Input Layer
- 卷积计算层 CONV Layer
- ReLU激活层 ReLU Incentive Layer
不同于传统的神经网络,这里激活函数是单独的一层 - 池化层 Pooling Layer
该层主要是压缩,即降低模型的复杂度 - 全连接层 FC Layer
- 归一化层 Batch Normalization Layer
- 输出层 Output Layer
前5个层次是必不可少的,归一化层并不是都有。
3. 相关概念
- 卷积
卷积其实也是一种计算,对于下面这张图,最左边的是原始的一个图片(需要明确的是,不同于人脑,计算机对于图片的识别是一堆的像素值,即矩阵),中间的那个矩阵是 卷积核(也称过滤器,卷积核的大小可以人为设定的)
上边是怎么通过原始的那个3X3的矩阵得到最右边的那个-8的呢?
就是通过两个矩阵对应位置相乘再相加:
通过不断的移动窗口与卷积核进行运算,最终得到一个新的像素矩阵,这个过程就是卷积的过程。
import numpy as np
a = np.array([[0, 0, 0], [0, 1, 1], [0, 1, 2]])
b = np.array([[4, 0, 0], [0, 0, 0], [0, 0, -4]])
result = np.sum(a*b) # 对应相乘再相加
print(result)
# 输出:-8
- 窗口滑动、步长
假如原始的图片是一个55的像素矩阵,然后设定的卷积核是33的矩阵,接着需要像上边计算出-8一样通过卷积核进行计算,就需要对原始的像素矩阵进行一个从左至右从上至下的扫描,这里的窗口是3*3(要与卷积核shape一致)的,这个窗口的移动就是窗口滑动,如下图。
在上图中,窗口是33的,步长是2,窗口滑动就是在55的像素矩阵中,用这个窗口来扫描这个原始的像素矩阵,每次与卷积核进行运算,最终得到2*2的矩阵,这像把原始像素矩阵中9个像素提取成了1个像素。
- 填充值
填充值是什么呢?对于这个概念,也以上面55的原始像素矩阵为例,卷积核设置为22的矩阵,步长设置为2,那么经过窗口滑动会出现如下图的情形:
此时如果不填充数据的话,最后一列和最后一行的像素信息就会丢失,所以通过填充值(一般填充0)进行填充,填充如下图(粉色圆圈为填充值),填充之后再通过窗口滑动就可以完全获取像素信息了:
- 深度
深度主要表示从哪个方面(颜色、形状)关注原始图片的信息。