P27、28、29 完整的模型套路

  • 一步一步跟着做笔记:

  • 查看数据集的长度:

  • 把写好的这部分,单独放在一个模块里,起名叫做model:

  • 这个模块,稍加改动,比如添加import,再用一个测试的torch.ones( ),整理如下:

  • 输出为:这是一个分类的网络,里面的10,表示在每一个类别里,所出现的概率是多大:

  • 再在train.py中,import刚才写的model,之后,就可以直接实例化了:tudui=TuDui( ):截图略

  • 下面是训练结束,准备写测试的过程,注意,这里的缩进,train和val都是在epoch那个for当中的:

  • Pycharm里面有刷新!

  • 还能在summarywriter里看到:

  • 关于分类问题,有一个accuracy的概念:

  • 对上面的图,要好好解释一下:

  • 首先是 两个输入;

  • 模型,做了一个2分类;

  • 模型输出,对于第一个输入,是类型一的概率是0.1,是第二个的概率是0.2;

  • 对于第二个输入,是类型一“0”的概率是0.3,是第二个的概率是0.4;

  • 那么0.1和0.3都是类型1“1”对应的概率,后两个对应类型2;

  • 然而,对于pred预测,也就是模型输出的结果,两次都是属于“1”,也就是类型二;

  • 那么这个pred是怎么输出为0或者1的呢?有一个argmax的方法,能够计算出这个结果;

  • 跟真实值(target)对比来看,真实值是0和1,并不是pred预测的1和1;

  • 下面就是计算accuracy了:判断pred是否等于真实值target:如果相等,记为true,不相等记为false,再把他们的结果,加在一起,获得计- 算正确的数量,再除以总数量,就是accuracy了。

  • 以下是argmax的计算方式,记录一下:

  • argmax后面的0或者1,代表用什么方向看outputs那个矩阵,1代表横着看:下图的红色数字代表位置0和1,也就是分类结果的0和1:箭头方向是由argmax后面的参数确定的:

  • 下面,查看pred和target位置能对应上的,是哪次输入:用ture和false确定:

  • 再计算sum,true的个数(即对应相等的个数)是多少:

  • 再把这套理论放入整体框架当中:

  • 对于train和eval这两个语句的问题,官方文档说的很清楚了,如果在框架中使用了特殊的层,再调用这两个语句,特殊的层包括,dropout,batchnorm,也就是说,train和eval只对这种层起作用:

  • 这一节的后半段,快速捋了一遍整个网络框架。

  • 虽然有点小error,不过还是可以跑的通:

  • 关于带不带 item()的区别:(12月份这次看视频,没发现视频里讲了这个内容呢)

可以运行的代码-1

