小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下

我们将继续计算机视觉内容的讲解。

我们已经知道了计算机视觉,用在什么地方,如何用Pytorch来处理数据,设定一些基础的设置以及模型。下面,我们将要解释剩下的部分,包括以下内容:

主题内容
Model 1 :加入非线性实验是机器学习的很大一部分,让我们尝试通过添加非线性层来改进我们的基线模型。
Model 2:卷积神经网络(CNN)是时候让计算机视觉具体化,并介绍强大的卷积神经网络架构。
比较我们的模型我们已经建立了三种不同的模型,让我们来比较一下。
评估我们的最佳模型让我们对随机图像做一些预测,并评估我们的最佳模型。
制作混淆矩阵混淆矩阵是评估分类模型的好方法,让我们看看如何制作一个。
保存和载入最佳性能模型由于我们可能希望稍后使用我们的模型,让我们保存它并确保它正确地加载回来。

下面开始正文:

6 Model 1:建立一个更好的非线性模型

我们在第二篇文章里学过非线性的力量。

看看我们一直在处理的数据,你认为它需要非线性函数吗?

记住,线性意味着直线,非线性意味着非直线。

让我们来看看。

我们将通过重新创建与之前类似的模型来实现这一点,只不过这次我们将在每个线性层之间放置非线性函数(nn.ReLU())。

