由浅入深,走进深度学习(3)

今天分享的学习内容主要是完整构建神经网络,

包括:训练、测试、损失函数呀,计算精度呀,等等~

用到的框架就是torch

在这里我也是对自己做一个学习记录,如果不符合大家的口味,大家划走就可以啦

可能没有什么文字或者原理上的讲解,基本上都是代码,但是我还是想说,如果基础不是很好,认认真真敲一遍,会有不一样的感受!

正片开始:

目录

内容一:神经网络优化器

内容二:完整模型训练

内容三:GPU训练

内容四:测试模型


# 损失函数反向传播
# 反向传播通过梯度来更新参数,使得loss损失最小
import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size = 64, drop_last=True)class net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xmodel = net()
print(model)
loss = nn.CrossEntropyLoss()
epoch = 0for data in dataloader:imgs, targets = dataoutput = model(imgs) result = loss(output, targets) # 计算实际输出与目标输出的差距result.backward()  # 计算出来的 loss 值有 backward 方法属性,反向传播来计算每个节点的更新的参数。这里查看网络的属性 grad 梯度属性刚开始没有,反向传播计算出来后才有,后面优化器会利用梯度优化网络参数。      # print(result)# print(epoch)epoch = epoch + 1
内容一:神经网络优化器
import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size = 64, drop_last=True)class net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xmodel = net()
print(model)
loss = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), lr = 0.01)for epoch in range(5):running_loss = 0.0for data in dataloader:imgs, targets = dataoutput = model(imgs) result_loss = loss(output, targets) # 计算实际输出与目标输出的差距optim.zero_grad() # 梯度清零result_loss.backward() # 反向传播 计算损失函数的梯度optim.step() # 根据梯度 对网络的参数进行调试running_loss = running_loss + result_lossprint(result_loss)  # 对这一轮所有误差的总和import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size = 64, drop_last=True)class net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xmodel = net()
print(model)
loss = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), lr = 0.01)
scheduler = torch.optim.lr_scheduler.StepLR(optim, step_size = 5, gamma = 0.1) # 每过 step_size 更新一次优化器,更新是学习率为原来的学习率的的 0.1 倍    for epoch in range(5):running_loss = 0.0for data in dataloader:imgs, targets = dataoutput = model(imgs) result_loss = loss(output, targets) # 计算实际输出与目标输出的差距optim.zero_grad() # 梯度清零result_loss.backward() # 反向传播 计算损失函数的梯度optim.step() # 根据梯度 对网络的参数进行调试scheduler.step() # 学习率太小了,所以20个轮次后,相当于没走多少running_loss = running_loss + result_lossprint(result_loss)  # 对这一轮所有误差的总和
内容二:完整模型训练
import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size = 64, drop_last=True)class net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xmodel = net()
print(model)
loss = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), lr = 0.01)
scheduler = torch.optim.lr_scheduler.StepLR(optim, step_size = 5, gamma = 0.1) # 每过 step_size 更新一次优化器,更新是学习率为原来的学习率的的 0.1 倍    for epoch in range(5):running_loss = 0.0for data in dataloader:imgs, targets = dataoutput = model(imgs) result_loss = loss(output, targets) # 计算实际输出与目标输出的差距optim.zero_grad() # 梯度清零result_loss.backward() # 反向传播 计算损失函数的梯度optim.step() # 根据梯度 对网络的参数进行调试scheduler.step() # 学习率太小了,所以20个轮次后,相当于没走多少running_loss = running_loss + result_lossprint(result_loss)  # 对这一轮所有误差的总和import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoaderclass net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xtrain_data = torchvision.datasets.CIFAR10("dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) 
test_data = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True) train_dataloader = DataLoader(train_data, batch_size = 64)
test_dataloader = DataLoader(test_data, batch_size = 64)model = net()loss_fn = nn.CrossEntropyLoss()optimer = torch.optim.SGD(model.parameters(), lr = 0.01)total_train_step = 0
total_test_step = 0epoch = 3for i in range(epoch):print('--------the {} epoch for train--------'.format(i+1))model.train()  # 当网络中有dropout层、batchnorm层时,这些层能起作用for data in train_dataloader:imgs, targets = datatrain_result = model(imgs)loss_train = loss_fn(train_result, targets)# 优化器模型调优optimer.zero_grad()loss_train.backward()optimer.step()total_train_step = total_train_step + 1if total_train_step % 100 == 0:print('the current step eopch {}, the train loss is {}'.format(total_train_step, loss_train))  # 方式一  获得Loss# print('the current train eopch {}, the train loss is {}'.format(total_train_step, loss_train.item())) # 方式二 获得Lossmodel.eval()  # 当网络中有dropout层、batchnorm层时,这些层不能起作用total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_dataloader:imgs, targets = datatest_result = model(imgs)loss_test = loss_fn(test_result, targets)total_test_loss = total_test_loss + loss_test.item()accuracy = (test_result.argmax(1) == targets).sum()total_accuracy = total_accuracy + accuracyprint('the all test loss is {}'.format(total_test_loss))print('the accuracy rate is {}'.format(total_accuracy / len(test_data)))total_test_step = total_test_step + 1torch.save(model, 'result/model_{}.pth'.format(i)) # 保存每一轮训练后的结果#torch.save(model.state_dict(),"model_{}.path".format(i)) # 保存方式二print('model is saved')
内容三:GPU训练
import torch
import torchvision
from torch import nn
from torch.nn import Linear, Conv2d, MaxPool2d, Flatten, Sequential
from torch.utils.data import DataLoader# 定义训练的设备
#device = torch.device("cpu")
#device = torch.device("cuda")   # 使用 GPU 方式一 
#device = torch.device("cuda:0") # 使用 GPU 方式二
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")class net(nn.Module):def __init__(self):super(net, self).__init__()self.model = Sequential(Conv2d(in_channels = 3, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 32, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Conv2d(in_channels = 32, out_channels = 64, kernel_size = 5, stride = 1, padding = 2),MaxPool2d(kernel_size = 2, ceil_mode = True),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model(x)return xtrain_data = torchvision.datasets.CIFAR10("dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) 
test_data = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True) train_dataloader = DataLoader(train_data, batch_size = 64)
test_dataloader = DataLoader(test_data, batch_size = 64)model = net()
model = model.to(device)loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)optimer = torch.optim.SGD(model.parameters(), lr = 0.01)total_train_step = 0
total_test_step = 0epoch = 30for i in range(epoch):print('--------the {} epoch for train--------'.format(i+1))model.train()  # 当网络中有dropout层、batchnorm层时,这些层能起作用for data in train_dataloader:imgs, targets = dataimgs = imgs.to(device) # 也可以不赋值,直接 imgs.to(device)targets = targets.to(device) # 也可以不赋值,直接 targets.to(device)train_result = model(imgs)loss_train = loss_fn(train_result, targets)# 优化器模型调优optimer.zero_grad()loss_train.backward()optimer.step()total_train_step = total_train_step + 1if total_train_step % 100 == 0:print('the current step eopch {}, the train loss is {}'.format(total_train_step, loss_train))  # 方式一  获得Loss# print('the current train eopch {}, the train loss is {}'.format(total_train_step, loss_train.item())) # 方式二 获得Lossmodel.eval()  # 当网络中有dropout层、batchnorm层时,这些层不能起作用total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_dataloader:imgs, targets = datatest_result = model(imgs.to(device))loss_test = loss_fn(test_result, targets.to(device))total_test_loss = total_test_loss + loss_test.item()accuracy = (test_result.argmax(1) == targets.to(device)).sum()total_accuracy = total_accuracy + accuracyprint('the all test loss is {}'.format(total_test_loss))print('the accuracy rate is {}'.format(total_accuracy / len(test_data)))total_test_step = total_test_step + 1torch.save(model, 'result/model_{}.pth'.format(i)) # 保存每一轮训练后的结果#torch.save(model.state_dict(),"model_{}.path".format(i)) # 保存方式二print('model is saved')
内容四:测试模型
import torchvision
import torch
from PIL import Image
from torch import nndevice = torch.device("cuda")image_path = 'dataset/1.jpg'
image = Image.open(image_path) # PIL类型的Image
image = image.convert("RGB") # 4通道的RGBA转为3通道的RGB图片
print(image)transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)),torchvision.transforms.ToTensor()])image = transform(image)
print(image.shape)# model = torch.load('result/model_20.pth', map_location = torch.device('cpu'))
model = torch.load('result/model_29.pth')
print(model)image = torch.reshape(image, (1, 3, 32, 32)) # 转为四维,符合网络输入需求
model.eval()
with torch.no_grad():result = model(image.to(device))result = model(image.to(device))
print(result)
print(result.argmax(1)) # 概率最大类别的输出

