版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PyTorch深度学习项目教程
二维曲线拟合CURVEFITTING要点:PyTorch基础语法、神经网络基础、多层感知机、正向传播、反向传播、损失函数和优化器
项目背景ProjectBackground要点:回归任务是深度学习的基本任务。问题:工业上很多测量无法直接测量最终结果。例如想获得不规则物体的周长,但是转速和激光点到平台的距离,如何找到最能代表数据特征的曲线?解决:在工业测量和检测任务中,曲线拟合是一个广泛应用的技术。曲线拟合是一种利用已知数据点来推测未知数据点的方法,常常用于分析传感器测量得到的数据,并根据这些数据预测未来的趋势。知识目标KnowledgeObjectives掌握PyTorch张量数据结构及其运算掌握PyTorchGPU计算方法掌握神经网络概念及多层感知机全连接网络的搭建掌握损失函数的选择和迭代优化机制能力目标AbilityGoals能够根据需求自定义PyTorch数据集类能够继承自PyTorch的nn.Module类,编写神经网络模型类的代码能够编写训练代码,包括数据加载、模型训练、损失计算和参数更新等步骤具备对网络模型性能进行初步评估的能力,包括损失函数值、准确率等指标的计算素养目标ProfessionalAttainments具备项目化思维,能够对工作任务进行有效分解,并主动承担相应的任务具备较强的自主学习能力,能够主动探索并应用新的知识和技能具备创新意识,能够针对不同的曲线拟合场景提出新的解决方案能够从实际应用角度出发,思考和探索利用模型进行预测任务的应用场景目录任务1理解曲线拟合需求任务2掌握PyTorch基本语法任务3搭建二维曲线数据集任务4搭建网络结构任务5训练网络模型任务6网络推理任务7模型结构分析任务8拟合更多的二维曲线01任务1理解曲线拟合需求1.1曲线拟合
1.2欠拟合与过拟合欠拟合:如果数据本身不符合拟合曲线的模型,那么拟合结果可能会出现偏差,甚至出现错误过拟合:过于复杂地描述了数据,对当前采样数据表现良好,但是在新的数据点上预测精度下降
02任务2掌握PyTorch基本语法2Tensor基本操作一览2.1创建TensorTensor是指多维张量(数组),对应的,零维张量称之为标量,一维张量称之为矢量,二维张量称之为矩阵importtorch#标量scalar=torch.tensor(1)#向量vector=torch.tensor([1,1])#矩阵matrix=torch.tensor([[1,2],[3,4]])#N维张量tensor_n=torch.rand(3,5,2)
标量向量矩阵2.2索引Tensor#访问向量中的第一个元素print(vector[0])#访问矩阵中的第一行元素print(matrix[0,:])#访问矩阵中的第二列元素print(matrix[:,1])#访问3维张量中的最后一组矩阵中,除了第一行以外的数据print(tensor_n[-1,1:-1,:])索引位置对应为[维数1,维数2,维数3,…,维数n]。其中:“:”为返回该维度的所有值;“m:n”可以返回该从起始位置m到结束位置n-1的数组元素;首个位置的索引编号为0;负数为从尾部计算索引位置,尾部的首个位置索引编号为“-1”2.3形状变换1.维度交换228×228×3(高度×宽度×通道数)的RGB图片转换为3×228×228(通道数×高度×宽度)的变换#模拟一张RGB图像image=torch.randint(0,255,(114,228,3))print(image.shape)#输出为:torch.Size([114,228,3]),分别对应图像的高度、宽度和通道数#将H×W×C转换为C×H×Wimage=image.permute(2,1,0)print(image.shape)#输出为:torch.Size([3,228,114]),分别对应图像的通道数、宽度和高度2.3形状变换2.升降维度可以通过unsqueeze()和squeeze()函数来实现维度的提升和降低#提升维度image=image.unsqueeze(0)print(image.shape)#输出为:torch.Size([1,3,228,114])torch.Size([3,228,114])#降低维度image=image.squeeze(0)print(image.shape)#输出为:torch.Size([3,228,114])2.3形状变换3.改变形状可以通过reshape()和view()函数改变张量的维度data=torch.randn(4,4)print("数据变形前的形状:{}".format(data.shape))#torch.Size([4,4])data=data.view(2,8)print("数据view变形后的形状:{}".format(data.shape))#torch.Size([2,8])data=data.permute(1,0)print("数据维度转换后的形状:{}".format(data.shape))#torch.Size([8,2])data=data.reshape(4,4)#此处不能用view,因其不能处理内存不连续Tensor的结构print("数据reshape变形后的形状:{}".format(data.shape))#torch.Size([4,4])2.4数学运算1.算术运算注意其中的机制:广播以及in_place操作#标量scalar=torch.tensor(1)#向量vector=torch.tensor([1,1])#标量与向量相加,广播print(vector+scalar)#输出为tensor([2,2])print(torch.add(vector,scalar))#输出为tensor([2,2])print(vector.add(scalar))#输出为tensor([2,2])print(vector)#输出为tensor([1,1]),vector本身没有被改变print(vector.add_(scalar))#in_place:当在一个张量tensor上进行操作之后,直接修改了这个tensor本身print(vector)#输出为tensor([2,2]),带有_的函数操作,会对当前值产生影响2.4数学运算2.矩阵运算注意点乘和矩阵乘法a=torch.full([2,2],3,dtype=torch.float)b=torch.ones(2,2)c=a*b#矩阵元素相乘torch.mm(a,b)#矩阵相乘torch.matmul(a,b)#矩阵相乘a@b#矩阵相乘DatatypedtypeTensortype16-bitfloattorch.float16/torch.halftorch.HalfTensor32-bitfloattorch.float32/torch.floattorch.FloatTensor64-bitfloattorch.float64/torch.doubletorch.DoubleTensor8-bitint(u)torch.uint8torch.ByteTensor8-bitint8torch.CharTensor16-bitint16/torch.shorttorch.ShortTensor32-bitint32/torch.IntTensor64-bitint64/torch.longtorch.LongTensorbooleanTorch.boolTorch.BoolTensorPyTorch支持的数据类型tensor.type()返回Tensor类型,如torch.LongTensor等tensor.dtype返回tensor数据自身的类型,如8,torch.long等2.4数学运算3.指数运算pow、sqrt、rsqrt、exp和loga=torch.full([2,2],3)a.pow(2)#平方b=a**2#平方b**(0.5)#开根号torch.sqrt(b.to(torch.double))#开根号torch.rsqrt(b.to(torch.double))#开根号之后求倒数a=torch.exp(torch.ones(2,2))#指数操作torch.log(a)#默认以e为底2.4数学运算4.均值、方差、标准差运算mean、var、stddata=torch.Tensor([1,2,3])#1.求均值dat_mean=torch.mean(data)#=>dat_mean=tensor(2.),均值为2#2.求方差dat_var=torch.var(data)#=>dat_var=tensor(1.),方差为1#3.求标准差data_std=torch.std(data)#=>data_std=tensor(1.),标准差为1
2.5广播机制在进行逐元素操作时,如果两个张量的形状不完全匹配,PyTorch会自动使用广播机制来进行形状的扩展,使得两个张量的形状相容,从而进行逐元素操作张量维度个数不同:将维度较少的张量通过在前面插入长度为1的维度来扩展,直到两个张量具有相同的维度个数张量在某个维度上的长度不匹配:如果其中一个张量在该维度上的长度为1,那么可以通过复制该张量的值来扩展该维度,使得两个张量在该维度上的长度相同
报错:如果以上两个步骤无法使得两个张量的形状匹配,那么会抛出形状不兼容的错误#创建两个形状不同的张量a=torch.tensor([[1,2,3],[4,5,6]])#形状为(2,3)b=torch.tensor([10,20,30])#形状为(3,)#使用广播机制进行逐元素相加c=a+b#广播机制会自动将b扩展为(2,3),使得a和b的形状相同print(c)#输出为tensor([[11,22,33],#[14,25,36]])2.6Tensor和NumPy的转换NumPy是机器学习和数据处理的Python基础库,其操作和Tensor类似,很多第三方库,如OpenCV-Python等,基于NumPy实现了数据预处理、数据增强等操作importnumpyasnpa=torch.tensor([4.0,6])print(a.dtype)#=>torch.float32b=a.numpy()#tensor转换为numpyprint(b.dtype)#=>float32c=torch.from_numpy(b)#numpy转换为tensorprint(c.dtype)#=>torch.float322.7在GPU操作GPU用来执行耗时的密集型计算操作,CPU用来执行调度、任务处理等控制型操作iftorch.cuda.is_available():device=torch.device("cuda")x=torch.randn(2,3)print(x)y=x.to(device)z=torch.randn(2,3,device="cuda")print(y+z)#同时在GPU上才能相加print(z.to("cpu"))#转换回cpu03任务3搭建二维曲线数据集3数据集数据集(Dataset)一组样本的集合(Acollectionofexamples)。样本(Example):
要素:特征、标签数据集的一行。一个样本包含一个或多个特征,此外还可能包含一个标签。标准数据集(StandardDataset)符合一定规范要求的数据集。
classCurveDataSetX2(Dataset):
def__init__(self,start,end,num=100):
#返回大小为(end−start)/step大小的一维张量
#参数1为初始值,参数2为结束值,参数3为步长#unsqueeze()用于实现数据升维,满足PyTorch的数据格式要求
self.x=torch.arange(start,end,
(end-start)*1.0/num,
dtype=torch.float32).unsqueeze(1)
noise=torch.normal(0,0.1,self.x.shape)
self.y=self.x.pow(2)+noise
def__getitem__(self,index):
xi=self.x[index]
yi=self.y[index]
returnxi,yi
def__len__(self):
returnlen(self.x)
@staticmethod
defx2(x):
returnx**2PyTorch在数据集构建上提供了一个Dataset抽象类。任何自定义的数据集都需要继承这个类并实现它的__getitem__()方法和__len__()方法
数据集可视化defvisualizing_data(func,x,y_predict,epoch=0,save=False,savePrefix=''):
y=func(x)
plt.figure()
plt.title('curve(epoch={})'.format(epoch))
plt.plot(x,y,color='red',linewidth=1.0,linestyle='-’,
label='groundtruth')
plt.plot(x,y_predict,color='blue',linewidth=1.0,
linestyle='--',
label='predict')
plt.legend(loc='upperright')
ifsave:
plt.savefig('{0}-epoch-{1}.svg'.format(savePrefix,epoch),format='svg',dpi=300)
plt.show()
classCurveDataSetSinX(Dataset):
def__init__(self,start,end,num=100):
self.x=torch.arange(start,end,
(end-start)*1.0/num,
dtype=torch.float32).unsqueeze(1)
noise=torch.normal(0,0.1,self.x.shape)
self.y=torch.sin(self.x)+noise
def__getitem__(self,index):
xi=self.x[index]
yi=self.y[index]
returnxi,yi
def__len__(self):
returnlen(self.x)
@staticmethod
defsin(x):
returnnp.sin(x)04任务4搭建神经网络4.1神经网络人脑中的生物神经网络计算机中的人工神经网络结构模仿网络模仿神经元神经元连接多层感知机感知机4.1神经网络
4.2激活函数神经网络的线性操作可以进行传导,但多次传导的线性预测还是线性预测,对于复杂分析缺乏拟合能力
为了提高模型的表达能力,在神经元的传导之间,添加了一个非线性函数,并称之为激活函数4.2激活函数
激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中,以下为常见的一些激活函数4.3多层感知机(全连接网络)classMLP(nn.Module):
def__init__(self,input_features=1,output_num=1):
#使用super调用父类中的init函数对网络进行初始化
super(MLP,self).__init__()
#构建网络子模块,存储到MLP的module属性中
self.fc1=nn.Linear(input_features,20)
self.fc2=nn.Linear(20,20)
self.fc3=nn.Linear(20,output_num)
#按照每层网络结构写处forward函数,即如何进行前向传播
defforward(self,x):
out=torch.tanh(self.fc1(x))
out=torch.tanh(self.fc2(out))
out=self.fc3(out)
returnout
网络参数个数
05任务5训练网络模型5.1训练的意义多次的投篮训练为了命中目标#单个数
dumpy_input=torch.tensor(1.0,dtype=torch.float32).unsqueeze(0)
model=MLP()
output=model(dumpy_input)
print(output)
#一组数同时计算其输出
dumpy_input=torch.tensor([1.0,2.0],dtype=torch.float32).unsqueeze(1)
model=MLP()
output=model(dumpy_input)
print(output)
多次的网络训练为了预测结果5.2正向传播网络计算过程是从最里层的括号逐级到外层的,这个计算过程在深度学习中被称为正向传播5.3损失函数损失函数是衡量模型推理和真值之间差异进行量化的函数
5.4反向传播与优化损失函数梯度下降法:优化损失函数到最小
L2Loss的最小点刚好位于函数导数为0的点,而且越接近最小点,函数导数的值越小。因此可以通过求函数导数的方法进行迭代,函数的一阶导数也称为梯度,沿着导数减少的方向逐渐逼近最优点的方法也称为梯度下降法实际开发过程中,由于参数众多梯度下降是多次求导迭代的过程5.4反向传播与优化损失函数
5.5训练迭代过程多次迭代的拟合过程训练使得损失函数值逐渐减小06任务6网络推理6网络推理importtorch
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
model=torch.load('best.pth')
model.eval()
inputs=[-2,-1,0,1,2,18,20]
forinputininputs:
input_tensor=torch.tensor(input,dtype=torch.float32)
outputs=model(input_tensor.to(device).unsqueeze(0))
print(outputs.squeeze(0).cpu().detach().numpy())输入值预测值期望值-23.998024-11.0044901100.079760075010.93614674124.121199641817.6481253242017.461924400在原始观测数据集上增加了噪声,所以预测值的拟合效果接近但不等于我们的期望值需要注意的是,训练数据集的取值范围为[-4,4),超出该取值范围的值,模拟缺乏对应的预测能力回顾人工智能概念:智能=知识+智力,网络仅限于对自己了解的知识进行推理07任务7模型结构分析7.1onnx格式OpenNeuralNetworkExchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的文件格式标准,可以使不同的人工智能框架(如Pytorch,MXNet等)可以采用相同格式存储模型数据并交互7.2onnx格式导出importos
importtorch
model=torch.load(os.path.join('best.pth'))
model.eval()
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
dummy_input=torch.randn(1,1).to(device)
torch.onnx.export(
model,
dummy_input,
'model_x2.onnx',
input_names=['input'],
output_names=['output'],
#dynamic_axes={'input':{0:'batch_size'},'output':{0:'batch_size'}}
)7.3onnx格式查看Netron软件下载地址:
可以利用该软件分析我们的网络模型07任务8拟合更多的二维曲线8.1y=sin(x)拟合train_data=CurveDataSetSinX(start=-4,end=4,num=INPUT_NUM)valid_data=CurveDataSetSinX(start=-4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 作风建设回头看自己在岗位上分析材料
- 中学生新学期计划
- 中秋国旗下讲话稿400字(7篇)
- 影响学生学习成绩的十大坏习惯
- 美的绿色工业案例集 2024
- 龙湾区九年级上学期语文9月学科素养考试卷
- 八年级上学期语文1月期末考试卷
- 冬至的课件教学课件
- 维修小便池合同(2篇)
- 南京航空航天大学《电力系统分析》2022-2023学年期末试卷
- T-CTTS 0019-2023 数字化实验室等级评价规范
- 大学生职业生涯规划机电一体化
- 吴姓的研究报告
- 财务法规知识培训课件
- 骨折修复的生物学原理与细胞治疗方法
- 外贸业务基础知识培训
- 现代化现代性现代主义
- 水幕系统设备维护方案
- 采购计划制定
- 双塔精馏正常操作双塔精馏正常操作
- 振荡指标MACD(波段操作精解)
评论
0/150
提交评论