TensorFlow学习笔记——LeNet-5(训练自己的数据集)

本文档详细介绍了使用LeNet-5模型训练自定义数据集的过程,包括LeNet-5网络层解析、训练MNIST数据集以及将MNIST数据集转换为TFRecord格式。作者通过四步学习如何应用LeNet-5进行手写字符和印刷数字字母的识别,探讨了LeNet-5的局限性和训练技巧。
摘要由CSDN通过智能技术生成

  在之前的TensorFlow学习笔记——图像识别与卷积神经网络(链接:请点击我)中了解了一下经典的卷积神经网络模型LeNet模型。那其实之前学习了别人的代码实现了LeNet网络对MNIST数据集的训练。而这篇文章是想自己完成LeNet网络来训练自己的数据集。LeNet主要用来进行手写字符的识别与分类,下面记录一下自己学习的过程。

  我的学习步骤分为以下四步:

  • 1,温习LeNet-5的网络层
  • 2,使用LeNet-5训练MNIST数据集
  • 3,使用LeNet-5训练TFRecord格式的MNIST数据集
  • 4,使用LeNet-5训练自己的数据集(TFRecord格式)

  LeNet是出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。那我要训练的是印刷体的数字和字母,可能难点就是字母大小尺寸不一。下面我尝试使用LeNet-5来进行识别。首先学习其网络结构。

1,LeNet-5的网络层解析

  LeNet-5这个网络虽然很小,但是包含了深度学习的基本模块:卷积层,池化层,全连接层。是其他深度学习模型的基础。LeNet网络奠定了现代卷积神经网络的基础。LeNet-5模型总共有7层,这里我们对LeNet-5进行深入分析。

  下图展示了以MNIST数据集为例的LeNet-5模型架构:

   下面再啰嗦一次。

第一层:卷积层(C1层)

  这一层为原始的图像元素,LeNet-5模型接受的输入层大小为32*32*1,第一层卷积层过滤器的尺寸为5*5,深度为6,不使用全0填充,所以这一层的输出的尺寸为32-5+1=28面四个并打印为6,这一个卷积层总共有5*5*1*6+6=156个参数,其中6个未偏置项参数,因为下一层的节点矩阵有28*28*6=4704个结点,每个节点和5*5=25个当前层节点相连,每个神经元对应一个偏置项(这就是5*5+1的原因)所以本卷积层共有(5*5+1)*6*(28*28)=122304个连接。

  那么也就是说,过滤器尺寸为[5, 5],通道为1,深度为6。(除去输入层和输出层,我们有六个特征平面,包括两个卷积层,两个池化层,两个全连接层),特征图有6个,说明6个不同的卷积核,所以深度为6。

第二层:池化层(S2层)

  池化层又叫做下采样层,目的是压缩数据,降低数据维度。

  这一层的输入为第一层的输出,是一个28*28*6的节点矩阵,本层采用的过滤器大小为2*2,长和宽的步长均为2,所以本层的输出矩阵大小为14*14*6

  6个14*14的特征图,每个图中的每个单元与C1特征图中的一个2*2邻域相连接,不重叠。因此S2中每个特征图的大小是C1中特征图大小的1/4。

第三层:卷积层(C3层)

  本层输入的矩阵大小为14*14*6,使用的过滤器大小为5*5,深度为16.本层不使用全0填充,步长为1.本层的输出矩阵大小为10*10*16。按照标准的卷积层,本层应该有5*5*6*16+16=2416个参数,10*10*16*(25+1)=41600个连接。

第四层:池化层(S4层)

  本层的输入矩阵大小为10*10*16,采用的过滤器大小为2*2,步长为2,本层的输出矩阵大小为5*5*16

第五层:全连接层(C5层)

  本层的输入矩阵大小为5*5*16,在LeNet-5模型的论文中将这一层称为卷积层,但是因为过滤器的大小就是5*5,所以和全连接层没有区别,在之后的TensorFlow程序实现中也会将这一层看成全连接层。如果将5*5*16矩阵中的节点拉成一个向量,那么这一层和之前学习的全连接层就是一样的了。

  本层的输出节点个数为120个,总共有5*5*16*120+120=48120个参数。

  这一层还是卷积层,且有120个神经元,可以看做是120个特征图,每张特征图的大小为5*5,每个单元与S4层的全部16个单元的5*5领域相连,因此正好和池化层匹配(S4和C5之间的全连接)。

第六层:全连接层(F6层)

  本层的输入节点个数为120个,输出节点个数为84个,总共参数为120*84+84=10164个。

  之所以有84个单元,是因为输出层的设计,与C5层全相连,F6层计算输入向量和权重向量之间的点积,再加上一个偏置,所以84=7*12

第七层:全连接层(F7层)

  本层的输入节点个数为84个,输出节点为10个,总共参数为84*10+10=850个。

  该层有十个神经元,可以理解这是对于手写体10个数,哪个输出的数大,那个神经元代表的数字就是输出。

1,卷积层tf.nn.conv2d()

  函数类型如下:

1

2

3

4

5

6

7

8

9

10

def conv2d(  # pylint: disable=redefined-builtin,dangerous-default-value

    input,

    filter=None,

    strides=None,

    padding=None,

    use_cudnn_on_gpu=True,

    data_format="NHWC",

    dilations=[1, 1, 1, 1],

    name=None,

    filters=None):

  参数说明:

  • data_format:表示输入的格式,有两种分别为:“NHWC”和“NCHW”,默认为“NHWC”

  • input:输入是一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值