如何将我们准备好的数据放入模型中呢? Pytorch 给出的答案都在 torchutilsdata 包中。
这个模块中方法并不多,所以让我们先全部列出来看看,看看名字猜猜功能。
一般情况下,使用Dataset和DatasetLoader两个类已经可以完成大部分的数据导入。首先来看Dataset类。
在此对象中,必须重写以下两个方法。
接下来看DataLoader 类
关键的几个参数:
看看实例:
想到sklearn中提供了一些小数据集,使用鸢尾花(iris)的数据集:
数据集就构架完成了,大家也可以通过DataFrame来处理数据。
然后结合DataLoader使用:
pytorch 中 random_split可以将实现sklearn 的 train_test_split类似的功能,大家可能注意到了,在上面的例子中只有训练数据,一般还需要有test set和valid set。
那么我们用random_split来划分数据集吧:
到这里就已经分好了,不过还是建议先通过其他方法提前分好。为了使每次结果都相同,可以设置好seed。
在神经网络优化器中,主要为了优化我们的神经网络,使他在我们的训练过程中快起来,节省时间。在pytorch中提供了 torchoptim方法优化我们的神经网络,torchoptim 是实现各种优化算法的包。最常用的方法都已经支持,接口很常规,所以以后也可以很容易地集成更复杂的方法。
要使用torchoptim,您必须构造一个optimizer对象,这个对象能保存当前的参数状态并且基于计算梯度进行更新。
要构造一个优化器,你必须给他一个包含参数(必须都是variable对象)进行优化,然后可以指定optimizer的参数选项,比如学习率,权重衰减。具体参考torchoptim文档
modelparameters() 是获取model网络的参数
首先sgd的参数有三个,1)opfunc;2)x;3)config;4)state
在普通的情况下 x 的更新 在加上冲量后就是在普通的情况下加上上次更新的x的与mom[0,1]的乘积
Pytorch学习记录-TextMatching文本匹配01
本文是对知乎上 这篇文章 的阅读笔记,查了一下ACL和arXiv历年来关于TextMatching的论文,不知道如何下手,就找找别人的文献综述看看,但是似乎和我想象的不大一样,还是得先实现一个基于深度神经网络的模型才行。
本文基于知乎《深度文本匹配发展总结》,希望作为对之后文献阅读的一个路径。
经典模型是DSSM(2013),来自论文《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》
模型的结构。使用DNN将高维度稀疏文本特征映射到语义空间中的低维密集特征中。第一个隐藏层,具有30k单位,完成word hashing。然后通过多层非线性投影投射word hashing特征。
此DNN中的最后一层神经活动形成了语义空间中的特征。
这个模型的缺点也很明显,没有考虑单词之间的时序联系,相似度匹配用的余弦相似度是一个无参匹配公式。
经典模型是MV-LSTM模型(2015),来自中国科学院《A Deep Architecture for Semantic Matching with Multiple Positional Sentence Representations》
使用Bi-LSTM构建神经网络,对LSTM隐藏层的输出进行匹配,作者认为这个模型能够考察每个单词在不同语境下的含义,然后使用Bi-LSTM处理句子可以实现用变长的窗口逐步解读句子,从多粒度考察句子的效果。
模型中 和 就是输入的句子,首先通过Bi-LSTM获得位置语句表示(表示为虚线橙色框)。然后,k-Max汇集从每个交互矩阵中选择前k个相互作用(在图中表示为蓝色网格)。最后通过多层感知器MLP计算匹配分数。
因为语言的表示有多样性,带参数的公式比不带参数的公式显得更加合理,然后对匹配矩阵进行K-Max的动态池化 *** 作,也就是挑选K个最大的特征,最后采用全连接层进行维度压缩和分类。
来自论文《Text Matching as Image Recognition》
这篇论文从3个角度构建匹配矩阵。更精细的考虑句子间单词的两两关系,构建出3个矩阵进行叠加,把这些矩阵看作是,用卷积神经网络对矩阵进行特征提取。
论文中一共有3种方式构建匹配矩阵,Indicator是一个这个句子的单词是否在另一个句子中出现的指示矩阵,第二个是单词之间的点积,第三个是余弦相似度。三个匹配矩阵叠加再用CNN在矩阵上进行特征提取是这篇整体的思想。
在做实际匹配处理的时候,通常会出现训练集、测试集中出现语料库中没有的单词(OOV问题)。深层次句间交互模型的单词使用Glove预训练和characters卷积拼接作为单词的embedding输入。characters卷积是对每个字母随机赋予一个向量,对单词的所有字母卷积得出特征作为单词的补充特征,这些特征是为了缓解OOV的问题。
2017年IBM《Bilateral Multi-Perspective Matching for Natural Language Sentences》
双边、多角度句子匹配。
文章创新点
模型的整体框架图,输入是预训练的glove embeddings 和 chars embeddings,经过BiLSTM的编码之后,对每一个step的LSTM的输出进行从p到q和从q到p的两两配对,有四种组合方式,然后将所有的结果进行拼接和预测结果。
使用四种匹配方式,匹配公式采用带参数的余弦相似度
2018年纽约大学《Natural Language Inference over Interaction Space》
Interactive Inference Network(IIN,交互式推理网络)
DenseNet可以在经过复杂的深度神经网络之后,还可以很大程度上保留原始特征的信息。(但是为了保留原始特征,现在是不是使用attention机制会更好?)。
模型的整体框架,可以看到输入部分有四个部分的特征(Glove,char,EM(exact match),POS)。这是一个分级多阶段处理的网络,包括5个部分,每个组件都与不同类型的实现兼容。机器学习中可能存在的所有方法,例如决策树,支持向量机和神经网络方法,都可以转移以替换该体系结构中的某些组件。
什么是highway networks?
使用highway network对特征进行编码,这个编码的输出构造一个句子内的attention,(具体就是公式 ,对单词a和单词b的向量和它们的点积进行拼接,再做一个线性的映射得到一个权重参数,经过softmax归一化后成为句内attention的权重参数)然后是参考了LSTM的设计,对highway出来的向量和带了句内交互的attention项的向量用门机制进行了过滤,得到每个单词的向量表示,然后将向量表示两两之间做一个匹配形成匹配矩阵,最后用DenseNet对匹配矩阵进行特征提取。
2018年首尔大学《Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information》
这篇论文的创新点在于:1、采用了固定的glove embedding和可变的glove embedding拼接并提升了模型效果。2、采用stack层级结构的LSTM,在层级结构上加入了DenseNet的思想,将上一层的参数拼接到下一层,一定程度上在长距离的模型中保留了前面的特征信息。3、由于不断的拼接导致参数增多,用autoencoder进行降维,并起到了正则化效果,提升了模型准确率。
怎么感觉模型越来越复杂,而且使用的模型结构和之前看到的不太一样,GEC部分还好理解,为什么文本匹配部分更加庞杂。
一个是在channel粒度上做剪枝,另一个是在神经元Unit维度上做剪枝
1torchquantize_per_tensor()函数的scale和zero_point需要自己设定。
所谓动态是指这个函数torchquantizationquantize_dynamic能自动选择最合适的scale和zero_point。
QuantStub使用的是HistogramObserver,根据输入从[-3,3]的分布,HistogramObserver计算得到min_val、max_val分别是-3、29971,而qmin和qmax又分别是0、127,其schema为per_tensor_affine,因此套用上面的per_tensor_affine逻辑可得:
Post Training Dynamic Quantization,简称为Dynamic Quantization,也就是动态量化,或者叫作Weight-only的量化,是提前把模型中某些op的参数量化为INT8,然后在运行的时候动态的把输入量化为INT8,然后在当前op输出的时候再把结果requantization回到float32类型。动态量化默认只适用于Linear以及RNN的变种。
当对整个模型进行转换时,默认只对以下的op进行转换:
Linear
LSTM
LSTMCell
RNNCell
GRUCell
为啥呢?因为dynamic quantization只是把权重参数进行量化,而这些layer一般参数数量很大,在整个模型中参数量占比极高,因此边际效益高。对其它layer进行dynamic quantization几乎没有实际的意义。
与其介绍post training static quantization是什么,我们不如先来说明下它和dynamic quantization的相同点和区别是什么。相同点就是,都是把网络的权重参数转从float32转换为int8;不同点是,需要把训练集或者和训练集分布类似的数据喂给模型(注意没有反向传播),然后通过每个op输入的分布特点来计算activation的量化参数(scale和zp)——称之为Calibrate(定标)。是的,静态量化包含有activation了,也就是post process,也就是op forward之后的后处理。为什么静态量化需要activation呢?因为静态量化的前向推理过程自(始+1)至(终-1)都是INT计算,activation需要确保一个op的输入符合下一个op的输入。
PyTorch会使用五部曲来完成模型的静态量化:
这一步不是训练。是为了获取数据的分布特点,来更好的计算activation的scale和zp。至少要喂上几百个迭代的数据,
per tensor 和 per channel。Per tensor 是说一个tensor里的所有value按照同一种方式去scale和offset; per channel是对于tensor的某一个维度(通常是channel的维度)上的值按照一种方式去scale和offset,也就是一个tensor里有多种不同的scale和offset的方式(组成一个vector),如此以来,在量化的时候相比per tensor的方式会引入更少的错误。PyTorch目前支持conv2d()、conv3d()、linear()的per channel量化。
往期的文章,我们分享了手写字母的训练与识别
使用EMNIST数据集训练第一个pytorch CNN手写字母识别神经网络
利用pytorch CNN手写字母识别神经网络模型识别手写字母
哪里的文章,我们只是分享了单个字母的识别,如何进行多个字母的识别,其思路与多数字识别类似,首先对进行识别,并进行每个字母的轮廓识别,然后进行字母的识别,识别完成后,直接在上进行多个字母识别结果的备注
Pytorch利用CNN卷积神经网络进行多数字(0-9)识别
根据上期文章的分享,我们搭建一个手写字母识别的神经网络
第一层,我们输入Eminist的数据集,Eminist的数据是一维 2828的,所以第一层的输入(1,28,28),高度为1,设置输出16通道,使用55的卷积核对进行卷积运算,每步移动一格,为了避免尺寸变化,设置pading为2,则经过第一层卷积就输出(16,28,28)数据格式
再经过relu与maxpooling (使用22卷积核)数据输出(16,14,14)
第二层卷积层是简化写法nnConv2d(16, 32, 5, 1, 2)的第一个参数为输入通道数in_channels=16,其第二个参数是输出通道数out_channels=32, # n_filters(输出通道数),第三个参数为卷积核大小,第四个参数为卷积步数,最后一个为pading,此参数为保证输入输出的尺寸大小一致
全连接层,最后使用nnlinear()全连接层进行数据的全连接数据结构(3277,37)以上便是整个卷积神经网络的结构,
大致为:input-卷积-Relu-pooling-卷积
-Relu-pooling-linear-output
卷积神经网络建完后,使用forward()前向传播神经网络进行输入的识别
这里我们使用腐蚀,膨胀 *** 作对进行一下预处理 *** 作,方便神经网络的识别,当然,我们往期的字母数字识别也可以添加此预处理 *** 作,方便神经网络进行预测,提高精度
getContours函数主要是进行中数字区域的区分,把每个数字的坐标检测出来,这样就可以 把每个字母进行CNN卷积神经网络的识别,进而实现多个字母识别的目的
首先,输入一张需要检测的,通过preProccessing预处理与getContours函数获取中的每个字母的轮廓位置
transformsCompose此函数可以 把输入进行pytorch相关的 *** 作,包括转换到torch,灰度空间转换,resize,缩放等等 *** 作
然后加载我们前期训练好的模型
由于神经网络识别完成后,反馈给程序的是字母的 UTF-8编码,我们通过查表来找到对应的字母
字符编码表(UTF-8)
通过上面的 *** 作,我们已经识别出了中包括的字母轮廓,我们遍历每个字母轮廓,获取单个字母数据,这里需要特殊提醒一下 :我们知道EMNIST数据库左右翻转后,又进行了的逆时针旋转90度
这里我们使用cv2flip(imgRes,1)函数,进行的镜像,并使用getRotationMatrix2D函数与warpAffine函数配合来进行的旋转 *** 作,这里就没有PIL来的方便些
然后,我们对数据进行torch转换train_transform(imgRes),并传递给神经网络进行识别
待识别完成后,就可以把结果备注在原始上
class torcnnnParameter()
Parameters 是 Variable 的子类。
参数说明:
class torchnnModule
所有神经网络模块的基类
你的模型也应该继承这个类
Modules 还可以包含其他模块,允许将它们嵌套在树结构中您可以将子模块分配为常规属性:
CLASS torchnnLinear(in_feature,out_feature,bias=True)
此为线性回归公式,也为DNN网络的输出公式,或全连接层的连接公式
参数解释:
apply(function)
递归调用函数应用到每个组成部分以及本身,典型应用为初始化模型参数
modules
返回所有模块的迭代器包括自身重复的模块只迭代一次
named_children()->SonModuleIteration
返回子模块迭代器
named_modules()
返回网络中所有模块迭代器,同时产生模块的名称以及模块本身
重复的模块只返回一次
named_parameters(memo=None,prefix)
返回模块参数的迭代器,同时产生参数的名称和参数本身
parameters()->ModuleParamIteration
这通常被传递个优化器
register_backward_hook(hook)
在模块上注册一个向后的钩子这是用于记录反向传播时的梯度的
每当计算相对于模块输入的梯度时,将调用该钩子挂钩应
具有一下签名:
hook(module,grad_input,grad_output)->Variable or None
register_forward_hook(hook)
在模块上注册一个forward hook,这是记录前向传播时的梯度的
hook(module,grad_input,grad_output)->Variable or None
class torchnnSequential( args)
这是一个时序容器 Modules 会以他们传入的顺序添加到容器中当然也可以传入
一个顺序字典
class torchnnModuleList(modules=None)
将 submodules 保存在一个列表中
append(module) :追加一个给定模块
extend(modules) :追加一个模块列表
class torchnnParameterList(parameters=None)
在列表中保存参数
class torchnnConv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
二维卷积:
输入形式 input[ batch_size, channels, height_1, width_1 ]
以上就是关于Pytorch学习笔记(9) 通过DataSet、DatasetLoader构建模型输入数据集全部的内容,包括:Pytorch学习笔记(9) 通过DataSet、DatasetLoader构建模型输入数据集、以optim.SGD为例介绍pytorch优化器、Pytorch学习记录-TextMatching几个经典模型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)