# Create a model with non-linear and linear layers
class FashionMNISTModelV1(nn.Module):def __init__(self, input_shape: int, hidden_units: int, output_shape: int):super().__init__()self.layer_stack = nn.Sequential(nn.Flatten(), # flatten inputs into single vectornn.Linear(in_features=input_shape, out_features=hidden_units),nn.ReLU(),nn.Linear(in_features=hidden_units, out_features=output_shape),nn.ReLU())def forward(self, x: torch.Tensor):return self.layer_stack(x)

看起来不错。

现在让我们用之前使用的相同设置实例化它。

我们需要input_shape=784(等于图像数据的特征数量),hidden_units=10(开始时较小,与基线模型相同)和output_shape=len(class_names)(每个类一个输出单元)。

[!TIP]

注意:注意我们如何保持我们的模型的大部分设置相同,除了一个变化:添加非线性层。这是运行一系列机器学习实验的标准做法,改变一件事,看看会发生什么,然后再做一次,一次,一次。

torch.manual_seed(42)
model_1 = FashionMNISTModelV1(input_shape=784, # number of input featureshidden_units=10,output_shape=len(class_names) # number of output classes desired
).to(device) # send model to GPU if it's available
print(next(model_1.parameters()).device) # check model device      )

输出为:

cuda:0

6.1设置损耗、优化器和评估指标

像往常一样,我们将设置一个损失函数、一个优化器和一个评估指标(我们可以设置多个评估指标,但现在我们将坚持准确性)。

from helper_functions import accuracy_fn
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(params=model_1.parameters(), lr=0.1)

6.2训练和测试回路的功能化

到目前为止,我们已经一遍又一遍地编写train和test循环。

我们再写一遍,但是这次我们把它们放在函数里,这样它们就可以被反复调用了。

因为我们现在使用的是与设备无关的代码,我们将确保在特征(X)和目标(y)张量上调用.to(device)。

对于训练循环,我们将创建一个名为train_step()的函数,它接受一个模型、一个数据加载器(DataLoader)、一个损失函数和一个优化器。

测试循环将是类似的,但它将被称为test_step(),它将接受一个模型、一个DataLoader、一个损失函数和一个求值函数。

[!TIP]

注意:由于这些都是函数,您可以以任何喜欢的方式自定义它们。我们在这里所做的可以看作是针对我们的特定分类用例的基本训练和测试功能。

def train_step(model: torch.nn.Module,data_loader: torch.utils.data.DataLoader,loss_fn: torch.nn.Module,optimizer: torch.optim.Optimizer,accuracy_fn,device: torch.device = device):train_loss, train_acc = 0, 0model.to(device)for batch, (X, y) in enumerate(data_loader):# Send data to GPUX, y = X.to(device), y.to(device)# 1. Forward passy_pred = model(X)# 2. Calculate lossloss = loss_fn(y_pred, y)train_loss += losstrain_acc += accuracy_fn(y_true=y,y_pred=y_pred.argmax(dim=1)) # Go from logits -> pred labels# 3. Optimizer zero gradoptimizer.zero_grad()# 4. Loss backwardloss.backward()# 5. Optimizer stepoptimizer.step()# Calculate loss and accuracy per epoch and print out what's happeningtrain_loss /= len(data_loader)train_acc /= len(data_loader)print(f"Train loss: {train_loss:.5f} | Train accuracy: {train_acc:.2f}%")def test_step(data_loader: torch.utils.data.DataLoader,model: torch.nn.Module,loss_fn: torch.nn.Module,accuracy_fn,device: torch.device = device):test_loss, test_acc = 0, 0model.to(device)model.eval() # put model in eval mode# Turn on inference context managerwith torch.inference_mode(): for X, y in data_loader:# Send data to GPUX, y = X.to(device), y.to(device)# 1. Forward passtest_pred = model(X)# 2. Calculate loss and accuracytest_loss += loss_fn(test_pred, y)test_acc += accuracy_fn(y_true=y,y_pred=test_pred.argmax(dim=1) # Go from logits -> pred labels)# Adjust metrics and print outtest_loss /= len(data_loader)test_acc /= len(data_loader)print(f"Test loss: {test_loss:.5f} | Test accuracy: {test_acc:.2f}%\n")

哦吼!

现在我们有了一些用于训练和测试模型的函数,让我们运行它们。

我们将在每个epoch的另一个循环中这样做。

这样,对于每个epoch,我们都要经历一个训练步骤和一个测试步骤。

[!TIP]

注意:您可以自定义执行测试步骤的频率。有时人们每隔5个时期或10个时期做一次,在我们的例子中,每个时期做一次。

我们还可以计时,看看代码在GPU上运行需要多长时间。

# Import tqdm for progress bar
from tqdm.auto import tqdmtorch.manual_seed(42)# Measure time
from timeit import default_timer as timer
train_time_start_on_gpu = timer()epochs = 3
for epoch in tqdm(range(epochs)):print(f"Epoch: {epoch}\n---------")train_step(data_loader=train_dataloader, model=model_1, loss_fn=loss_fn,optimizer=optimizer,accuracy_fn=accuracy_fn)test_step(data_loader=test_dataloader,model=model_1,loss_fn=loss_fn,accuracy_fn=accuracy_fn)train_time_end_on_gpu = timer()
total_train_time_model_1 = print_train_time(start=train_time_start_on_gpu,end=train_time_end_on_gpu,device=device)

输出为:

  0%|                                                                                            | 0/3 [00:00<?, ?it/s]Epoch: 0
---------
Train loss: 1.09199 | Train accuracy: 61.34%
Test loss: 0.95636 | Test accuracy: 65.00%33%|████████████████████████████                                                        | 1/3 [00:05<00:11,  5.79s/it]Epoch: 1
---------
Train loss: 0.78101 | Train accuracy: 71.93%
Test loss: 0.72227 | Test accuracy: 73.91%67%|████████████████████████████████████████████████████████                            | 2/3 [00:12<00:06,  6.26s/it]Epoch: 2
---------
Train loss: 0.67027 | Train accuracy: 75.94%
Test loss: 0.68500 | Test accuracy: 75.02%100%|████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:19<00:00,  6.39s/it]
Train time on cuda: 19.161 seconds

太好了!

我们的模型训练了,但是训练时间更长?

[!TIP]

注意:CUDA vs CPU的训练时间很大程度上取决于你使用的CPU/GPU的质量。请继续阅读,以获得更详细的答案。

问题:“我用了GPU,但我的模型训练得并不快,这是为什么呢?”

答:嗯,一个原因可能是因为你的数据集和模型都很小(就像我们正在使用的数据集和模型),使用GPU的好处被实际传输数据所需的时间所抵消。

在将数据从CPU内存(默认)复制到GPU内存之间存在一个小瓶颈。

因此,对于较小的模型和数据集,CPU实际上可能是进行计算的最佳位置。

但对于更大的数据集和模型,GPU提供的计算速度通常远远超过获取数据的成本。