注:上述内容参考b站up主“我是土堆”的视频!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握现代C++的模板元编程类型检测技术

最近写代码恰好用到了C模板元编程的类型检测能力,以前对其原理有个大概的印象,但随着C11/C17等新特性的加入,很多做法和以前不同了,借此机会重新梳理一下这方面的知识点。 void_t 的引入 在 C17 之前,模板编程中通常…

利氪科技拿下C轮超级融资,国产智能底盘黑马奔向黄金时代

“智能驾驶遗珠,国产替代富矿。” 这是海通证券在最近一期研报中,描述线控底盘产业的用语。它很巧妙地点明了,这个藏在车身之下的部分,拥有何种特征——稳坐技术体系的核心点位,拥有前景广阔的市场。 事实上&#xf…

mysql、mariadb 登录主机的含义,如何修改登录主机,如何删除登录主机

MariaDB版本: 10.3.39 登录主机的含义: 参考 1 阿风说事:说世间百态、聊奇闻趣事,分享个人观点和独到见解 2 mysql授权localhost&%区别及一直授权错误解决办法(安装openstack有感) 3 ERROR 1396 (HY000): Operat…

为什么要学习PMP

学习PMP(项目管理专业人士认证)能够在职场竞争力、薪资待遇、项目管理技能等方面带来显著的提升。以下是学习PMP的具体分析: 1、职场竞争力 升职加薪:学习PMP能够提升个人在项目中的管理能力和解决问题的能力,从而在…

