Pytorch学习笔记(九)Learning PyTorch - Deep Learning with PyTorch: A 60 Minute Blitz

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Deep Learning with PyTorch: A 60 Minute Blitz 部分,

  • 官网链接:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwd=aa2m 提取码: aa2m 

主要由以下四个部分组成:

  • Tensor
  • A Gentle Introduction to torch.autograd
  • Neural Networks
  • Training a Classifier

这个章节的教程打开后通常不会直接看到代码,而是需要往下拉看到类似于下图中红框部分的东西,点开后就是完整的示例:

在这里插入图片描述

这篇教程中包含了四个部分,为了保证笔记的结构与官网教程的一致,这里会压缩到一篇文章中。


Tensors

  • 官网链接:https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html

第一部分仍然是关于Tensor的一些基本操作,这一小节的内容与之前的笔记 Pytorch学习笔记(二)Learn the Basics - Tensors 中部分是重复的,如果你已经很熟练了可以选择性跳过一段。

  • 导入必要的包:
import torch
import numpy as np

Tensor 构造与初始化

  • 直接通过python数据类型初始化
data = [[1,2], [3,4]]
x_data = torch.tensor(data)
  • 通过其他tensor初始化
x_ones = torch.ones_like(x_data)
print(f"Ones Tensor:\n{x_ones}")x_rand = torch.rand_like(x_data, dtype=torch.float)
print(f"Rand Tensor:\n{x_rand}")
  • 指定shape的变量与常量初始化:
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor:\n{rand_tensor}")
print(f"Ones Tensor:\n{ones_tensor}")
print(f"Zeros Tensor:\n{zeros_tensor}")

Tensor 的三大属性

tensor对象最常用的三个属性为 shapedtypedevice

tensor = torch.rand(3, 4)print(f"Shape: {tensor.shape}")
print(f"Dtype: {tensor.dtype}")
print(f"Device: {tensor.device}")

Tensor 的操作

  • 将tensor移动到cuda上
if torch.cuda.is_available():tensor = tensor.to('cuda')print(f"Device tensor is stored on : {tensor.device}")
  • 类似numpy形式的切片使用
tensor = torch.ones(4,4)
tensor[:,1] = 0
print(tensor)
  • 将两个tensor按照指定维度拼接
t1 = torch.cat([tensor, tensor], dim=1)
print(t1)
  • tensor按照元素 点乘
print(f"Tensor.mul:\n{tensor.mul(tensor)}")
print(f"Tensor *:\n{tensor * tensor}")
  • tensor 叉乘
print(f"Tensor.matmul:\n{tensor.matmul(tensor.T)}")
print(f"Tensor @:\n{tensor @ tensor.T}")
  • 就地操作:
print(f"Tensor:\n{tensor}")
tensor.add_(5)
print(f"Tensor:\n{tensor}")

Bridge with NumPy

  • Tensor -> Numpy
t = torch.ones(5)
print(f"t:\n{t}")
n = t.numpy()
print(f"n:\n{n}")
  • Numpy -> Tensor
n = np.array((2,4))
print(f"n:\n{n}")
t = torch.from_numpy(n)
print(f"t:\n{t}")

A Gentle Introduction to torch.autograd

  • 官网链接: https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html

这是该章节的第二部分,主要介绍了pytorch的自动梯度机制。torch.autograd 是 PyTorch 的自动微分引擎,为神经网络训练提供支持。


背景知识

神经网络 (NN) 是一些嵌套函数的集合,这些函数由参数(权重+偏置值)定义,参数存储在Tensor中。

训练 NN 分为两个步骤:

  • 前向传播:NN 对输出做出推理,通过每个函数运行输入数据以做出此猜测;
  • 反向传播:NN 根据推理中的误差调整参数,它通过从输出向后遍历、收集误差相对于函数参数的导数(梯度)并使用梯度下降优化来调整参数;

梯度传播演示

这里加载了一个 ResNet18 的参数并定义了一对无意义的sample用来掩饰pytorch是如进行梯度传播,运行后会自动下载 ResNet18 模型参数:

import torch
from torchvision.models import resnet18, ResNet18_Weights

加载模型及参数

model = resnet18(weights=ResNet18_Weights.DEFAULT)
data = torch.rand(1,3,64,64)
labels = torch.rand(1,1000)

执行推理:

prediction = model(data)

计算loss并反向传播

loss = (prediction - labels).sum()
loss.backward()

定义优化器并执行梯度优化

optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
optimizer.step()

具体梯度计算

这部分主要介绍了pytorch如和计算梯度,包含了一些数据概念,本质上就是对变量进行求导。

定义两个Tensor

a = torch.tensor([2.0, 3.0], requires_grad=True)
b = torch.tensor([6.0, 4.0], requires_grad=True)

定义另外一个Tensor为 Q = 3 a 3 − b 2 Q=3a^{3}-b^{2} Q=3a3b2

Q = 3*a**3 - b**2

手动计算Tensor Q的梯度:

external_grad = torch.tensor([1.0, 1.0])
Q.backward(gradient=external_grad)print(9*a**2 == a.grad)
print(-2*b == b.grad)

Neural Networks

  • 官网链接:https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#neural-networks

可以使用 torch.nn 构建神经网络。nn 依赖 autograd 来定义模型并对其进行区分。以经典的Alex Net模型为例:
在这里插入图片描述

神经网络的典型训练过程如下:

  1. 定义具有一些可学习参数(或权重)的神经网络;
  2. 迭代输入数据集;
  3. 模型处理输入;
  4. 计算损失(输出与正确的差值);
  5. 将梯度传播回网络参数;
  6. 更新网络权重,通常使用简单的更新规则:权重 = 权重 - 学习率 * 梯度

定义模型

导入依赖包

import torch 
import torch.nn as nn
import torch.nn.functional as F

定义模型结构

class Net(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1,6,5)self.conv2 = nn.Conv2d(6,16,5)self.fc1 = nn.Linear(16*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):c1 = F.relu(self.conv1(x))s2 = F.max_pool2d(c1, (2,2))c3 = F.relu(self.conv2(s2))s4 = F.max_pool2d(c3, 2)s4 = torch.flatten(s4, 1)f5 = F.relu(self.fc1(s4))f6 = F.relu(self.fc2(f5))output = self.fc3(f6)return output

实例化模型

net = Net()
print(net)

只需定义 前向函数反向函数(计算梯度的地方),autograd 会自动生成匹配的参数。

params = list(net.parameters())
print(len(params))
print(params[0].size())

模型计对随机数进行推理

input = torch.rand(1,1,32,32)
out = net(input)
print(out)

清空模型梯度并用随机数填充输出Tensor的梯度

net.zero_grad()
out.backward(torch.randn(1,10))

定义损失函数

损失函数采用(输出,目标)输入对,并计算一个值来估计输出与目标之间的差。nn 包下有几种不同的损失函数。最简单的损失函数是:nn.MSELoss 计算输出和目标之间的均方误差。

output = net(input)
target = torch.rand(10)
target = target.view(1, -1)
criterion = nn.MSELoss()

计算损失值:

loss = criterion(output, target)
print(loss)

查看部分层的损失梯度:

print(loss.grad_fn)
print(loss.grad_fn.next_functions[0][0])
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])

只需执行 loss.backward() 就可以反向传播loss。但首先要清除现有梯度,否则梯度将累积到现有梯度中。

net.zero_grad()
print("conv1.bias.grad before backward")
print(net.conv1.bias.grad)loss.backward()print("conv1.bias.grad after backward")
print(net.conv1.bias.grad)

更新模型参数

手动对模型中的值进行一次修改

learning_rate = 0.01
for f in net.parameters():f.data.sub_(f.grad.data * learning_rate)

定义优化器

optimizer = torch.optim.SGD(net.parameters(), lr=0.01)

优化器根据loss值更新模型参数

optimizer.zero_grad()
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()

Training a Classifier

  • 官网链接: https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html