然而,这在很大程度上取决于您使用的硬件。通过练习,您将习惯训练模型的最佳地点。

让我们使用eval_model()函数对训练好的model_1求值,看看结果如何。

# Note: This will error due to `eval_model()` not using device agnostic code 
model_1_results = eval_model(model=model_1, data_loader=test_dataloader,loss_fn=loss_fn, accuracy_fn=accuracy_fn) 
print(model_1_results )

输出为:

...
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat1 in method wrapper_CUDA_addmm)

噢,不!

看起来我们的eval_model()函数出错了:

RuntimeError:期望所有张量都在同一设备上,但发现至少有两个设备,cuda:0和cpu!(当检查wrapper_addmm方法中参数mat1的参数时)

这是因为我们已经将数据和模型设置为使用与设备无关的代码,而不是我们的求值函数。

我们通过将目标设备参数传递给eval_model()函数来解决这个问题怎么样?

然后我们再试着计算结果。

# Move values to device
torch.manual_seed(42)
def eval_model(model: torch.nn.Module, data_loader: torch.utils.data.DataLoader, loss_fn: torch.nn.Module, accuracy_fn, device: torch.device = device):"""Evaluates a given model on a given dataset.Args:model (torch.nn.Module): A PyTorch model capable of making predictions on data_loader.data_loader (torch.utils.data.DataLoader): The target dataset to predict on.loss_fn (torch.nn.Module): The loss function of model.accuracy_fn: An accuracy function to compare the models predictions to the truth labels.device (str, optional): Target device to compute on. Defaults to device.Returns:(dict): Results of model making predictions on data_loader."""loss, acc = 0, 0model.eval()with torch.inference_mode():for X, y in data_loader:# Send data to the target deviceX, y = X.to(device), y.to(device)y_pred = model(X)loss += loss_fn(y_pred, y)acc += accuracy_fn(y_true=y, y_pred=y_pred.argmax(dim=1))# Scale loss and accloss /= len(data_loader)acc /= len(data_loader)return {"model_name": model.__class__.__name__, # only works when model was created with a class"model_loss": loss.item(),"model_acc": acc}# Calculate model 1 results with device-agnostic code 
model_1_results = eval_model(model=model_1, data_loader=test_dataloader,loss_fn=loss_fn, accuracy_fn=accuracy_fn,device=device
)
print(model_1_results)

输出为:

{'model_name': 'FashionMNISTModelV1', 'model_loss': 2.302107095718384, 'model_acc': 10.75279552715655}
# Check baseline results
print(model_0_results)

输出为:

{'model_name': 'FashionMNISTModelV0', 'model_loss': 2.3190648555755615, 'model_acc': 10.85263578

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

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

相关文章

elementUI 单选框存在多个互斥的选项中选择的场景

使用 el-radio-group 来使用单选框组&#xff0c;代码如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">业务对象</el-radio><…

Qt项目开发中所遇

讲述下面代码所表示的含义&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget&#xff0c;将给其应用垂直管路布局。 2、新建一个…

相机标定与图像处理涉及的核心坐标系

坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD编译时遇到npm error code EINTEGRITY的问题

场景 CICD编译时抛出npm error code EINTEGRITY的错误 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot与Spring Security构建安全的RESTful API

使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中&#xff0c;安全性是一个不可忽视的重要方面。Spring Boot和Spring Security为开发者提供了一套强大的工具&#xff0c;用于构建安全的RESTful API。本文将详细介绍如何结合Spring Boot和Sp…

机器人拖动示教控制

机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…

RuoYi-Vue3-FastAPI框架的功能实现(上)

RuoYi-Vue3-FastAPI框架的功能实现&#xff08;上&#xff09; 感谢大佬给出关于python后端的若依框架&#xff0c;希望这个简单文档能帮助到大家。 安装与运行&#xff1a; 下载地址&#xff1a;Vue2版本&#xff1a; Gitte仓库地址&#xff1a;RuoYi-Vue-FastAPI: 基于Vu…

Paimon和Hive相集成

Paimon版本1.17 Hive版本3.1.3 1、Paimon集成Hive 将paimon-hive-connector.jar复制到auxlib中&#xff0c;下载链接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通过flink进入查看paimon /opt/softwares/flink-1…

【Leetcode 每日一题】3362. 零数组变换 III

问题背景 给你一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li​,ri​]。 每一个 q u e r i e s [ i ] queries[i] queries[i]…

