梳理 Pytorch 19个方面,70个核心操作全总结!

最新写了很多关于 Pytorch 的文章,喜欢可以从0开始学习:

  • 小白学 PyTorch 系列:这一次,我准备了 20节 PyTorch 中文课程
  • 小白学 PyTorch 系列:54个超强 pytorch 操作
  • 小白学 PyTorch 系列:9个技巧让你的 PyTorch 模型训练飞快!
  • 小白学 PyTorch 系列:PyTorch 进阶指南,10个必须知道的原则
  • 小白学 PyTorch 系列:Pytorch,16个超强转换函数全总结!!
  • 小白学 PyTorch 系列:手把手教你使用 PyTorch 搭建神经网络
  • 小白学 PyTorch 系列:Keras 3.0发布:全面拥抱 PyTorch

最近群里有很多小伙伴聊起来Pytorch,说是太难用,想要放弃,想要say bye!

但我是想说你没用过TensorFlow,Pytorch已经是很好用了。而且完全可以作为大家入门深度学习的框架来使用和学习。

Pytorch作为当下最流行的一种深度学习框架,提供了大量操作用于创建和训练神经网络。

本文先从Pytorch的基础操作开始分享,涉及到:

  • 创建张量

  • 张量属性

  • 张量索引、切片与拼接

  • 张量变换

  • 数学运算

  • 汇总统计

  • 梯度相关

  • 数据管理

  • 其他操作基础操作

  • 自动求导

  • 神经网络模块

  • 数据加载与处理

  • 损失函数

  • 优化器

  • 模型训练与验证

  • 模型保存与加载

  • GPU 加速

  • 模型调优

  • 迁移学习

19个方面,涉及到70个细节操作,这部分大家花一天的时间,动手操作一下,在后面的使用中会熟悉很多。

老规矩:大家伙如果觉得文章还不错!欢迎大家点个赞、转个发~

有同学想要获取完整资料的,可以加入我们社群

技术交流&资料获取

独学而无优则孤陋而寡闻,技术要学会交流、分享,不建议闭门造车。

建立了 Pytorch 技术与面试交流群,本文详细资料、实战项目、面试真题,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:交流
方式②、添加微信号:dkl88194,备注:交流

创建张量

torch.tensor(data): 从数据创建张量

这个函数会根据提供的数据创建一个新的张量。数据可以是列表、数组等。

import torch

data = [1, 2, 3, 4, 5]
tensor_data = torch.tensor(data)
print(tensor_data)

torch.zeros(size): 创建元素全为0的张量

创建一个指定大小的张量,其中所有元素的值都为0。

import torch

size = (2, 3)
zeros_tensor = torch.zeros(size)
print(zeros_tensor)

torch.ones(size): 创建元素全为1的张量

创建一个指定大小的张量,其中所有元素的值都为1。

import torch

size = (2, 3)
ones_tensor = torch.ones(size)
print(ones_tensor)

torch.empty(size): 创建未初始化的张量

创建一个指定大小的未初始化张量,其值取决于内存的状态。

import torch

size = (2, 3)
empty_tensor = torch.empty(size)
print(empty_tensor)

torch.randn(size): 创建服从标准正态分布的张量

创建一个指定大小的张量,其中的元素值是从标准正态分布中随机抽取的。

import torch

size = (2, 3)
randn_tensor = torch.randn(size)
print(randn_tensor)

torch.arange(start, end, step): 创建一个范围内的一维张量

创建一个一维张量,其中的元素值从起始值到结束值,步长为给定的步长。

import torch

start = 0
end = 5
step = 1
arange_tensor = torch.arange(start, end, step)
print(arange_tensor)

torch.linspace(start, end, steps): 创建一个在指定范围内均匀间隔的张量

创建一个一维张量,其中的元素值在指定范围内均匀分布。

import torch

start = 0
end = 5
steps = 5
linspace_tensor = torch.linspace(start, end, steps)
print(linspace_tensor)

张量属性

.dtype: 获取张量的数据类型

返回张量中元素的数据类型。

import torch

tensor = torch.tensor([1, 2, 3])
print(tensor.dtype)

.shape: 获取张量的形状

返回一个元组,表示张量的形状。

import torch

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(tensor.shape)

.device: 获取张量所在的设备

返回一个字符串,表示张量所在的设备,如’cpu’或’cuda:0’。

import torch

tensor = torch.tensor([1, 2, 3])
print(tensor.device)

张量索引、切片与拼接

tensor[index]: 索引操作

使用索引来访问张量中的元素。

import torch

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
element = tensor[0, 1]  # Accesses the element at row 0, column 1
print(element)

