深度学习-卷积神经网络应用

  • 格式:docx
  • 大小:212.99 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

手写数字识别实验报告

实验目的

利用python和深度学习框架搭建手写数字识别的神经网络,并进行相关的仿真实验,尽可能的提高识别的准确度。

实验环境

python3.6、Pytorch1.4.0、torchvision、MNIST数据库。

环境介绍

Python

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python具有简单易学、明确优雅、开发速度快等特点,在人工智能、数据分析、云计算、网络爬虫等方面有着广泛的应用。

Pytorch

Pytorch是torch的python版本,是由Facebook开源的神经网络框架,专门针对GPU 加速的深度神经网络(DNN)编程。Torch是一个经典的对多维矩阵数据进行操作的张量(tensor)库,在机器学习和其他数学密集型应用有广泛应用。与TensorFlow的静态计算图不同,Pytorch的计算图是动态的,可以根据计算需要实时改变计算图。Pytorch的设计追求最少的封装,尽量避免重复造轮子。Pytorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得Pytorch的源码十分易于阅读。同时Pytorch的灵活性不以速度为代价,在许多评测中,Pytorch的速度表现胜过TensorFlow和Keras等框架。Pytorch提供了完整的文档,循序渐进的指南。

MNIST数据库

MNIST是一个入门级的计算机视觉数据集,它包括6万张28x28的训练样本,1万张测试样本,可以说是CV里的“Hello Word”。它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,图1的标签分别是5,0,4,1。

图1 MNIST图像图片

MNIST的每一张图片包含28×28个像素点。我们可以用一个数组来表示这张图片。如图2所示。

图2 MNIST的数组表示

我们把这个数组展开成一个向量,长度是28×287884。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开。从这个角度来看,MNIST数据集的图片就是在884维向量空间里面的点。

实验内容

实验方案

拟采用RNN网络的变体LSTM、以及全连接层来实现对手写体数字的识别。使用MNIST数据集的训练集对搭建的网络进行训练,损失函数则采用交叉熵函数,采用Adam优化算法对权值进行更新。完成之后使用MNIST数据集的测试集进行测试,查看正确率。

实验准备

数据准备

我们直接使用torchvision中自带的datasets,并使用Pytorch中的DataLoader

函数对训练数据和测试数据分别进行读取。代码如图3所示。

图3 数据准备代码

当然,如果下载过数据集,可以将datasets.MNIST的download参数设置为False即可。

网络构建

接下来对网络进行定义,只要在继承nn.Module的基础上,对相关网络进行构建即可。网络的构建代码如图4所示。其中def __init__()函数,定义了网络的初始化。def forward()函数,则定义了前向传播,后向传播则不需要用户进一步的定义。这也是选择Pytorch作为深度学习框架的原因。

图4 网络构建代码

图中涉及到两个函数,其中一个为torch.nn.LSTM(*args, **kwargs)。函数的各个参数以及意义如表一所示。

表一函数参数及意义

参数意义

input_size输入序列中每一个组成成员的数据大小

hidden_size LSTM输出的隐藏层的数据大小

num_layers LSTM的叠加层数

bias是否偏置

batch_first设为True,则输入输出格式发生改变,batch_size提前

dropout叠加LSTM时,除了最后一层,其他层的输出进行dropout操作bidirectional是否是双向LSTM

函数的输入参数为:input,h_0,c_0。输出参数为output,h_n,c_n。

其中input的格式为(seq_len, batch, input_size),h_0和c_0的格式为(num_layers * num_directions, batch, hidden_size),其中num_directions的值和bidirectional有关。output的格式为(seq_len, batch, num_directions * hidden_size),代表着h_t,h_ n和c_n的格式为(num_layers * num_directions, batch, hidden_size)。

另一个函数为nn.Linear(in_features,out_features,bias7True),Pytorch的nn.Linear()是用于设置网络中的全连接层的,需要注意的是全连接层的输入与输出都是二维张量,一般形状为[batch_size, size],不同于卷积层要求输入输出是四维张量。in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size。out_features指的是输出的二维张量的大小,即输出的二维张量的形状为[batch_size,output_size],当然,它也代表了该全连接层的神经元个数。从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。

损失函数、优化

网络的反向传播主要取决于损失函数以及网络的优化策略,损失函数使用的是交叉熵函数,而优化策略则使用的是Adam优化算法。交叉熵损失函数如式1-1所示。

L=−[ylogŷ+(1−y)log(1−ŷ)](1-1)