# !usr/bin/env python3
# -*- coding:utf-8 -*-"""
author :24nemodate  :2021年07月16日
"""import torch
from torch import nn# 搭建神经网络
class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.model = nn.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 xif __name__ == '__main__':tudui = Tudui()input = torch.ones((64, 3, 32, 32))  # 为什么用ones?前面也是用的ones吗?output = tudui(input)print(output.shape)

可以运行的代码-2

# !usr/bin/env python3
# -*- coding:utf-8 -*-"""
author :24nemodate  :2021年07月16日
"""import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterfrom P27_28_29_model import *# 准备数据集
train_data = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True)# length 长度
train_data_size = len(train_data)
test_data_size = len(test_data)# 如果train_data_size=10, 训练数据集的长度为:10
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))# 利用 DataLoader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)# 创建网络模型
tudui = Tudui()# 损失函数
loss_fn = nn.CrossEntropyLoss()# 优化器
# learning_rate = 0.01
# 1e-2=1 x (10)^(-2) = 1 /100 = 0.01
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)  # 这里的参数,SGD里面的,只要定义两个参数,一个是tudui.parameters()本身,另一个是lr# 设置训练网络的一些参数# 记录训练的次数
total_train_step = 0# 记录测试的次数
total_test_step = 0# 训练的轮数
epoch = 10# 添加tensorboard
writer = SummaryWriter("../logs_train")for i in range(epoch):print("------------第 {} 轮训练开始------------".format(i + 1))# 训练步骤开始tudui.train()  # 这两个层,只对一部分层起作用,比如 dropout层;如果有这些特殊的层,才需要调用这个语句for data in train_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)# 优化器优化模型optimizer.zero_grad()  # 优化器,梯度清零loss.backward()optimizer.step()total_train_step = total_train_step + 1if total_train_step % 100 == 0:print("训练次数:{}, Loss: {}".format(total_train_step, loss.item()))  # 这里用到的 item()方法,有说法的,其实加不加都行,就是输出的形式不一样而已writer.add_scalar("train_loss", loss.item(), total_train_step)  # 这里是不是在画曲线?# 每训练完一轮,进行测试,在测试集上测试,以测试集的损失或者正确率,来评估有没有训练好,测试时,就不要调优了,就是以当前的模型,进行测试,所以不用再使用梯度(with no_grad 那句)# 测试步骤开始tudui.eval()  # 这两个层,只对一部分层起作用,比如 dropout层;如果有这些特殊的层,才需要调用这个语句total_test_loss = 0total_accuracy = 0with torch.no_grad():  # 这样后面就没有梯度了,  测试的过程中,不需要更新参数,所以不需要梯度?for data in test_dataloader:  # 在测试集中,选取数据imgs, targets = dataoutputs = tudui(imgs)  # 分类的问题,是可以这样的,用一个output进行绘制loss = loss_fn(outputs, targets)total_test_loss = total_test_loss + loss.item()  # 为了查看总体数据上的 loss,创建的 total_test_loss,初始值是0accuracy = (outputs.argmax(1) == targets).sum()  # 正确率,这是分类问题中,特有的一种,评价指标,语义分割之类的,不一定非要有这个东西,这里是存疑的,再看。total_accuracy = total_accuracy + accuracyprint("整体测试集上的Loss: {}".format(total_test_loss))print("整体测试集上的正确率: {}".format(total_accuracy / test_data_size))  # 即便是输出了上一行的 loss,也不能很好的表现出效果。# 在分类问题上比较特有,通常使用正确率来表示优劣。因为其他问题,可以可视化地显示在tensorbo中。# 这里在(二)中,讲了很复杂的,没仔细听。这里很有说法,argmax()相关的,有截图在word笔记中。writer.add_scalar("test_loss", total_test_loss, total_test_step)writer.add_scalar("test_accuracy", total_accuracy / test_data_size, total_test_step)total_test_step = total_test_step + 1torch.save(tudui, "tudui_{}.pth".format(i))  # 保存方式一,其实后缀都可以自己取,习惯用 .pth。print("模型已保存")writer.close()

完整目录

  • P6-P7 数据加载
  • P8-9 Tensorboard使用
  • P10-11 Transform的用法
  • P12-13 常用的tranforms
  • P14 torchvision中的数据集的使用
  • P15 dataloader的使用
  • P16 nn.Module
  • P17 卷积
  • P18 卷积层使用
  • P19 池化
  • P20 ReLU
  • P21线性层和其它层
  • P22 squential和小实战
  • P23 loss function
  • P24 优化器
  • P25 pytorch中现有模型
  • P26 网络模型的保存和加载
  • P27、28、29 完整的模型套路
  • P30 GPU加速
  • P31 GPU加速_2
  • P32 完整的模型验证套路
  • P33 github的使用

【PyTorch教程】P27、28、29 完整的模型套路相关推荐

  1. 【PyTorch教程】P32 完整的模型验证套路

    P32 完整的模型验证套路 利用已经训练好的模型,给他一个输入,进行测试: 实际验证过程: -报错处理:在gpu上训练的结果,想要用在cpu电脑上,做test,需要第38行,这一步叫:做映射(map) ...

  2. 【PyTorch教程】P30 GPU加速

    P30 GPU加速 调用 GPU的两种方法: 1.调用 .cuda() 在这三个内容后面,加上 .cuda()方法 下图中,在原来的三种内容上,分别加上.cuda( ),就可以了:让他们的返回值,继续 ...

  3. 【PyTorch教程】P22 squential和小实战

    P22 squential和小实战 Sequential能把网络集成在一起,方便使用: 写一个针对CIFAR10的数据集,写一个分类网络:有一个1024层的,以前的没有说: 在这一集做了这个计算:这里 ...

  4. PyTorch 1.0 中文官方教程:混合前端的 seq2seq 模型部署

    译者:cangyunye 作者: Matthew Inkawhich 本教程将介绍如何是seq2seq模型转换为PyTorch可用的前端混合Torch脚本. 我们要转换的模型是来自于聊天机器人教程 C ...

  5. 【我是土堆 - PyTorch教程】学习随手记(已更新 | 已完结 | 10w字超详细版)

    目录 1. Pytorch环境的配置及安装 如何管理项目环境? 如何看自己电脑cuda版本? 安装Pytorch 2. Python编辑器的选择.安装及配置 PyCharm PyCharm神器 Jup ...

  6. 【Pytorch神经网络理论篇】 35 GaitSet模型:步态识别思路+水平金字塔池化+三元损失

    代码: [Pytorch神经网络实战案例]28 GitSet模型进行步态与身份识别(CASIA-B数据集)_LiBiGor的博客-CSDN博客1 CASIA-B数据集本例使用的是预处理后的CASIA- ...

  7. 目标检测-基于Pytorch实现Yolov3(1)- 搭建模型

    原文地址:https://www.cnblogs.com/jacklu/p/9853599.html 本人前段时间在T厂做了目标检测的项目,对一些目标检测框架也有了一定理解.其中Yolov3速度非常快 ...

  8. 【深度学习】Github上标星1.1W的PyTorch教程,我们给您搬来了

    之前给大家推过TensorFlow的入门教程,大家纷纷表示"搞研究用PyTorch它不香嘛?" 行,那说干就干.我们马上去Github上,给大家搬来了一本开源的PyTorch教程& ...

  9. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

最新文章

  1. 利用html5标签audio在不同客户端下适配播放音频
  2. getCount()和getChildCount()区别
  3. WF 创建 SQL 持久性数据库
  4. oom 如何避免 高并发_【面试】如何避免OOM的发生
  5. DIY小能手|别买电动滑板车了,咱做一台吧
  6. command对象的ExecuteScalar方法
  7. 爱心的数学函数方程_高中数学中的函数与方程思想
  8. iBase4J 分布式开发平台
  9. html基础:基本标签
  10. 激光共聚焦如何选择荧光染料
  11. 通过xml方式根据word模板导出word
  12. error和exception区别,throw和throws
  13. 心态调整--缘起性空
  14. 给你的个人网站领养只萌萌的小仓鼠
  15. 用Python做命令行地址簿
  16. django ajax页面跳转,Django中的AJAX GET请求后重定向
  17. 财务自由之路——我的投资史(2)
  18. c语言ceiling的使用方法,C# Math.Ceiling()用法及代码示例
  19. linux shell查看内存和进程占用内存
  20. View和XenDesktop到底谁更简单 Part II

热门文章

  1. 记一次挖矿病毒应急处置全过程挖矿处置基本操作
  2. 新颖的自我介绍_新颖幽默的自我介绍
  3. 武汉疫情之后,中国即将发生的10大变化!!
  4. NeurIPS 2020 | 基于协同集成与分发的协同显著性目标检测网络
  5. 手机麦克风权限在哪里开启_手机麦克风权限怎么设置
  6. 如何用python简单做一个植物大战僵尸 源码
  7. 计算机专业英语教程(第二版)Chapter 4 Database Fundamentals
  8. OS和Linux笔记
  9. Redis协议spec(翻译)
  10. AMBA协议之AXI协议——中文翻译