[学习笔记]pytorch初体验(搭建自己的神经网络)
好!终于来到正式的深度学习了!
经过几天的学习之后,澡盆算是写出了第一个神经网络,虽然对其中的原理,代码还不算完全了解,但是还是决定记录以下此刻的学习心得。
这里使用官方的CIFAR10数据集进行训练
代码比较长,分为几个大块。
库的引入,数据集的导入,网络设计,一些初始化,训练,保存,接下来我们一点一点来看。
1、库的引入
import time
import torch import torchvision from torch import nn from torch.utils.data import DataLoader
# from model import *
这里不再多说,只提一句,最后的model,有时候会把网络部分给放进单独的model.py中,这是就需要引入model,但是这里我就把网络部分放进整个代码中了
2、数据集的引入
pytroch中提供了两种数据集的引入,一种是dataset,一种是dataloader'
train_data=torchvision.datasets.CIFAR10("./dataset_CIFAR10",train=True,transform=torchvision.transforms.ToTensor(),download=True) test_data=torchvision.datasets.CIFAR10("./dataset_CIFAR10",train=False,transform=torchvision.transforms.ToTensor(),download=True) #各个参数的意思:放入./dataset_CIFAR10文件夹中,引入训练集(训练集比测试集大,false就是不引入训练集,也就是测试集),把图片都转化为符合输入的Tensor类型 train_data_size=len(train_data) test_data_size=len(test_data) print(train_data_size) print(test_data_size) #输出一下长度看看,无关紧要 train_dataloader=DataLoader(train_data,batch_size=64) test_dataloader=DataLoader(test_data,batch_size=64)
#从train_data中导入一组64张图片作为一组数据
3、网络的设计
重中之重,但是可读性很好,具体的原理就不再多说(因为我也不明白233)
class Zp(nn.Module):#从nn.Module中继承 def __init__(self): super(Zp, self).__init__() self.model=nn.Sequential(#把以下的网络给封装进Sequential中,精简代码长度 nn.Conv2d(3,32,5,1,2),#一层卷积 nn.MaxPool2d(2),#一层池化 nn.Conv2d(32,32,5,1,2),#一层卷积 nn.MaxPool2d(2),#一层池化 nn.Conv2d(32,64,5,1,2),#一层卷积 nn.MaxPool2d(2),#一层池化 nn.Flatten(),#展平 nn.Linear(64*4*4,64),#线性层 nn.Linear(64,10)#线性层 ) def forward(self, x): x=self.model(x)#输入一个图像进行运算 return x#然后返回
4、一些重要的初始化
zp=Zp() #实例化神经网络 loss_function=nn.CrossEntropyLoss() #定义损失函数 learning_rate=0.01
#定义学习率
optimizer=torch.optim.SGD(zp.parameters(),lr=learning_rate) #定义优化器
total_train_step=0 #训练次数 total_test_step=0 #测试次数 epoch=10
#训练轮数
device = torch.device("cuda")
#第一种利用gpu训练的方法,把设备(device)定义为cuda,如果不用gpu则device中参数为“cpu”
zp=zp.cuda()
loss_function=loss_function.cuda()
#第二种利用gpu训练的方法
5、训练过程&&保存
for i in range(epoch):#每一轮训练 print("~~~~~第{}轮开始:~~~~~~~~~~~",format(i+1))#输出一些东西 for data in train_dataloader:#每一张图片 imgs,targets=data#获取图片和目标 outputs=zp(imgs)#输入神经网络
imgs=imgs.to(device)#两种使用gpu训练的方法
targets=targets.to(device)
# imgs = imgs.cuda()
# targets = targets.cuda()
loss=loss_function(outputs,targets) #优化器优化模型 optimizer.zero_grad()#进行测试前要把梯度设为0 loss.backward()#回调函数 optimizer.step() total_train_step+=1 if total_train_step%100==0: print("训练次数:{},Loss:{}".format(total_train_step,loss)) #测试步骤开始 total_test_loss=0 total_accuracy=0 with torch.no_grad(): imgs,targets=data outputs=zp(imgs)
imgs=imgs.to(device)#同上,两种利用gpu训练的方法
targets=targets.to(device)
# imgs = imgs.cuda()
# targets = targets.cuda()
loss=loss_function(outputs,targets) total_test_loss+=loss.item() accuracy=(outputs.argmax(1)==targets).sum() total_accuracy+=accuracy print("整体测试集上的Loss:{}".format(total_test_loss)) print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
torch.save(zp,"zp_{}.pth".format(i))#保存方式1,保存参数,占空间较大
torch.save(zp.state_dict(),"zp_().pth".format(i))#保存方式2,保存为字典格式,空间较小,推荐方式
至此,整个训练就完成力,剩下的就交给时间就行了(bushi)