tensor[start:end]: 切片操作

使用切片来获取张量的子张量。

import torch

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
sub_tensor = tensor[:, 1:]  # Slices the tensor to get all rows and columns starting from the second column
print(sub_tensor)

torch.cat(tensors, dim): 在给定维度上连接张量

沿着指定维度将多个张量连接在一起。

import torch

tensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([[5, 6], [7, 8]])
concatenated_tensor = torch.cat((tensor1, tensor2), dim=0)  # Concatenates along the row dimension
print(concatenated_tensor)

torch.stack(tensors, dim): 在新维度上堆叠张量

在一个新的维度上堆叠多个张量。

import torch

tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
stacked_tensor = torch.stack((tensor1, tensor2), dim=1)  # Stacks tensors along a new dimension
print(stacked_tensor)

张量变换

tensor.view(shape): 返回给定形状的张量视图

返回一个具有指定形状的新张量,原始张量的形状必须与新形状兼容。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
reshaped_tensor = tensor.view(1, 4)  # Reshapes the tensor to a 1x4 tensor
print(reshaped_tensor)

tensor.reshape(shape): 改变张量的形状

返回一个具有指定形状的新张量,原始张量的元素数量必须与新形状一致。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
reshaped_tensor = tensor.reshape(1, 4)  # Reshapes the tensor to a 1x4 tensor
print(reshaped_tensor)

tensor.transpose(dim0, dim1): 交换两个维度

交换张量中两个维度的位置。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
transposed_tensor = tensor.transpose(0, 1)  # Swaps the first and second dimensions
print(transposed_tensor)

tensor.permute(*dims): 按照指定顺序排列张量的维度

按照给定顺序重新排列张量的维度。

import torch

tensor = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
permuted_tensor = tensor.permute(1, 0, 2)  # Permutes the dimensions to (1, 0, 2)
print(permuted_tensor)

tensor.squeeze(): 删除所有长度为1的维度

删除张量中所有长度为1的维度。

import torch

tensor = torch.tensor([[[1, 2], [3, 4]]])
squeezed_tensor = tensor.squeeze()  # Removes the single-dimensional entries
print(squeezed_tensor)

tensor.unsqueeze(dim): 在指定位置增加一个维度

在指定位置增加一个长度为1的新维度。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
unsqueezed_tensor = tensor.unsqueeze(0)  # Adds a dimension at index 0
print(unsqueezed_tensor)

数学运算

torch.add(x, y): 加法

对两个张量进行逐元素加法运算。

import torch

x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.add(x, y)
print(result)

torch.sub(x, y): 减法

对两个张量进行逐元素减法运算。

import torch

x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.sub(x, y)
print(result)

torch.mul(x, y): 乘法

对两个张量进行逐元素乘法运算。

import torch

x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.mul(x, y)
print(result)

torch.div(x, y): 除法

对两个张量进行逐元素除法运算。

import torch

x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([4.0, 5.0, 6.0])
result = torch.div(x, y)
print(result)

torch.matmul(x, y): 矩阵乘法

计算两个张量的矩阵乘法。

import torch

x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
result = torch.matmul(x, y)
print(result)

torch.pow(base, exponent): 幂运算

计算张量的幂。

import torch

base = torch.tensor([1, 2, 3])
exponent = 2
result = torch.pow(base, exponent)
print(result)

torch.exp(tensor): 指数运算

计算张量中所有元素的指数。

import torch

tensor = torch.tensor([1.0, 2.0, 3.0])
result = torch.exp(tensor)
print(result)

torch.sqrt(tensor): 开方运算

计算张量中所有元素的平方根。

import torch

tensor = torch.tensor([1.0, 4.0, 9.0])
result = torch.sqrt(tensor)
print(result)

汇总统计

torch.sum(input): 求和

计算张量中所有元素的和。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
result = torch.sum(tensor)
print(result)

torch.mean(input): 求平均值

计算张量中所有元素的平均值。

import torch

tensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.mean(tensor)
print(result)

torch.max(input): 求最大值

找出张量中所有元素的最大值。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
result = torch.max(tensor)
print(result)

torch.min(input): 求最小值

找出张量中所有元素的最小值。

import torch

tensor = torch.tensor([[1, 2], [3, 4]])
result = torch.min(tensor)
print(result)

torch.std(input): 求标准差

计算张量中所有元素的标准差。

import torch

tensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.std(tensor)
print(result)

torch.var(input): 求方差

计算张量中所有元素的方差。

import torch

tensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.var(tensor)
print(result)

梯度相关

tensor.requires_grad_(): 标记张量需要计算梯度