当需要处理图像、文本、音频或视频数据时,可以将数据加载到 numpy 数组中的标准 python 包,然后转换为 torch.*Tensor

  • 对于图像:Pillow、OpenCV 等包;
  • 对于音频:scipy 和 librosa 等包;
  • 对于文本:原始 Python 或 Cython 的加载,或 NLTK 和 SpaCy 等包;

pytorch为于视觉提供了一个名为 torchvision 的包,内嵌了常见数据集(如 ImageNet、CIFAR10、MNIST 等)加载器,以及用于图像的数据转换器,即 torchvision.datasetstorch.utils.data.DataLoader

在这里将使用 CIFAR10 数据集。它有以下类别:‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’. 。CIFAR-10 中的图像大小为 3x32x32,即 32x32 像素大小的 3 通道彩色图像。

按照下面的步骤训练图像分类神经网络:

  1. 使用 torchvision 加载并规范化 CIFAR10 训练和测试数据集;
  2. 定义卷积神经网络;
  3. 定义损失函数;
  4. 在训练数据上训练网络;
  5. 在测试数据上测试网络;

数据预处理

导入依赖包

import torch
import torchvision
import torchvision.transforms as transforms

定义图像数据转化器

transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]
)

加载训练集与测试集

train_set = torchvision.datasets.CIFAR10(root="data", train=True, download=True, transform=transform)
test_set = torchvision.datasets.CIFAR10(root="data", train=True, download=True, transform=transform)classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')

定义训练集与测试集加载器

batch_size = 4train_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, num_workers=2)
test_loader = torch.utils.data.DataLoader(test_set, batch_size=batch_size, shuffle=True, num_workers=2)

抽看四张图像

import matplotlib.pyplot as plt
import numpy as npdef imshow(img):img = img/2 + 0.5npimg = img.numpy()plt.imshow(np.transpose(npimg, (1,2,0)))plt.show()dataiter = iter(train_loader)
images, labels = next(dataiter)imshow(torchvision.utils.make_grid(images))
print(' '.join(f'{classes[labels[j]]:5s}' for j in range(batch_size)))

定义神经网络

import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = torch.flatten(x,1)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xnet = Net()

定义损失函数与优化器

import torch.optim as optimcriterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

训练模型

for epoch in range(2):running_loss = 0.0for i, data in enumerate(train_loader, 0):inputs, labels = dataoptimzer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimzer.step()running_loss += loss.item()if i % 2000 == 1999:print(f"Epoch [{epoch+1}]: {i+1:5d} loss:{running_loss / 2000:3f}")runnling_loss = 0.0print("Done")

在测试集上测试

dataiter = iter(test_loader)
images, labels = next(dataiter)imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join(f'{classes[labels[j]]:5s}' for j in range(4)))outputs = net(images)_, predicted = torch.max(outputs, 1)print('Predicted: ', ' '.join(f'{classes[predicted[j]]:5s}'for j in range(4)))

对整个测试集进行测试

correct = 0
total = 0with torch.no_grad():for data in test_loader:images, labels = dataoutputs = net(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predict == labels).sum().item()print(f'Accuracy of the network on the 10000 test images: {100 * correct // total} %')

在这里插入图片描述

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

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

相关文章

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索(本文) 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。 查询的分类&…

比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取

数据截图 k线数据 websocket 实时价格数据 根据这些数据可以做出自己的产品 获取时间段内的k线数据 在开始之前,你需要知道的知识: 币种缩写英文名币种IDBTCBitcoinbitcoinETHEthereumethereumEOSEOSeosUSDTTethertetherLTCLitecoinlitecoinUSDDol…

初阶7 vector

本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问,和数…

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言: DeepSeek 兑现了自己的诺言,开源了一款用于 Hopper GPU 的高效型 MLA 解码核:FlashMLA。 项目地址:https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀? MLA是DeepSeek大模型的重要技术创新点&…

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…

GPU架构与通信互联技术介绍

文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

day 16

