版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据加载与预处理深度学习通常包含数据加载与预处理、构建网络、训练网络和性能评估几个主要的步骤。PyTorch为每个步骤提供了一些相应的函数,使得可以方便快速地进行深度学习。本章以猫狗分类的例子介绍PyTorch深度学习的通用流程。深度学习的通用流程如图所示,分为以下6个步骤。PyTorch深度学习通用流程深度学习的通用流程分为以下6个步骤。数据加载,加载用于训练深度神经网络的数据,使得深度神经网络能够学习到数据中潜在的特征,可以指定从某些特定路径加载数据。数据预处理,对加载的数据进行预处理,使之符合网络的输入要求,如标签格式转换、样本变换等。数据形式的不统一将对模型效果造成较大的影响。构建网络,根据特定的任务使用不同的网络层搭建网络,若网络太简单则无法学习到足够丰富的特征,若网络太复杂则容易过拟合。PyTorch深度学习通用流程编译网络,设置网络训练过程中使用的优化器和损失函数,优化器和损失函数的选择会影响到网络的训练时长、性能等。训练网络,通过不断的迭代和批训练的方法,调整模型中各网络层的参数,减小模型的损失,使得模型的预测值逼近真实值。性能评估,计算网络训练过程中损失和分类精度等与模型对应的评价指标,根据评价指标的变化调整模型从而取得更好的效果。PyTorch深度学习通用流程1数据预处理目录数据加载2加载及预处理猫狗分类数据3数据的形式多种多样,因此读取数据的方法也是多种多样。在一个图像分类的任务中,图像所在的文件夹即为图像的类别标签,则需要把图片和类别标签都读入计算机中,同时还需对图像数据进行张量变换和归一化等预处理。PyTorch框架中提供了一些常用的数据读取和预处理的方法。数据加载与预处理在PyTorch框架中,torchtext.utils包中的类可以用于数据加载。常见加载的数据的方式包括从指定的网址(url)下载数据、加载本地的表格数据和直接读取压缩文件中的数据。数据加载download_from_url类可以从对应网址下载文件并返回所下载文件的存储路径。download_from_url类的语法格式如下。torchtext.utils.download_from_url(url,path=None,root='.data',overwrite=False,hash_value=None,hash_type='sha256')download_from_url类的常用参数及其说明如表所示。数据加载1.从指定的网址下载文件参数名称说明url接收str,表示url文件的网络路径,无默认值root接收str,表示用于存放下载数据文件的文件夹路径,无默认值overwrite接收bool,表示是否覆盖当前文件,默认为Falseunicode_csv_reader类用于读取csv数据文件,unicode_csv_reader类的语法格式如下。其中的参数“unicode_csv_data”指的是csv数据文件。torchtext.utils.unicode_csv_reader(unicode_csv_data,**kwargs)数据加载2.csv文件读取器extract_archive类用于读取压缩文件中的数据。extract_archive类的语法格式如下。torchtext.utils.extract_archive(from_path,to_path=None,overwrite=False)extract_archive类的常用参数及其说明如表所示。数据加载3.读取压缩文件数据参数名称说明from_path接收str,表示数据文件的路径,无默认值to_path接收str,表示提取文件的根路径,无默认值overwrite接收bool,表示是否覆盖当前文件,无默认值1数据预处理目录数据加载2加载及预处理猫狗分类数据3在深度学习的时候,可以事先单独将图片进行清晰度、画质和切割等处理然后存起来以扩充样本,但是这样做效率比较低下,而且不是实时的。接下来介绍如何用PyTorch对数据进行处理。数据预处理分为图像数据预处理和文本数据预处理。数据预处理在PyTorch框架中,处理图像与视频的torchvision库中常用的包及其说明如表所示。图像数据预处理包说明torchvision.datasets提供数据集下载和加载功能,包含若干个常用数据集torchvision.io提供执行IO操作的功能,主要用于读取和写入视频及图像torchvision.models包含用于解决不同任务的网络结构,并提供已预训练过的模型,包括图像分类、像素语义分割、对象检测、实例分割、人物关键点检测和视频分类torchvision.ops主要实现特定用于计算机视觉的运算符torchvision.transforms包含多种常见的图像预处理操作,如随机切割、旋转、数据类型转换、图像到tensor、numpy数组到tensor、tensor到图像等torchvision.utils用于将形似(3×H×W)的张量保存到硬盘中,能够制作图像网络1.组合图像的多种变换处理Compose类可以将多种图像的变换处理组合到一起,Compose类语法格式如下。其中参数“transforms”接收的是由多种变换处理组合成的列表。torchvision.transforms.Compose(transforms)图像数据预处理其中torchvision.transforms中常用的5种图像预处理操作如下。常见的PIL图像包括以下几种模式。L(灰色图像)P(8位彩色图像)I(32位整型灰色图像)F(32位浮点灰色图像)RGB(8位彩色图像)YCbCr(24位彩色图像)RGBA(32位彩色模式)CMYK(32位彩色图像)1(二值图像)图像数据预处理2.
对图像做变换处理在PyTorch框架下能实现对PIL图像和torch张量做变换处理的类较多,此处仅介绍常用的6个类。
CenterCrop类CenterCrop类可以裁剪给定的图像并返回图像的中心部分。如果图像是torch张量,形状将会是[…,H,W],其中省略号“…”是一个任意尺寸。如果输入图像的大小小于期望输出图像的大小,则在输入图像的四周填充0,然后居中裁剪。CenterCrop类的语法格式如下,其中参数“size”指的是图像的期望输出大小。torchvision.transforms.CenterCrop(size)图像数据预处理ColorJitter类ColorJitter类可以随机改变图像的亮度、对比度、饱和度和色调。如果图像是torch张量,形状将会是[…,3,H,W],其中省略号“…”表示任意数量的前导维数。如果图像是PIL图像,则不支持模式1、L、I、F和透明模式。ColorJitter的语法格式如下。torchvision.transforms.ColorJitter(brightness=0,contrast=0,saturation=0,hue=0)图像数据预处理ColorJitter类的常用参数及其说明如表所示。图像数据预处理参数名称说明brightness接收int,表示亮度大小。亮度因子统一从【最大值(0,1-自定义值),1+亮度】或给定的【最小值,最大值】中选择。默认为0contrast接收int,表示对比度大小。对比度因子统一从【最大值(0,1-自定义值),1+对比度】或给定【最小值,最大值】中选择。默认为0saturation接收int,表示饱和度大小。饱和度因子统一从【最大值(0,1-自定义值),1+饱和度】或给定【最小值,最大值】中选择。应该是非负数。默认为0hue接收int,表示色调大小。色调因子统一从【-自定义值,自定义值】或给定的【最小值,最大值】中选择。且有0<=自定义值<0.5或-0.5<=最小值<=最大值<=0.5。默认为0FiveCrop类FiveCrop类可以将图像裁剪成四个角和中心部分。如果图像是torch张量,形状将会是[…,H,W],其中“…”表示任意数量的前导维数。FiveCrop类的语法格式如下,其中参数“size”指的是裁剪图像的期望大小。torchvision.transforms.FiveCrop(size)图像数据预处理Grayscale类Grayscale类可以将图像转换为灰度图像。如果图像是torch张量,形状将会是[…,3,H,W],其中省略号“…”表示任意数量的前导维数。Grayscale类的语法格式如下,其中参数“num_output_channels”表示的是输出图像所需的通道数。torchvision.transforms.Grayscale(num_output_channels=1)图像数据预处理Pad类Pad类可以使用给定的填充值填充图像的边缘区域。如果图像是torch张量,形状将会是[…,H,W],其中省略号“…”表示模式反射和对称的最多2个前导维数。Pad类的语法格式如下。torchvision.transforms.Pad(padding,fill=0,padding_mode='constant')Pad类的常用参数及其说明如表所示。图像数据预处理参数名称说明padding接收int或序列,表示在图像边缘区域填充。如果只提供一个整型int数据,那么填充所有的边缘区域。如果提供了长度为2的序列,那么填充左右边缘或上下边缘区域。如果提供了长度为4的序列,那么填充上下左右四个边缘区域。无默认值fill接收int或元组,表示填充值。如果值是长度为3的元组,那么分别用于填充R、G、B三个通道。此值仅在填充模式为常数时使用。默认为0。Resize类Resize类可以将输入图像调整到指定的尺寸。如果图像是torch张量,形状将会是[…,H,W]形状,其中省略号“…”表示任意数量的前导维数。Resize类的语法格式如下。torchvision.transforms.Resize(size,interpolation=<InterpolationMode.BILINEAR:'bilinear'>)Resize类的常用参数及其说明如表所示。图像数据预处理参数名称说明size接收int,表示期望输出大小,无默认值interpolation接收str,表示插入式模式。默认为InterpolationMode.BILINEARPyTorch不仅可设置对图片的变换处理,还可以对这些变换处理进行随机选择、组合,数据增强更灵活。RandomChoice类RandomChoice类从接收的变换处理列表中随机选取的单个变换处理对图像进行变换。RandomChoice类的语法格式如下。RandomChoice类的参数说明与Compose类一致。torchvision.transforms.RandomChoice(transforms)图像数据预处理3.
对变换处理列表做处理RandomOrder类RandomOrder类随机打乱接收的变换处理列表中的变换处理。RandomOrder类的语法格式如下。RandomOrder类的参数说明与Compose类一致。torchvision.transforms.RandomOrder(transforms)图像数据预处理对图像数据做变换处理操作的类较多,此处介绍常用的两个类。LinearTransformation类LinearTransformation类用平方变换矩阵和离线计算的均值向量变换图像数据。LinearTransformation类的语法格式如下。torchvision.transforms.LinearTransformation(transformation_matrix,mean_vector)LinearTransformation类的常用参数及其说明如表所示。图像数据预处理4.
对图像数据做变换处理参数名称说明transformation_matrix接收str,表示变换矩阵,输入格式为[DxD]。无默认值mean_vector接收str,平均向量,输入格式为[D]。无默认值Normalize类Normalize类用均值和标准差对图像数据进行归一化处理。Normalize类的语法格式如下。torchvision.transforms.Normalize(mean,std,inplace=False)Normalize类的常用参数及其说明如表所示。图像数据预处理参数名称说明mean接收int或float,表示每个通道的均值。无默认值std接收int或float,表示每个通道的标准差。无默认值由于直接读取图像得到的数据的类型与输入网络的数据类型不对应,因此需要对数据的格式进行转换。ToPILImage类ToPILImage类将tensor类型或ndarray类型的数据转换为PILImage类型的数据。ToPILImage类的语法格式如下,其中参数“mode”指的是输入数据的颜色空间和像素深度。torchvision.transforms.ToPILImage(mode=None)图像数据预处理5.
格式转换变换处理ToTensor类ToTensor类将PILImage类型或ndarray类型的数据转换为tensor类型的数据,并且归一化至[0,1]。ToTensor类的语法格式如下。torchvision.transforms.ToTensor如果PIL图像属于L、P、I、F、RGB、YCbCr、RGBA、CMYK和1这些形式之一,那么将[0,255]范围内的PIL图像或numpy.ndarray(H×W×C)转换为[0.0,1.0]范围内的浮点张量(C×H×W)。在其他情况下,不按比例返回张量。图像数据预处理1.划分训练集和测试集SogouNews类可以对PyTorch框架自带的数据集进行训练集测试集的划分,SogouNews类的语法格式如下。torchtext.datasets.SogouNews(root='.data',split=('train','test'))SogouNews类的常用参数及其说明如表所示。文本数据预处理在PyTorch框架中可以利用trochtext库中的相关类对文本数据进行数据预处理。参数名称说明root接收str,表示保存数据集的目录,无默认值split接收str,表示划分数据集和测试集的标准,无默认值WikiText2类也可以对PyTorch框架自带的数据集进行训练集、验证集和测试集的划分。WikiText2类的语法格式如下。torchtext.datasets.WikiText2(root='.data',split=('train','valid','test'))WikiText2类仅能对三个PyTorch自带数据集进行操作,分别是WikiText-2数据集、WikiText103数据集和PennTreebank数据集。文本数据预处理Vocab类可以定义用于计算字段的词汇表对象。Vocab类的语法格式如下。torchtext.vocab.Vocab(counter,max_size=None,min_freq=1,pecials=('<unk>','<pad>'),vectors=None,unk_init=None,vectors_cache=None,specials_first=True)文本数据预处理2.创建词汇表Vocab类的常用参数及其说明如表所示。文本数据预处理参数名称说明counter接收float,表示保存数据中每个值的频率,无默认值max_size接收int,表示最大词汇容量,无默认值min_freq接收int,表示能保存进词汇表的最低频率,默认为1specials接收str,表示将加在词汇表前面的特殊标记的列表,默认值为('<unk>','<pad>')vectors接收int,表示可用的预训练向量,无默认值vectors_cache接收str,表示缓存向量的目录,无默认值generate_sp_model类用于构建句子生成器,generate_sp_model类的语法格式如下。torchtext.data.functional.generate_sp_model(filename,vocab_size=20000,model_type='unigram',model_prefix='m_user')generate_sp_model类的常用参数及其说明如表所示。文本数据预处理3.构建句子生成器参数名称说明filename接收str,表示用于构建句子生成器的数据文件,无默认值vocab_size接收int,表示词汇量,默认为20000model_type接收str,表示生成句子网络的类型,包括unigram、bpe、char、word,默认为unigrammodel_prefix接收str,表示数据文件和词汇表的前缀保存形式,默认为m_userload_sp_model类用于加载数据文件的句子生成器。load_sp_model类的语法格式如下,其中参数“SPM”指的是保存句子生成器的文件路径。torchtext.data.functional.load_sp_model(SPM)文本数据预处理4.
加载句子生成器sentencepiece_numericalizer类用于建立基于文本句子的数字映射。sentencepiece_numericalizer类的语法格式如下,其中参数“sp_model”指的是句子生成器。torchtext.data.functional.sentencepiece_numericalizer(sp_model)文本数据预处理5.
构建句子计数器sentencepiece_tokenizer类用于标记文本句子中各个词汇,sentencepiece_tokenizer类的语法格式如下。输入文本句子,将输出句子中所有成分。torchtext.data.functional.sentencepiece_tokenizer(sp_model)文本数据预处理6.构建句子标记器simple_space_split类用于对句子进行分词处理,并输出句子中的各个词汇。simple_space_split类的语法格式如下。torchtext.data.functional.simple_space_split(iterator)文本数据预处理7.构建句子分词器1数据预处理目录数据加载2加载及预处理猫狗分类数据3本小节将以猫狗数据集为例进行演示数据加载和预处理。猫狗数据集的训练集包含25000张图片,其中猫图有12500张,狗图有12500张。测试集包含400张图片,其中猫图有200张,狗图有200张。定义路径读取函数,用于得到一个包含所有图片文件名(包含路径)和标签(狗1猫0)的列表。现有数据的命名都是有序号的,训练集中数据编号为0~499,测试集中数据编号为1000~1200,因此可以根据这个规律获取训练集图像路径的列表。data1对象是一个包含五百个文件名以及标签的列表。find_label函数用于判断标签是dog(狗)还是cat(猫),dog返回1,cat返回0。在定义了路径读取和标签判读函数后,调用四次路径读取和标签判读函数并输入不同的参数,即可获取到四个列表(训练集中的猫、训练集中的狗、测试集中的猫、测试集中的狗)。加载及预处理猫狗分类数据使用PIL包的Image类读取图片。重写PyTorch的Dataset类,其中__getitem__()方法用于读取数据集中数据,并对数据进行变换操作。使用Compose函数组合多种变换操作得到transform对象。transform对象中包含的变换处理操作如下。transforms.CenterCrop(224),从图像中心开始裁剪图像,224为裁剪大小。transforms.Resize((224,224)),重新定义图像大小。transforms.ToTensor(),很重要的一步,将图像数据转为Tensor类型。transforms.Normalize(mean=(0.5,0.5,0.5),std=(0.5,0.5,0.5)),归一化。train_data以及test_data即为最终需要得到的数据。接下来将介绍常用的网络层以及构建网络的方法。加载及预处理猫狗分类数据构建网络构建网络是深度学习最重要的一个步骤。若网络太简单则无法学习到足够丰富的特征,若网络太复杂则容易过拟合。而且,对不同的数据,要选择合适的网络结构才能取得较好的结果。构建网络1激活函数目录常用的网络构建方法2构建基于CNN的猫狗分类网络3在深度学习中,构建网络通常是搭建一个完整的神经网络结构。神经网络(NeuralNetworks)是一种应用类似于大脑神经突触连接的结构进行信息处理的算法。神经网络已经被用于解决分类、回归等问题,同时被运用在机器视觉、语音识别等应用领域上。神经网络是由具有适应性的简单单元组成的广泛并行互连网络,它的结构能够模拟生物神经系统对真实世界的交互反应。常用的网络构建方法一个简单的神经元结构如图所示。在图中,、和表示权重,表示偏置项,表示激活函数,、和是神经元的输入值,输出值。常用的网络构建方法将多个神经元按一定的层次结构连接起来,即可得到一个神经网络。使用神经网络需要确定网络连接的拓扑结构、神经元的特征和学习规则等。常见的神经网络的层级结构如图所示,每层神经元与下一层的神经元全部互连,同层之间神经元不存在连接关系。图为简单的全连接神经网络,其中输入层神经元接收信号,最终输出结果由输出层神经元输出。常用的网络构建方法隐含层是指除了输入、输出层以外的其他层,是模型的黑箱部分,通常可解释性较差。值得注意的是,如果单个隐含层网络不能满足实际生产需求,那么可在网络中设置多个隐含层。深度学习神经网络中的常见的网络层有卷积层、池化层、正则化层、归一化层和全连接层。网络层的先后顺序通常是,卷积层优先构造,池化层放置在卷积层之后,正则化层和归一化层放置在整个网络中间偏后的位置,全连接层放置在网络的后端或多个卷积层后。在PyTorch框架中,常用的构建网络的方法有继承Module类和使用Sequential容器。常用的网络构建方法Module类是PyTorch框架提供的一个基类,在搭建神经网络时候可以通过继承Module类,使得搭建网络的过程变得简单。继承Module类构建网络,其中__init__()方法初始化了网络中需要使用的网络层,完全相同的网络层可以仅初始化一次,但多次进行调用,forward()方法用于设置网络中数据的传播,并返回网络的输出。从Layer列中可以查看所构建网络的结构,从OutputShape列中可以查看每层网络输出数据的维度。从Param列中可以查看每层网络的参数个数。继承Module类构建网络Sequential是一个有序的容器,网络层将按照在传入构造器的顺序依次被添加到计算图中执行,使用Sequential容器构建网络。同时以神经网络模块为元素的有序字典也可以作为Sequential容器的传入参数。使用Sequential容器构建网络1激活函数目录常用的网络构建方法2构建基于CNN的猫狗分类网络3在神经网络中,全连接层只是对上层输入进行线性变换,而多个线性变换的叠加仍然是一个线性变换,即含有多个全连接层的神经网络与仅含输出层的单层神经网络等价。解决问题的一个方法是,在全连接层后增加一个非线性的变换,将非线性变换后的结果作为下一个全连接层的输入。这个非线性函数被称为激活函数(ActivationFunction),神经网络可以逼近任意函数的能力与激活函数的使用不可分割。常见的激活函数有ReLU、Sigmoid、Tanh和Softmax等。激活函数线性整流函数(RectifiedLinearUnit,ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数,通常指代以斜坡函数及其变种为代表的非线性函数。ReLU函数的表达式如式所示,其中x为神经元的输入值。激活函数1.ReLU函数ReLU函数的几何表达如图所示。由图可知,当输入为正时,ReLU函数的输入与输出均始终保持线性关系,当输入趋于正无穷时,输出也趋于正无穷;当输入为负值时,输出为0。激活函数ReLU函数的优点如下。反向传播时,可以避免梯度消失。使一部分神经元的输出为0,形成稀疏网络,减少了参数的相互依存关系,缓解了过拟合问题的发生。求导简单,整个过程的计算量节省很多。ReLU的缺点如下。左侧神经元为0,导致部分神经元死亡,不再更新。输出非负,所有参数的更新方向都相同,可能导致梯度下降时出现震荡。激活函数relu类的语法格式如下。torch.nn.functional.relu(input,inplace=False)relu类的常用参数说明如表所示。激活函数参数名称说明input接收tensor数据,表示输入值,无默认值inplace接收bool,表示计算softmax的维度数,默认值为FalseLeakyReLU激活函数是ReLU激活函数的变式,主要是为了修复ReLU激活函数中负轴为0导致的问题。LeakyReLU激活函数的负轴保留了非常小的常数,使得输入信息小于0时,信息得到保留。LeakyReLU函数的表达式如式所示,其中x为神经元的输入值,α为非负的小数。激活函数2.LeakyReLU函数LeakyReLU函数的几何表达如图所示。leaky_relu类的语法格式如下,leaky_relu类的常用参数说明与torch.nn.functional.relu类一致。torch.nn.functional.leaky_relu(input,negative_slope=0.01,inplace=False)激活函数Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0到1之间。Sigmoid函数的表达式如式所示,其中x为神经元的输入值。激活函数3.Sigmoid函数Sigmoid函数的几何表达如图所示。由图可知,纵坐标的范围在0~1的区间内,随着横坐标值从左往右增大,曲线的纵坐标值从0无限趋近于1,表示Sigmoid函数的输出范围是0到1,即对每个神经元的输出进行了归一化。由于概率的取值范围是0到1,因此Sigmoid函数非常适合用在以预测概率作为输出的模型中。激活函数Sigmoid优点如下。Sigmoid的取值范围为(0,1),而且是单调递增,比较容易优化。Sigmoid求导比较容易,可以直接推导得出。Sigmoid缺点如下。Sigmoid函数收敛比较缓慢。由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合,由上页图可知,当x趋于无穷大时,会使导数趋于0。sigmoid类的语法格式如下,其中参数“input”表示输入值。torch.nn.functional.sigmoid(input)激活函数Tanh函数是双曲正切激活函数。Tanh函数的表达式如式所示,其中x为神经元的输入值。激活函数4.Tanh函数Tanh函数的几何表达如图所示。由图可知,当横坐标值趋于负无穷时,纵坐标值无限趋近于-1。当横坐标值趋于正无穷时,纵坐标值无限趋近于1。当输入的绝对值大于5时,输出几乎是平滑的并且梯度较小,不利于权重更新。激活函数Tanh函数跟Sigmoid函数的区别在于输出间隔,Tanh的输出间隔为2,并且整个函数以0为中心。在一般的二元分类问题中,Tanh函数常用于隐藏层,而Sigmoid函数常用于输出层。但这并不是固定的,需要根据特定问题进行调整。激活函数Tanh优点如下。函数输出以(0,0)为中心。收敛速度相对于Sigmoid更快。Tanh缺点如下。Tanh并没有解决Sigmoid梯度消失的问题。含有较多的幂运算,增加计算所需的时间。tanh类的语法格式如下,其中参数“input”表示输入值。torch.nn.functional.tanh(input)激活函数Softmax函数常在神经网络输出层充当激活函数,将输出层的值映射到(0,1)区间,将神经元输出构造成概率分布,用于多分类问题中,Softmax激活函数映射值越大,则真实类别可能性越大。Softmax函数的表达式如式所示,其中i为输入神经元的第i个元素。
由式可知,Softmax函数为指数形式的函数,且映射后的数值受映射前所有数值的影响。激活函数5.Softmax函数Softmax优点如下。指数函数求导的时候比较方便,加快模型的训练。能够将输出值拉开距离,使不同类间的区别更明显。Softmax缺点如下。通过Softmax函数计算得到的数值有可能会变得过大从而导致溢出。输入均为负时,可能会出现梯度为0。激活函数oftmax类的语法格式如下。torch.nn.functional.softmax(input,dim=None,_stacklevel=3,dtype=None)softmax类的常用参数及其说明如表所示。激活函数参数名称说明input接收tensor数据,表示输入值,无默认值dim接收int,表示计算softmax的维度数,无默认值dtype接收str,表示所需的数据类型的返回张量,无默认值1激活函数目录常用的网络构建方法2构建基于CNN的猫狗分类网络3搭建3种不同的CNN网络进行测试,首先搭建一个经典CNN网络,包含两个卷积层、两个池化层、一个全连接层和一个丢弃层。丢弃层的存在是为了防止过拟合,可以视情况保留或删除。其次是搭建一个简单的VGG网络,包含8个卷积层、8个池化层、1个全连接层和1个丢弃层。一般而言,VGG网络需要至少3个全连接层。但是考虑到全连接层有大量的参数,为了减小电脑GPU的负荷,所以仅保留了一个全连接层。并在每一个卷积层后都配置一个最大池化层,用于降低后续计算的参数量。经过调整后的神经网络虽然在结构上发生了较大的变化,但是降低了运行代码所需的计算机资源。最后搭建一个简单的AlexNet网络,包含5个卷积层、5个池化层、1个全连接层和1个丢弃层。构建基于CNN的猫狗分类网络编译网络1优化器目录损失函数2编译基于CNN的猫狗分类网络3网络的训练可以理解为拟合输入数据到真实标签的一个映射,通过某个函数计算真实标签和预测标签之间差异,该差异即为网络的损失Loss,计算差异的函数即为损失函数。网络的损失是衡量网络好坏的一个主要指标。同时,损失Loss必须是标量,因为向量无法直接比较大小(向量本身需要通过范数等标量来比较)。损失函数L1范数损失(L1Loss)计算预测值和真实值之差的绝对值的平均数,常用于回归问题,L1Loss类的语法格式如下。torch.nn.L1Loss(size_average=None,reduce=None,reduction='mean’)L1Loss类的常用参数及其说明如表所示。损失函数1.L1Loss参数名称说明size_average接收bool或optional,表示尺寸平均化,默认为Truereduce接收bool或optional,表示缩减值,默认为Truereduction接收str或optional,表示指定应用于输出值的缩减方式,默认值为mean平滑L1范数损失(SmoothL1Loss)在预测值和真实值之差的绝对值小于1时,取绝对值的平方的平均数;当绝对值大于1时,取L1范数损失,常用于回归问题。SmoothL1Loss类的语法格式如下。torch.nn.SmoothL1Loss(size_average=None,reduce=None,reduction='mean',beta=1.0)SmoothL1Loss类常用的参数及其说明与L1Loss类的参数及其说明一致。损失函数2.SmoothL1Loss平方损失函数(MSELoss)计算预测值和真实值之间的平方和的平均数,常用于回归问题。torch.nn.MSELoss类的语法格式如下。torch.nn.MSELoss(size_average=None,reduce=None,reduction='mean')MSELoss类的常用参数及其说明与L1Loss类的参数及其说明一致。损失函数3.MSELoss交叉熵损失函数(CrossEntropyLoss)刻画的是实际输出(概率)与期望输出(概率)分布的距离,交叉熵的值越小,两个概率分布就越接近,常用于分类问题中。CrossEntropyLoss类的语法格式如下。torch.nn.CrossEntropyLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='mean’)损失函数4.CrossEntropyLossCrossEntropyLoss类的常用的参数及其说明如表所示。损失函数参数名称说明weight接收tensor数据,表示权重,无默认值size_average接收bool或optional,表示尺寸平均化,默认为Trueignore_index接收int,表示一个被忽略的目标值,该目标值对输入梯度没有贡献,默认值为100二分类交叉熵损失函数(BCELoss)是交叉熵损失的二进制版,常用于二分类问题。BCELoss类的语法格式如下。torch.nn.BCELoss(weight=None,size_average=None,reduce=None,reduction='mean')BCELoss类常用的参数及其说明与CrossEntropyLoss常用的参数及其说明一致。损失函数5.BCELoss带逻辑回归的二分类交叉熵损失函数(BCEWithLogitsLoss)将Sigmoid激活函数集成到BCELoss类中,可以让计算数值更稳定,常用于分类问题。BCEWithLogitsLoss类的语法格式如下。torch.nn.BCEWithLogitsLoss(weight=None,size_average=None,reduce=None,reduction='mean',pos_weight=None)BCEWithLogitsLoss类的常用参数及其说明与torch.nn.L1Loss类的常用参数及其说明一致。损失函数6.BCEWithLogitsLoss负对数似然损失函数(NLLLoss)的输入值是经过LogSoftmax函数处理后的逻辑回归值,常用于分类问题。NLLLoss类的语法格式如下。torch.nn.NLLLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='mean')NLLLoss类的常用参数及其说明与CrossEntropyLoss类的常用参数及其说明一致。损失函数7.NLLLoss泊松分布的负对数似然损失(PoissonNLLLoss)是输出的分类服从泊松分布时采用的损失函数,常用于分类问题。PoissonNLLLoss类的语法格式如下。torch.nn.PoissonNLLLoss(log_input=True,full=False,size_average=None,eps=1e-08,reduce=None,reduction='mean')PoissonNLLLoss类的常用参数及其说明如表所示。损失函数8.PoissonNLLLoss参数名称说明log_input接收bool或optional,表示按照何种公式计算损失,如果设置为True,损失将会按照公式exp(input)–target×input来计算,如果设置为False,损失将会按照input–target×log(input+eps)计算。默认值为Truefull接收bool或optional,表示是否计算全部的损失,默认值为FalseKL散度损失(KLDivLoss)计算输入值和标签之间的KL散度。KL散度可用于衡量不同的连续分布之间的距离,在连续的输出分布的空间上(离散采样)上进行回归时有不错的效果,常用于回归问题。KLDivLoss类的语法格式如下。torch.nn.KLDivLoss(size_average=None,reduce=None,reduction='mean',log_target=False)KLDivLoss类的常用参数及其说明与L1Loss类的常用参数及其说明一致。损失函数9.KLDivLoss连接时序分类损失(CTCLoss)可以对没有对齐的数据进行自动对齐,主要用在没有事先对齐的序列化数据训练上,如语音识别。CTCLoss类的语法格式如下。torch.nn.CTCLoss(blank=0,reduction='mean',zero_infinity=False)CTCLoss类的常用参数及其说明如表所示。损失函数10.CTCLoss参数名称说明blank接收int,表示空白标签数量,默认为0reduction接收str,表示指定应用于输出值的缩减方式,默认为meanzero_infinity接收bool,表示是否将无限损失和相关梯度定为零,默认为False1优化器目录损失函数2编译基于CNN的猫狗分类网络3在神经网络网络中,神经元的参数(权重和偏差)在训练神经网络时起到非常重要的作用,主要用于计算预测值。如果网络的损失较大,那么可以认为网络的表现较差。网络的训练即是通过改变网络中的参数实现改变输出预测值的过程。毫无方向地改变参数并不能使得网络变好,因此需要某种优化策略和算法,更新和计算影响网络训练和网络输出的参数,使输出的预测值逼近真实值,这便是优化器的由来。优化器Optimizer优化器是所有优化器的基类,是最原始的优化器,适用范围广,没有很强的网络针对性。Optimizer类的语法格式如下,其中参数“params”是用于优化或定义参数组的参数表,参数“defaults”取默认值即可。torch.optim.Optimizer(params,defaults)优化器1.Optimizer随机梯度下降(StochasticGradientDescent,SGD)随机计算训练集中的小批量(minibatches)的损失用于更新参数,从而解决训练数据的样本量很大时,计算总的损失求解梯度的计算量很大的问题。SGD类的语法格式如下。torch.optim.SGD(params,lr=<requiredparameter>,momentum=0,dampening=0,weight_decay=0,nesterov=False)优化器2.SGDSGD类的常用的参数及其说明如表所示。优化器参数名称说明params接收iterable,表示用于优化或定义参数组的参数表,无默认值lr接收float,表示学习率,默认为<requiredparameter>momentum接收float或optional,表示动量因子,默认为0随机平均梯度下降(AveragedStochasticGradientDescent,ASGD)是随时间记录参数矢量平均值的随机梯度下降。ASGD类的语法格式如下。torch.optim.ASGD(params,lr=0.01,lambd=0.0001,alpha=0.75,t0=1000000.0,weight_decay=0)优化器3.ASGDASGD类常用的参数及其说明如表所示。优化器参数名称说明params接收iterable,表示用于优化或定义参数组的参数表,无默认值lr接收float,表示学习率,默认为0.01lambd接收float,表示衰变项,默认为0.0001alpha接收float,表示ETA更新的功率,默认为0.75t0接收float,表示开始进行平均的点,默认为1000000.0weight_decay接收int,表示权重衰减,默认为0自适应梯度算法(AdaptiveGradientAlgorithm,AdaGrad)属于逐参数适应学习率的优化器,针对不同的参数或不同的训练阶段使用不同的学习率。AdaGrad优化器的一个缺点是,在深度学习中,单调的学习率被证明会过于激进且过早停止学习。AdaGrad的语法格式如下。torch.optim.Adagrad(params,lr=0.01,lr_decay=0,weight_decay=0,initial_accumulator_value=0)优化器4.AdaGradAdagrad类的常用参数及其说明如表所示。优化器参数名称说明lr接收float或optional,表示学习率,默认值为0.01lr_decay接收float,表示学习率衰减,默认值为0weight_decay接收float,表示权重衰减,默认值为0均方根传播(RootMeanSquarePropagation,RMSProp)优化器是基于梯度的大小对每个权重的学习率进行修改。与AdaGrad优化器的学习率的修改方式不同,RMSProp不会让学习率单调变小,其优点在于,消除梯度下降过程中的摆动加速梯度下降的过程。RMSProp类的语法格式如下。torch.optim.RMSprop(params,lr=0.01,alpha=0.99,eps=1e-08,weight_decay=0,momentum=0,centered=False)优化器5.RMSPropRMSProp类的常用参数及其说明如表所示。优化器参数名称说明lr接收float和optional,表示学习率,默认值为0.01momentum接收int,表示动量因子,默认值为0alpha接收float,表示平滑常数,默认值为0.99eps接收float或optional,表示添加到分母以提高数值稳定性的术语,默认值为1e-8centered接收bool,表示是否对梯度进行归一化,如果为真,则计算中心的RMSProp,通过估计其方差对梯度进行归一化。默认值为Falseweight_decay接收float或optional,表示权重衰减,默认值为0自适应矩估计(AdaptiveMomentEstimation,Adam)优化器在RMSProp优化器的基础上计算梯度的指数加权平均值。Adam类的语法格式如下。torch.optim.Adam(params,lr=0.001,betas=(0.9,0.999),eps=1e-08,weight_decay=0,amsgrad=False)优化器6.AdamAdam类的常用参数及其说明如表所示。优化器参数名称说明lr接收float或optional,表示学习率,默认为0.001betas接收元组或optional,表示用于计算梯度及其平方的运行平均值的系数,默认为(0.9,0.999)eps接收float或optional,表示添加到分母以提高数值稳定性的术语,默认为1e-8weight_decay接收float或optional,表示权重衰减,默认为0amsgrad接收boolean或optional,表示是否使用AMSGrad的变种,默认为False1优化器目录损失函数2编译基于CNN的猫狗分类网络3在2.2.3节中,已经搭建了3个基于CNN的猫狗分类网络的框架,本小节以3个网络中的VGG网络为例进行相应的编译,网络编译的过程如下。编译网络前需要先实例化网络。选择优化器以及优化算法。本任务的优化器选择用Adam,另外,经过控制变量法调试,在Epoch=3的情况下,学习率lr在等于0.00004的时效果较好。学习率的选择是一个不断尝试的过程,常用的学习率为0.1、0.01、0.001,以此类推,可以一个数量级接着一个数量级地进行尝试,直到找到较优的学习率。编译基于CNN的猫狗分类网络选择损失函数。在猫狗分类任务中可以选择交叉熵损失函数。将数据转成能被GPU计算的类型。在编译网络时需要注意,训练数据和实例化的网络必须位于一个相同的处理器,如CPU或GPU。配置梯度清零、前向传播、计算误差、反向传播以及更新参数。编译基于CNN的猫狗分类网络训练网络1批训练目录迭代次数2训练基于CNN的猫狗分类网络3网络构建和编译完成后,即可将训练样本传入网络进行训练。在训练网络过程中,可通过调整迭代次数、批训练等参数的值,对网络训练过程进行优化。训练网络时,通过设置epochs参数调整训练中网络的迭代次数,epochs的值为多少就表示所有训练样本被传入网络训练多少轮(如epochs为1,表示所有训练样本被传入网络训练一轮)。当设置的迭代次数的值过小时,训练得到的模型效果较差,可以适当增加迭代次数的大小,从而优化模型的效果。但是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年大型医院建设施工合同范本包工不包料
- 2024年度婚姻财产鉴定合同
- 2024工程项目借款合同
- 2024工地防水材料买卖合同书
- 2024年度基于BIM的建筑物流管理服务合同
- 合同履约的会计分录-记账实操
- 2024年商标许可使用权合同
- 全民节约用水倡议书范文(6篇)
- 2024年度建筑施工质量安全合同
- 2024年城市轨道建设特许经营协议
- 旅游景区物业管理方案
- 侵权告知函(盗用图片)
- 猪、牛、家禽屠宰冷链加工一体化项目可行性研究报告
- 诺贝尔生理学或医学奖史话 知到智慧树网课答案
- 太阳能光热转换和热储存技术
- AQ 2043-2012 石油行业安全生产标准化 陆上采气实施规范
- 天府国际生物城的规划方案
- MOOC 国际交流学术英文写作-湖南大学 中国大学慕课答案
- 健康科普宣传进社区活动方案
- 2024年(初级)游泳救生员理论考试题库(含A、B卷)
- 项目投资测算培训课件
评论
0/150
提交评论