TensorFlow入门-MNIST进阶-卷积神经网络CNN

TensorFlow入门-MNIST进阶

前言

1、本文将介绍使用TensorFlow获取数据、构建网络、训练网络、测试网络的流程。

2、请先学习MNIST机器学习入门

3、项目构建流程官方文档TensorFlow中文社区-MNIST进阶写得很简洁,并不能让人学习整个流程。建议边看官方文档构建项目。而本文详细解释了构建该项目需要的知识:

  • 介绍卷积神经网络CNN、卷积、卷积核filter、池化pooling、dropout等。
  • 介绍CNN常用结构,CNN的学习过程物理意义
  • 介绍全连接层FC
  • 项目中使用的TensorFlow函数

最后,附上完整代码。能够直接运行。

卷积神经网络CNN

卷积:

利用一个卷积核(矩阵),在图像等(矩阵)上依次做卷积(矩阵对应数据相乘,后最后求和)。再将得到的卷积数值作为新的特征图(矩阵)的值。该操作的目的特征提取。而CNN的目的就是利用大量样本训练出卷积核的权重来进行目标特征挖掘

比如下列两个矩阵,第一个为提取竖线特征卷积核,第二个为提取横线特征的卷积核。

几个重要参数:

  • 卷积核尺寸:长x宽x通道数;
  • 卷积核移动步长(Stride):每一次卷积核在图片上移动的长度,步长约长效率越高,但精度会降低。反之则反。
  • 边缘扩展(Pad):因为卷积核的中间要与图片边缘处像素对齐,所以边缘外的像素可初始化为0。我们需要根据卷积核尺寸来确定pad的大小。

:卷积得出的图片物理意义是什么?

:卷积从低到高,获得的特征层次也就从低到高。

:RGB只有三个通道,为什么卷积核可以有甚至10个通道?

:一个通道构建一个类型的特征,当把多个通道混合后可得到深层信息。如图:

:什么叫权值共享

:因为对每一个卷积核,对图片的各个像素均为相同权值,所以这个就叫权值共享。

卷积后的特征图尺寸计算:

其中:

  • out为输出矩阵的长或宽,in为输入矩阵的长或宽。
  • filter为卷积核的长或宽。

  • pad为在长或宽上添加0的长度。

  • stride为步长。

eg

输入RGB图片为33x33*3,卷积核为5x5x6,步长为3,pad为1。

输出的特征图长宽均为:(33-5+2x1)/3 + 1 = 11,则为11x11的图,通道数为6。

关于卷积神经网络的详细内容:一文让你彻底了解卷积神经网络

池化

对特征图进行压缩,又叫下采样,可以在池化区域内选择max、min或者mean(均值)来代替哪个区域。该操作的目的为降低数据量

卷积神经网络的一般构成

[[卷积(CONV)-激活(Sigmod/RELU)]-池化(POOL)]-全连接-分类或回归

本项目MNIST CNN的网络结构:

CNN学习流程

图片通过被初始化的卷积核一层层计算后,数据将通过前向传播生成特征图。此时我们需要将输出的特征图与训练集的标签建立联系,这样才能反向传播。(神经网络的训练需要按照一个损失函数,根据标签输出值最大,利用数据可微才能反向传播)所以大部分CNN后都接了全连接层和分类层来与标签建立联系。

构建一个多层卷积网络

卷积(Convolution)

作用

根据卷积核,算出原始图像的卷积图像,进行在特征保留的前提下压缩数据量。

函数

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

参数

  • input:输入的待卷积图片,要求为一个张量,shape为[batch, img_height, img_width, img_channel],分别代表图片数量、图片高度、宽度、通道数(灰度图1,RGB图3)

  • filter:卷积核,要求为一个张量,shape为[filter_height, filter_width, img_channel, out_channels],分别代表卷积核高度、宽度、图像通道数、卷积核数量(输出通道数)。

  • strides:卷积时在图像每一纬的步长,这是一个一纬向量,shape为[1, strides, strides, 1],第一位和最后一位必须是1。

  • padding:string类型,值为“SAME”和"VALID",表示卷积是否考虑边界,”SAME“是考虑边界,不足的时候用0去填充周围,”VALID“则不考虑。

  • use_cudnn_on_gpu:bool类型,是否用cudnn加速,默认为true。

返回值

经过卷积的feature map。

池化(Pooling)

作用

最大池化,取池化窗内最大的值保留,进一步在保留特征的前提下压缩数据量。

函数

tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数

  • value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,shape为[batch, img_height, img_width, img_channel]
  • ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1。
  • strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也为[1, strides, strides, 1]
  • padding:string类型,值为“SAME”和"VALID",表示卷积是否考虑边界,”SAME“是考虑边界,不足的时候用0去填充周围,”VALID“则不考虑。

返回值

经过池化的图像,shape仍然是[batch, height, width, channels]这种形式

eg

全连接(Fully Connection)

在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布特征表示”映射到样本标记空间的作用。

在CNN中,全连接层常出现在最后几层,用于对前面设计的特征做加权合。为了提升CNN网络性能,全连接层每个神经元的激励函数一般采用ReLU函数。而全连接层输出的值可以输入softmax逻辑回归进行分类从而执行一个具体的分类任务。对于一个具体的分类任务,选择一个合适的损失函数是十分重要的。通常CNN的全连接层与MLP结构一样,CNN的训练算法也采用BP算法

BP算法(Back Propagation):反向传播算法。

详细内容:对全连接层(fully connected layer)的通俗理解

reshape(x, [-1, 28, 28, 1])中的-1

-1 代表该维度由前面的x的batch决定,因为x代表的图片数可以任意给定的,这里就不能写定。

Dropout

引入Dropout的背景

在机器学习中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。

过拟合表现:训练数据上损失函数小,预测准确率较高,但是在测试数据上损失函数比较大,预测准确率较低。

Dropout发展历程

2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of featu

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值