计算机视觉与深度学习 | 用于图像分割的自监督学习(Self-Supervised Learning)方法综述

图像分割 用于图像分割的自监督学习(Self-Supervised Learning)方法综述**1. 背景与意义****2. 方法演进****3. 图像分割子任务与SSL策略****4. 自监督预训练任务分类****5. 基准数据集与评估指标****6. 挑战与未来方向****总结**用于图像分割的自监督学习(Self-Supervised …

Jenkins集成Docker与K8S构建

Jenkins 是一个开源的持续集成和持续交付(CI/CD)工具,广泛用于自动化软件开发过程中的构建、测试和部署任务。它通过插件系统提供了高度的可扩展性,支持与多种开发工具和技术的集成。 Jenkins 的核心功能 Jenkins 的主要功能包括自动化构建、测试和部署。它能够监控版本控…

使用 adb 命令截取 Android 设备的屏幕截图

使用 adb 命令截取 Android 设备的屏幕截图。以下是两种常见的方法&#xff1a; 方法一&#xff1a;截屏后保存到电脑 adb shell screencap -p /sdcard/screenshot.png adb pull /sdcard/screenshot.png解释&#xff1a; adb shell screencap -p /sdcard/screenshot.png&…

参与开发的注意事项

1.开发期间&#xff0c;不要擅自修改架构的内容 使用技术官发的项目文件夹来开发&#xff0c;而不是自己建立项目&#xff0c; 否则会导致环境不统一 架构内容&#xff1a;&#xff08;不能更改&#xff09; 1.类型定义&#xff0c;全局变量声明 2.函数申明&#xff08;函数名称…

linux安装nginx和前端部署vue项目

1、打包前端项目 npm run build 执行完后会在根目录下生成一个dist文件夹&#xff0c;这个dist文件夹就是我们后面要部署到nginx的东西。 2、将dist文件夹上传到服务器中 自己建一个目录&#xff0c;上传即可&#xff08;尽量不要在root目录下&#xff0c;可能涉及权限问题…

亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?

前言 今天在测试 OGG 一个功能的时候&#xff0c;需要重新初始化 oggca&#xff0c;所以重装了一下 OGG。重建完之后重新添加抽取进程报错&#xff0c;一直无法添加成功&#xff1a; 经过一翻分析&#xff0c;找到了解决方案&#xff0c;本文记录一下解决过程。 问题描述 OG…

Docker构建 Dify 应用定时任务助手

概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案&#xff0c;用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰&#xff0c;本工具可以帮助设置自动执行任务并获取实时通知&#xff0c;优化你的工作效率。 注意&…

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧&#xff0c;用mainline工具安装新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…

网络爬虫(Web Crawler)详解

网络爬虫(Web Crawler)详解 1. 基本概念与核心目标 定义: 网络爬虫是一种自动化的程序,通过HTTP协议访问网页,提取并存储数据(如文本、链接、图片),并根据策略递归访问新链接。核心目标: 数据采集:抓取特定网站或全网公开数据。索引构建:为搜索引擎提供页面内容(如…

大模型如何助力数学可视化?

大家好&#xff0c;我是 i 学习的老章 在数学学习和教学中&#xff0c;将抽象概念可视化对于理解至关重要。Manim 是一个强大的数学动画引擎&#xff0c;由著名数学科普视频作者 3Blue1Brown 开发并广为人知。 老章较早之前就介绍过 manim&#xff1a;B 站上爆红的数学视频&a…

Oracle基础知识(二)

目录 1.聚合函数 2.COUNT(1)&COUNT(*)&COUNT(字段)区别&#xff08;面试常问&#xff09; 3.分组聚合——group by 4.去重&#xff1a;DISTINCT 、GROUP BY 5.聚合函数的过滤HAVING 6.oracle中having与where的区别 (面试常问) 7.ROUND与TRUNC函数 8.ROLLUP上卷…