一问搞懂Linux信号【上】

Linux信号在Linux系统中的地位仅此于进程间通信,其重要程度不言而喻。本文我们将从信号产生,信号保存,信号处理三个方面来讲解信号。 🚩结合现实认识信号 在讲解信号产生之前,我们先做些预备的工作。 现实生活中信号…

vue3-openlayers 轨迹回放(历史轨迹),实时轨迹

vue3-openlayers 轨迹回放(历史轨迹),实时轨迹 本篇介绍一下使用vue3-openlayers轨迹回放(历史轨迹),实时轨迹 1 需求 轨迹回放(历史轨迹)实时轨迹 2 分析 可以使用和上一篇相同…

编译原理-各章典型题型+思路求解

第2章文法和语言习题 基础知识: 思路: 基础知识: 思路: 基础知识: 编译原理之 短语&直接短语&句柄 定义与区分_编译原理短语,直接短语,句柄-CSDN博客 思路: 题目: 基础解释&#xff1a…

【PID _stm32 教程】

【PID电机速度闭环控制-PID算法(章节:8.3-PID算法初步体验与算法理解)】 https://www.bilibili.com/video/BV1q341197kn

关于使用tensorflow_gpu遇到的问题

前言 我使用的是tensorflow_gpu2.6与python3.9,还要下载cuda与cudnn。 numpy版本问题 AttributeError: module numpy has no attribute object. np.object was a deprecated alias for the builtin object. To avoid this error in existing code, use object by i…

