卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN)当初是为了解决图像识别等问题设计的,但是现在的应用不止在图像方面,也可用于视频、音频、文本等。
下图是一个简单的卷积神经网络的示意图
一般的卷积神经网络由多个卷积层构成,每个卷积层通常会解析如下几个操作。
- 图像通过多个不同的卷积核的滤波,并加偏置,提取出局部特征,每个卷积核会映射出一个新的2D图像
- 将前面卷积核的滤波输出结果,解析非线性的激活函数处理。目前最常见的是使用ReLU。
- 对激活函数的结果在进行池化操作,,目前一般使用的是最大池化,保留最显著的特征,并提升模型的鲁棒性
这几个步骤就构成了最常见的卷积层,目前比较通用的还会加入一层批量归一化
(Batch Normalization)等。在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。
总的来说,卷积神经网络的要点就是局部连接(local connection)、权值共享(weights sharing)、池化层(pooling)的降采样(down-sampling),其中局部连接和权值共享降低了参数量,使训练复杂度大大下降,减轻了过拟合。权值共享赋予了卷积神经网络的平移的容忍性,提高了模型的泛化能力。
TensorFlow实现一个简单的卷积神经网络
1 | import tensorflow as tf |
实现进阶的卷积网络
MNIST玩够了接下来玩点高级的
这里使用数据集为cifar-10
先下载TensorFlow的models库
1 | git clone https://github.com/tensorflow/models.git |
1 | # 导入库 |
- 下载cifar10数据集
1 | cifar10.maybe_download_and_extract() |
下载完数据集之后就可以实现进阶的卷积神经网络了!
这里我简单解释一下思路
先载入数据,并且对数据进行数据增强,然后构建一个卷积神经网络,再测试
网络的结构为:conv1->pool1->norm1->conv2->norm2->pool2->fc3->fc4->logits
下面是完整代码及说明:
1 | import tensorflow as tf |