创建链接文件 软链接&#xff1a;又叫符号链接&#xff0c;类似win的快捷方式&#xff0c;是一种用来建立文件的特殊文件&#xff0c;这个文件里的数据都是建立链接的文件&#xff0c;但是它和建立链接的文件不是一个东西&#xff0c;如果建立链接的文件移动或删除&#xff0c…

fork系统调用

基本概念&#xff1a; 在操作系统里&#xff0c;进程是正在运行的程序的实例。fork() 函数的作用是复制当前进程&#xff0c;生成一个新的进程&#xff0c;这个新进程被称作子进程&#xff0c;而原本的进程则是父进程。这两个进程&#xff08;父进程和子进程&#xff09;会从 …

【leetcode刷题记录】(java)数组 链表 哈希表

文章目录 四、题目之&#xff1a;代码随想录(1) 代码随想录&#xff1a;数组[704. 二分查找](https://leetcode.cn/problems/binary-search/)[27. 移除元素](https://leetcode.cn/problems/remove-element/)暴力解:双指针&#xff1a; [977. 有序数组的平方](https://leetcode.…

在线运行vscode

安装 https://github.com/coder/code-server?utm_sourcesyndication&pubDate20250317 运行前预览脚本 curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run运行脚本 curl -fsSL https://code-server.dev/install.sh | sh其他 可以通过后台服务运行&am…

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…

Netty源码—7.ByteBuf原理三

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位 (1)4种内存规格 一.tiny&#xff1a;表示从…

W、M、C练题笔记(持续更新中)

web here are the flag 点击&#xff0c;页面跳转404.php&#xff0c;用bp抓包访问/flag.php页面&#xff0c;得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议&#xff0c;访问robots.txt 访问flllaaa......&#xff0c;得到空白页面&#xff0c;查看…

【高项】信息系统项目管理师(十二)项目干系人管理【3分】

项目干系人管理包括识别能够影响项目或会受项目影响的人员、团队或组织,分析干系人对项目的期望和影响,制定管理策略有效调动干系人参与项目决策和执行。项目干系人管理过程能够支持项目团队的工作。一、管理基础 1、管理的重要性 项目经理和团队管理干系人的能力决定着项目…

Keil(ARMCC)编译改为Cmake(GNU)编译

1. 环境介绍&#xff1a; 某款ARM-M4芯片&#xff08;应该芯片通用&#xff09;cmkeGNUNinja&#xff08;CLion&#xff09; 2. 必备&#xff1a; 芯片启动文件 startup_xxxx.s链接文件 xxxx_flash.ldCMakeLists.txt 3. 具体修改步骤 第一步&#xff1a;观察启动文件…

SpringCould微服务架构之Docker(4)

Docker ce是社区版。 安装docker之前&#xff0c;先安装yum-util 。 安装docker之前&#xff0c;一定要先关闭防火墙。

LangChain开发(四)服务监控(LangSmith、verbose、debug)

文章目录 LangChain服务监控LangSmith Tracing&#xff08;跟踪&#xff09;Verbose&#xff08;1详细日志打印&#xff09;Debug&#xff08;调试日志打印&#xff09;源码地址参考资料 LangChain服务监控 与构建任何类型的软件一样&#xff0c;使用LLM构建时&#xff0c;总会…

从车间到数字生态:MES如何引领制造业智能化革命‌

在全球制造业加速迈向工业4.0的浪潮中&#xff0c;传统生产模式正经历颠覆性变革。制造执行系统&#xff08;MES&#xff09;作为连接物理车间与数字世界的核心纽带&#xff0c;正从“生产辅助工具”升级为“智能决策大脑”&#xff0c;推动制造业向数据驱动、柔性化与可持续化…

人工智能之数学基础:瑞利商的推广形式——广义瑞利商

本文重点 在数学和工程领域,瑞利商(Rayleigh quotient)的推广形式——广义瑞利商(Generalized Rayleigh quotient)扮演着重要的角色。它们不仅为线性代数中的特征值问题提供了新的视角,还在信号处理、机器学习、计算机视觉等领域有广泛的应用。 广义瑞利商的定义 广义…