[学习笔记]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)

 

posted @ 2022-07-21 23:10  阿基米德的澡盆  阅读(66)  评论(0编辑  收藏  举报