一种快速设计PCB外壳的方法

设计PCB外壳比较好用的工具是SW但是有时候需要快速设计外壳的情况下使用立创EDA的外壳设计功能很好用,设计完成之后可以直接导出STL文件: 可以看到设计的外壳还是蛮精美的: 特别注意,设计外壳的时候要考虑如何把PCB放进壳子中&…

[Day 17] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在金融業的應用 前言 區塊鏈技術作為一種去中心化的分佈式賬本技術,自其誕生以來便展示出極大的潛力,特別是在金融領域。區塊鏈技術可以通過提供透明性、安全性和效率來改變金融業的運作方式。在本文中,我們將深入探討區塊鏈在金融業…

【文心智能体大赛】迎接属于你的休闲娱乐导师!

迎接属于你的休闲娱乐导师! 前言创建智能体发布智能体最后结语 前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式&…

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…

EulerOS 安装docker 拉取opengauss 、redis镜像

#下载docker包 wget https://download.docker.com/linux/static/stable/x86_64/docker-18.09.9.tgz #解压 tar zxf docker-18.09.9.tgz #移动解压后的文件夹到/usr/bin mv docker/* /usr/bin #写入docker.service cat >/usr/lib/systemd/system/docker.service <<E…

通过 Setapp 使用 240 多款 Mac 生产力工具以及 GPT-4o

Setapp 是一项革命性的订阅服务&#xff0c;可以使用 240 多款 Mac 应用程序的综合套件&#xff0c;并配有强大的人工智能助手。 通过 Setapp 为你的工作效率和生产力增添魔力。 Setapp 官网&#xff1a;访问&#xff08;提供 7 天试用&#xff09; Setapp 的主要功能 AI 助手…

Spring Boot中的各种事件

spring boot 各种事件贯穿整个启动的生命周期&#xff0c;读懂了这些事件也差不多理解了springboot的启动流程。 SpringApplicationRunListener中的事件 接口org.springframework.boot.SpringApplicationRunListener定义了spring启动过程中各个事件被触发的顶层方法 public …

WPF文本框中加提示语

效果&#xff1a; WPF中貌似不能像winfrom里一样直接加提示语&#xff0c;需要使用TextBox.Style&#xff0c;将Trigger标签插入进去。 贴源码&#xff1a; <WrapPanel Name"TakeOverExpressNo1"><Label Content"物流单号&#xff1a;"><…

VSCode中全局搜索和替换的快捷键是什么?

在 Visual Studio Code (VSCode) 中进行全局搜索和替换的快捷键是&#xff1a; 全局搜索&#xff1a; 使用快捷键 CtrlShiftF&#xff08;在 Windows 和 Linux 上&#xff09;或 CmdShiftF&#xff08;在 macOS 上&#xff09;可以打开全局搜索功能&#xff0c;可以在整个工作…

oracle12c到19c adg搭建(六)切换后12c备库服务器安装19c软件在19c主库升级数据字典后尝试同步

一、安装19c软件 参考文章oracle12c到19c adg搭建&#xff08;三&#xff09;oracle19c数据库软件安装 二、原主库尝试通过19c软件启动数据库 2.1复制12c的相关参数文件和密码文件到19c目录 注意:密码文件需要从已切换主库19c传过来 [oracleo12u19p ~]$ cd /u01/app/oracle…

labelme 标注岩石薄片数据集流程

labelme 数据标注使用流程 1.打开anaconda环境2.打开labelme工具3.打开数据集文件夹4.开始标注5. 标注完成6. 修改labels.txt文件7. 将标注结果可视化8. 完成json转图片9. 全部命令总结 1.打开anaconda环境 2.打开labelme工具 输入下列两条命令&#xff0c;打开labelme工具 &a…