标记张量以便在反向传播中计算梯度。

import torch

tensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

tensor.grad: 获取张量的梯度

获取张量的梯度值,前提是该张量需要计算梯度。

import torch

tensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.sum().backward()
print(tensor.grad)

tensor.backward(): 计算梯度

计算张量的梯度值,前提是该张量需要计算梯度。

import torch

tensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.sum().backward()

数据管理

tensor.to(device): 将张量移动到指定的设备上(如GPU)

将张量移动到指定的设备上,例如GPU。

import torch

tensor = torch.tensor([1, 2, 3])
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tensor = tensor.to(device)
print(tensor.device)

torch.save(obj, f): 保存对象到文件

将对象保存到文件中。

import torch

tensor = torch.tensor([1, 2, 3])
torch.save(tensor, 'tensor.pt')  # Save tensor to file

torch.load(f): 从文件加载对象

从文件中加载对象。

import torch

tensor = torch.load('tensor.pt')  # Load tensor from file
print(tensor)

其他操作基础操作

torch.nn.functional.relu(input): 应用ReLU激活函数

对输入张量应用ReLU激活函数。

import torch.nn.functional as F
import torch

input = torch.tensor([-1, 0, 1], dtype=torch.float)
output = F.relu(input)
print(output)

torch.nn.Conv2d(in_channels, out_channels, kernel_size): 创建二维卷积层

创建一个二维卷积层。

import torch.nn as nn
import torch

conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
input = torch.randn(1, 3, 64, 64)
output = conv_layer(input)
print(output.shape)

torch.optim.SGD(params, lr): 使用SGD优化器

使用随机梯度下降(SGD)优化器来优化模型参数。

import torch.optim as optim
import torch

params = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
optimizer = optim.SGD([params], lr=0.1)

自动求导(Autograd)

自动求导是 PyTorch 中一个重要的功能,能够自动计算张量的梯度。

import torch

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x ** 2
y.backward(torch.tensor([1.0, 1.0, 1.0]))  # 计算 y 对 x 的梯度
print(x.grad)  # 输出梯度值

神经网络模块(nn.Module)

使用 nn.Module 类来定义神经网络模型,可以方便地管理和组织模型的结构。

import torch.nn as nn
import torch

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(10, 1)

    def forward(self, x):
        return self.fc(x)

model = Net()

数据加载与处理(Data Loading and Processing)

使用 DataLoader 和 Dataset 类来加载和处理数据集。

import torch
from torch.utils.data import DataLoader, Dataset

class CustomDataset(Dataset):
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

data = [1, 2, 3, 4, 5]
dataset = CustomDataset(data)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

损失函数(Loss Functions)

使用损失函数来衡量模型输出与真实标签之间的差异。

import torch.nn as nn
import torch

criterion = nn.CrossEntropyLoss()
output = torch.tensor([[0.1, 0.2, 0.7], [0.3, 0.6, 0.1]])
target = torch.tensor([2, 1])
loss = criterion(output, target)
print(loss)

优化器(Optimizers)

使用优化器来更新模型的参数,常见的优化器包括 SGD、Adam 等。

import torch.optim as optim
import torch

model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)

模型训练与验证(Model Training and Validation)

使用 PyTorch 来训练和验证神经网络模型。

import torch.nn as nn
import torch.optim as optim
import torch

model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

for epoch in range(10):
    # 训练模型
    for data in dataloader:
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    # 验证模型
    with torch.no_grad():
        # 计算准确率等指标

模型保存与加载(Model Saving and Loading)

在训练完成后,将模型保存到文件中以便后续使用。

import torch

torch.save(model.state_dict(), 'model.pth')  # 保存模型参数

GPU 加速(GPU Acceleration)

利用 GPU 加速计算可以显著提高模型训练的速度。

import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)  # 将模型移动到 GPU 上

模型调优(Model Tuning)

使用交叉验证和超参数搜索来调优模型,以提高模型性能。

from sklearn.model_selection import GridSearchCV
import torch

parameters = {'lr': [0.01, 0.1, 1.0]}
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)
grid_search = GridSearchCV(optimizer, parameters)

迁移学习(Transfer Learning)

迁移学习是一种常见的训练技巧,可以使用预训练的模型来加速模型的训练过程。

import torchvision.models as models
import torch

pretrained_model = models.resnet18(pretrained=True)
# 将预训练模型的参数冻结
for param in pretrained_model.parameters():
    param.requires_grad = False

最后

掌握以上19种操作方法可以让你更好地使用 PyTorch 进行深度学习任务。这些操作方法涵盖了张量的创建、变换、数学运算、梯度计算、模型构建、数据处理等方面,是使用 PyTorch 进行深度学习的基础操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔试训练】day11

