“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
作者:CSDN—Ferris_YU_Q地址:https://blog.csdn.net/hurry0808
本文以CIFAR-10(https://www.cs.toronto.edu/~kriz/cifar.html)为数据集,基于Tensorflow介绍了CNN(卷积神经网络)图像分类模型的构建过程,着重分析了在建模过程中卷积层、池化层、扁平化层、全连接层、输出层的运算机理,以及经过运算后图像尺寸、数据维度等参数的变化情况。01
CIFAR-10数据集介绍 CIFAR-10数据集由60000张彩色图片构成,其中包括50000张训练集图片、10000张测试集图片,每张图片的shape为(32,32,3),即图片尺寸为32*32,通道数为3;所有图片可以被分为10类,包括:- 飞机
- 汽车
- 鸟类
- 猫
- 鹿
- 狗
- 青蛙
- 马
- 船只
- 卡车
![6672e6f98c9b31a684833123e552f785.png](https://img-blog.csdnimg.cn/img_convert/6672e6f98c9b31a684833123e552f785.png)
02
利用Tensorflow构建CNN图像多分类模型 TensorFlow™(https://www.tensorflow.org/?hl=zh-cn) 是一个使用数据流图进行数值计算的开放源代码软件库,其API可在Python、C++、Java、Go、Swift (Early Release)语言中调用,其中Python API是目前最完整且易用的。TensorFlow擅长训练深度神经网络,被认定为是神经网络中最好用的库之一。通过使用TensorFlow我们可以快速入门神经网络, 大大降低了深度学习(也就是深度神经网络)的开发成本和开发难度。Tensorflow使用数据流图进行数值计算,图中的节点代表数学运算,图中的边代表在这些节点之间传递的多维数组(张量)。在使用其构建模型时,先搭建好流图结构——类似于铺好管道,然后再加载数据——向管道中注水,让数据在各节点计算、沿各管道流动;数据在流图中计算、传递时采用多维数组(张量)的形式,因此在Tensorflow中参与计算的均为数组数据类型。
本文使用Tensorflow构建简单的CNN图像多分类模型,其由3个卷积(含激活函数)与池化层、1个扁平层、3个全连接层、1个输出层构成,示意图如下所示:
![a40228c6ebcc2edc4afc657f8468b5a6.png](https://img-blog.csdnimg.cn/img_convert/a40228c6ebcc2edc4afc657f8468b5a6.png)
输入(Input)层
图像数据经过标准化(normalize)、ont-hot编码等预处理后形成的4D张量,本文输入层张量shape为[batch, height, width, channels]。卷积(Convolution)层
卷积层与池化层的 作用 在于:1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度);
2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力。 卷积层计算的过程如 下图 所示:
![0cea551a68e249ec74beba9e07c6afde.png](https://img-blog.csdnimg.cn/img_convert/0cea551a68e249ec74beba9e07c6afde.png)
1. 输入图像的每个通道分别从左上角开始,每次取与卷积核大小相同的部分(称之为patch),与卷积核对应部分分别相乘后再相加(内积运算);如R通道与W0的最上部核(0核)对应元素相乘再相加得到0,G通道与w0的1核做内积运算得到2,B通道与w0的2核做内积运算后得到0;
2. 内积运算得到的结果相加,再加上w0的bias值(b0),得到feature map左上的元素值;即0+2+0+1=3;
3. 按照指定步长移动卷积核,直至输入图像被整个覆盖,得到最终的feature map;本图中步长(stride)为(2,2)。 这里是 动图 :