ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[学习笔记]pytorch初体验(搭建自己的神经网络)

2022-07-21 23:42:54  阅读:211  来源: 互联网

标签:loss 初体验 nn 神经网络 pytorch train imgs data targets


好!终于来到正式的深度学习了!

经过几天的学习之后,澡盆算是写出了第一个神经网络,虽然对其中的原理,代码还不算完全了解,但是还是决定记录以下此刻的学习心得。

这里使用官方的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)

 

标签:loss,初体验,nn,神经网络,pytorch,train,imgs,data,targets
来源: https://www.cnblogs.com/ajmddzp/p/16503991.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有