python中的Pytorch建模流程是什么
python中的Pytorch建模流程是什么
小编给大家分享一下python中的Pytorch建模流程是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一般我们训练神经网络有以下步骤:
导入库
设置训练参数的初始值
导入数据集并制作数据集
定义神经网络架构
定义训练流程
训练模型
以下,我就将上述步骤使用代码进行注释讲解:
1 导入库
importtorchfromtorchimportnnfromtorch.nnimportfunctionalasFfromtorchimportoptimfromtorch.utils.dataimportDataLoader,DataLoaderimporttorchvisionimporttorchvision.transformsastransforms
2 设置初始值
#学习率lr=0.15#优化算法参数gamma=0.8#每次小批次训练个数bs=128#整体数据循环次数epochs=10
3 导入并制作数据集
本次我们使用FashionMNIST
图像数据集,每个图像是一个28*28的像素数组,共有10个衣物类别,比如连衣裙、运动鞋、包等。
注:初次运行下载需要等待较长时间。
#导入数据集mnist=torchvision.datasets.FashionMNIST(root='./Datastes',train=True,download=True,transform=transforms.ToTensor())#制作数据集batchdata=DataLoader(mnist,batch_size=bs,shuffle=True,drop_last=False)
我们可以对数据进行检查:
forx,yinbatchdata:print(x.shape)print(y.shape)break#torch.Size([128,1,28,28])#torch.Size([128])
可以看到一个batch
中有128个样本,每个样本的维度是1*28*28。
之后我们确定模型的输入维度与输出维度:
#输入的维度input_=mnist.data[0].numel()#784#输出的维度output_=len(mnist.targets.unique())#10
4 定义神经网络架构
先使用一个128个神经元的全连接层,然后用relu激活函数,再将其结果映射到标签的维度,并使用softmax
进行激活。
#定义神经网络架构classModel(nn.Module):def__init__(self,in_features,out_features):super().__init__()self.linear1=nn.Linear(in_features,128,bias=True)self.output=nn.Linear(128,out_features,bias=True)defforward(self,x):x=x.view(-1,28*28)sigma1=torch.relu(self.linear1(x))sigma2=F.log_softmax(self.output(sigma1),dim=-1)returnsigma2
5 定义训练流程
在实际应用中,我们一般会将训练模型部分封装成一个函数,而这个函数可以继续细分为以下几步:
定义损失函数与优化器
完成向前传播
计算损失
反向传播
梯度更新
梯度清零
在此六步核心操作的基础上,我们通常还需要对模型的训练进度、损失值与准确度进行监视。
注释代码如下:
#封装训练模型的函数deffit(net,batchdata,lr,gamma,epochs):#参数:模型架构、数据、学习率、优化算法参数、遍历数据次数#5.1定义损失函数criterion=nn.NLLLoss()#5.1定义优化算法opt=optim.SGD(net.parameters(),lr=lr,momentum=gamma)#监视进度:循环之前,一个样本都没有看过samples=0#监视准确度:循环之前,预测正确的个数为0corrects=0#全数据训练几次forepochinrange(epochs):#对每个batch进行训练forbatch_idx,(x,y)inenumerate(batchdata):#保险起见,将标签转为1维,与样本对齐y=y.view(x.shape[0])#5.2正向传播sigma=net.forward(x)#5.3计算损失loss=criterion(sigma,y)#5.4反向传播loss.backward()#5.5更新梯度opt.step()#5.6梯度清零opt.zero_grad()#监视进度:每训练一个batch,模型见过的数据就会增加x.shape[0]samples+=x.shape[0]#求解准确度:全部判断正确的样本量/已经看过的总样本量#得到预测标签yhat=torch.max(sigma,-1)[1]#将正确的加起来corrects+=torch.sum(yhat==y)#每200个batch和最后结束时,打印模型的进度if(batch_idx+1)%200==0orbatch_idx==(len(batchdata)-1):#监督模型进度print("Epoch{}:[{}/{}{:.0f}%],Loss:{:.6f},Accuracy:{:.6f}".format(epoch+1,samples,epochs*len(batchdata.dataset),100*samples/(epochs*len(batchdata.dataset)),loss.data.item(),float(100.0*corrects/samples)))
6 训练模型
#设置随机种子torch.manual_seed(51)#实例化模型net=Model(input_,output_)#训练模型fit(net,batchdata,lr,gamma,epochs)#Epoch2:[25600/6000004%],Loss:0.524430,Accuracy:69.570312#Epoch2:[51200/6000009%],Loss:0.363422,Accuracy:74.984375#......#Epoch20:[600000/600000100%],Loss:0.284664,Accuracy:85.771835
现在我们已经用Pytorch
训练了最基础的神经网络,并且可以查看其训练成果。大家可以将代码复制进行运行!
虽然没有用到复杂的模型,但是我们在每次建模时的基本思想都是一致的
以上是“python中的Pytorch建模流程是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...
-
Pytorch中model.eval()的作用是什么
Pytorch中model.eval()的作用是什么这篇文章主要介...
-
Python如何利用D3Blocks绘制可动态交互的图表
-
2021年度编程语言揭晓
-
PPython:PHP 拥抱 Python 的利器
-
哪种Python IDE最适合你?这里有一份优缺点列表
-
Python分隔字符串函数用法split
aaa,bbb=str.split(‘&&’,2)第一个参数为分隔符第二个参数是要完成的最大拆分数...
-
php安全编程——python测试实例编写