1.游游的水果大礼包 思路: 枚举。假设最后的答案是x个a礼包,y个b礼包,得到一个式子:ansa*xb*y 我们可以枚举x的数量,这样就能变相的把y的求出来。呃这就是鸡兔同笼问题嘛 x最大的范围是多少呢?也就是a礼…

【CouchDB 与 PouchDB】

CouchDB是什么 CouchDB,全名为Apache CouchDB,是一个开源的NoSQL数据库,由Apache软件基金会管理。CouchDB的主要特点是使用JSON作为存储格式,使用JavaScript作为查询语言(通过MapReduce函数),并…

面试二十二、跳表SkipLists

跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图&…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电,一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1&#xf…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群! 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图: ![在这里插入图片描述](https://im…

【ruoyi-vue】登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息,获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能,经过jar内的流…

python逆向基础流程(纯小白教程)

一,例题链接 NSSCTF | 在线CTF平台 二,文件特征 使用工具查看文件信息,发现是pyinsatller打包的exe文件,如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑,所以思路是反编译成py文件直接分析python代码 三&#xf…

【论文推导】基于有功阻尼的转速环PI参数整定分析

前言 在学习电机控制的路上,PMSM的PI电流控制是不可避免的算法之一,其核心在于内环电流环、外环转速环的设置,来保证转速可调且稳定,并且保证较好的动态性能。整个算法仿真在《现代永磁同步电机控制原理及matlab仿真》中已详细给出…

VUE项目使用.env配置多种环境以及如何加载环境

第一步,创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量,例如: .env —— 所有模式共用.env.local —— 所有模式共用,但不会被 git 提交&…

Clickhouse离线安装教程

https://blog.51cto.com/u_15060531/4174350 1. 前置 1.1 检查服务器架构 服务器:Centos7.X 需要确保是否x86_64处理器构架、Linux并且支持SSE 4.2指令集 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 …

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

Java Swing游戏开发学习24

内容来自RyiSnow视频讲解 这一节讲的是Scrolling Message, Leveling Up, Damage Calculation滚动消息,升级,伤害计算。 伤害计算 玩家与怪的战斗,玩家对怪的伤害值为攻击值减去怪的防御值。 int damage attack - gp.monster[i].defense; …

队列的实现(c语言实现)

队列的定义 队列(Queue)是一种特殊的线性数据结构,它遵循先进先出(FIFO,First In First Out)的原则。这意味着最早被添加到队列中的元素将是最先被移除的元素。队列的主要操作包括入队(enqueue…

接口自动化测试框架建设的经验与教训

为什么选择这个话题? 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题,可以说自动化测试是“点工”升级的必经之路;二是Google一下接口自动化测试,你会发现很多自动化测试框架相关的文章,但是大部分…

Nodejs--异步编程

异步编程 函数式编程 高阶函数 在通常的语言中,函数的参数只接受基本的数据类型或者是对象引用,返回值只能是基本数据类型和对象引用。 function foo(x) {return x }高阶函数是把函数作为参数,将函数作为返回值的函数 function foo(x) {…

Oceanbase体验之(二)Oceanbase集群的搭建(社区版4.2.2)

资源规划 3台observer CPU:4C及以上 内存:32G及以上 硬盘操作系统500G 存储盘1T及以上 虚拟机可以直接划分,物理机需要提前规划好资源 一、上传oceanbase安装包 登录ocp选择软件包管理 上传Oceanbase软件包(软件包获取路径 官网免费下载社…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目(这个看下一篇文章吧) 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍:YApi 是高效、易用、功能强大的 api 管理平台&#…

Hive主要介绍

Hive介绍 hive是基于 Hadoop平台操作 HDFS 文件的插件工具 可以将结构化的数据文件映射为一张数据库表 可以将 HQL 语句转换为 MapReduce 程序 1.hive 是由驱动器组成,驱动器主要由4个组件组成(解析器、编译器、优化器、执行器) 2.hive本身不…

递归排列枚举(c++)

全部排列问题 输入 n 输出 1…n 个数的全部排列。全部排列中,数字可以重复 。 例如 输入 3 输出全部排列的结果如下:111、112、113、121、122、123、131、132、133、211、212、213、221、222、223、231、232、233、311、312、313、321、322、323、33…

4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer

现有Transformer模型的速度通常受到内存低效操作的限制,尤其是MHSA(多头自注意力)中的张量整形和逐元素函数。 设计了一种具有三明治布局的新构建块,即在高效FFN(前馈)层之间使用单个内存绑定的MHSA&#x…