• 【示例】如何使用Pytorch堆叠一个神经网络


    本文主要从大致步骤上讲述如何从零开始构建一个网络,仅提供一个思路,具体实现以实际情况为准。

    一、构建网络

    1. class 网络模型(nn.Module):
    2. #----初始化函数----#
    3. #主要用来构建网络单元,类似于类定义
    4. def __init__(self,需要传入的参数列表):
    5. super(网络模型,self).__init__()
    6. #----定义一些相关的神经单元----#
    7. self.backbone=BackBone(...)
    8. #----将神经单元堆叠成网络模块----#
    9. self.block=nn.Sequential(
    10. #将标准模块堆叠
    11. )
    12. self.cls_conv=nn.Conv2d(256,numclass,1,stride=1)
    13. #----前向传递函数----#
    14. #----主要用来实现网络计算,需要按严格的顺序堆叠
    15. def forward(self,x): # x为输入特征
    16. #----堆叠网络
    17. return x

            以类的形式来构造神经网络的主结构,同时可以通过多个类的叠加来区分基干网络等各个部分,但是每个网络类中主要分为两个部分:

            ①类定义:主要负责声明神经模组,如卷积,池化,BN层等;以及参数的注入。同时将一些标准模块堆叠成神经模块(可以构造多个);类似于声明,顺序没有特殊要求(小模块内有顺序)

            ②前向传递函数:将类定义中构造的各模块进行顺序构造。x为传入的特征向量,通过让x按顺序经过各模块来实现网络的构造。类似于实现,需要遵守严格的顺序

    二、网络训练

    1. #----各种参数的定义,预处理----#
    2. # 包括一些超参数,路径,cuda等参数的设定,以及卷积核尺寸等参数的计算
    3. #----网络模型实体化----#
    4. model = 类定义(参数列表)
    5. #----权重的加载/初始化----#
    6. model_dict = model.state_dict() #获取网络结构
    7. pretrained_dict = torch.load(modePath,map_location=device) #从文件中加载权重
    8. for k,v in pretrained_dict.items():
    9. #逐层判断网络结构是否一致
    10. model_dict.update(temp_dict) #上传权重参数
    11. model.load_state_dict(model_dict) #加载权重
    12. #----如有必要,进行cuda型的转换----#
    13. #----数据集的加载----#
    14. dataset =
    15. dataloader =
    16. #----进行训练----#

            由于训练的步数较多,建议将其分为预处理和具体训练分开编写。预处理包括网络的实体化,参数和超参数的处理及填充,数据集的加载和转换

            而训练部分则包括:优化器的实例化和参数的填充训练和验证

            训练是指分步将训练数据从dataloader中取出并执行以下步骤:         

                            ①前向传递

                            ②计算损失函数

                            ③梯度清零

                            ④前向传递

                            ⑤优化参数

            随后将测试集从dataloader中取出按训练同样的步骤进行预测,并计算损失函数 

            训练步骤

    1. loss_fn= #设置交叉函数
    2. learing_rate= #学习率
    3. optimizer = torch.optim #设置优化器
    4. #----开始训练----#
    5. for i in range(epoch):
    6. #----将训练集从dataloader中解包----#
    7. for data in train_loader:
    8. imgs,targes=data
    9. outputs=mynet(imgs) #网络前向传递
    10. loss=loss_fn(outputs,targes) #计算损失函数
    11. optimizer.zero_grad() #梯度清零
    12. loss.backward() #前向传递
    13. optimizer.step() #逐步优化
    14. total_train_step+=1 #训练计数
    15. #----开始测试----#
    16. with torch.no_grad(): #不设置梯度(保证不进行调优)
    17. #----将测试集从dataloader中拆包----#
    18. for data in test_loader:
    19. imgs,targets = data
    20. outputs = mynet(imgs) #进行预测
    21. loss = loss_fn(outputs,targets) #计算损失函数
    22. #----保存每轮的模型----#
    23. #torch.save(mynet,"MyNerNet_Ver{}.pth".format(total_train_step))

    三、进行预测

            进行预测总体和训练类似,但是不需要将数据送入dataset和dataloader中,一般也不需要计算损失函数,仅需要调用网络对数据进行预测即可。是神经网络的应用环节。

    1. def ImgDetect(self,img,count=False,nameClasses=None,outType=0):
    2. #----图片的预处理----#
    3. # 主要包括图像的参数计算,resize,和添加batch_size维度
    4. #----使用网络预测----#
    5. with torch.no_grad():
    6. # 类型转换
    7. imgs = torch.from_numpy(img_data)
    8. # 传入网络并得到结果
    9. Img = self.net(imgs)
    10. # 进行后续处理
    11. #----返回结果----#
    12. return Img
  • 相关阅读:
    Gartner 存储与数据保护技术 Hype Cycle 解读|SmartX 趋势分享
    Nacos 2.2.3 部署到linux
    Redis数据库持久化---RDB(Redis DataBase)概念与实操
    html相关
    OLED12864(SSD1306)驱动代码
    聊一聊Rust的enum
    分组密码--DES详解
    硬盘文件系统系列专题之二 NTFS
    【NI-DAQmx入门】频率测量
    分布式技术之dubbo
  • 原文地址:https://blog.csdn.net/weixin_37878740/article/details/128138493