2 PyTorch基础

本文详细介绍了PyTorch中的Tensor操作,包括创建、修改形状、索引、广播机制、逐元素操作、归并操作、比较操作和矩阵运算。此外,还阐述了PyTorch的自动求导机制,包括叶子节点、非叶子节点、计算图、反向传播和梯度计算。最后,通过实例展示了如何使用Tensor和Autograd实现简单的机器学习任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2 PyTorch基础

2.1Numpy与Tensor

第1章已经介绍了Numpy,了解到其存取数据非常方便,而且还拥有大 量的函数,所以深得数据处理、机器学习者喜爱。这节我们将介绍PyTorch 的Tensor,它可以是零维(又称为标量或一个数)、一维、二维及多维的数 组。Tensor自称为神经网络界的Numpy,它与Numpy相似,二者可以共享内 存,且之间的转换非常方便和高效。不过它们也有不同之处,最大的区别就 是Numpy会把ndarray放在CPU中进行加速运算,而由Torch产生的Tensor会 放在GPU中进行加速运算(假设当前环境有GPU。

2.1.1 Tensor概述

对Tensor的操作很多,从接口的角度来划分,可以分为两类:
1)torch.function,如torch.sum、torch.add等;
2)tensor.function,如tensor.view、tensor.add等。
这些操作对大部分Tensor都是等价的,如torch.add(x,y)与x.add(y)等价。
在实际使用时,可以根据个人爱好选择。
如果从修改方式的角度来划分,可以分为以下两类:
1)不修改自身数据,如x.add(y),x的数据不变,返回一个新的
Tensor。
2)修改自身数据,如x.add_(y)(运行符带下划线后缀),运算结果存
在x中,x被修改。

import torch
x=torch.tensor([1,2])
y=torch.tensor([3,4])
z=x.add(y)
print(z)
print(x)
x.add_(y)
print(x)

2.1.2 创建Tensor

创建Tensor的方法有很多,可以从列表或ndarray等类型进行构建,也可根据指定的形状构建。常见的创建Tensor的方法可参考表2-1。

在这里插入图片描述
下面举例说明。

import torch
#根据list数据生成Tensor
torch.Tensor([1,2,3,4,5,6])
#根据指定形状生成Tensor
torch.Tensor(2,3)
#根据给定的Tensor的形状
t=torch.Tensor([[1,2,3],[4,5,6]])
#查看Tensor的形状
t.size()
#shape与size()等价方式
t.shape
#根据已有形状创建Tensor
torch.Tensor(t.size())

【说明】
注意torch.Tensor与torch.tensor的几点区别:
1)torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。

2)torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是随机初始化的值。

import torch
t1=torch.Tensor(1)
t2=torch.tensor(1)
print("t1的值{},t1的数据类型{}".format(t1,t1.type()))
print("t2的值{},t2的数据类型{}".format(t2,t2.type()))

下面是根据一定规则,自动生成Tensor的一些例子。

import torch
#生成一个单位矩阵
torch.eye(2,2)
#自动生成全是0的矩阵
torch.zeros(2,3)
#根据规则生成数据
torch.linspace(1,10,4)
#生成满足均匀分布随机数
torch.rand(2,3)
#生成满足标准分布随机数
torch.randn(2,3)
#返回所给数据形状相同,值全为0的张量
torch.zeros_like(torch.rand(2,3))

2.1.3 修改Tensor形状

在处理数据、构建网络层等过程中,经常需要了解Tensor的形状、修改
Tensor的形状。与修改Numpy的形状类似,修改Tenor的形状也有很多类似
函数,具体可参考表2-2。

在这里插入图片描述
以下为一些实例:

import torch
#生成一个形状为2x3的矩阵
x = torch.randn(2, 3)
#查看矩阵的形状
x.size() #结果为torch.Size([2, 3])
#查看x的维度
x.dim() #结果为2
#把x变为3x2的矩阵
x.view(3,2)
#把x展平为1维向量
y=x.view(-1)
y.shape
#添加一个维度
z=torch.unsqueeze(y,0)
#查看z的形状
z.size() #结果为torch.Size([1, 6])
#计算Z的元素个数
z.numel() #结果为6

【说明】
torch.view与torch.reshpae的异同
1)reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。
但view()只可由torch.Tensor.view()来调用。
2)对于一个将要被view的Tensor,新的size必须与原来的size与stride兼
容。否则,在view之前必须调用contiguous()方法。
3)同样也是返回与input数据量相同,但形状不同的Tensor。若满足
view的条件,则不会copy,若不满足,则会copy。
4)如果你只想重塑张量,请使用torch.reshape。如果你还关注内存使用
情况并希望确保两个张量共享相同的数据,请使用torch.view。

2.1.4 索引操作

Tensor的索引操作与Numpy类似,一般情况下索引结果与源数据共享内
存。从Tensor获取元素除了可以通过索引,也可以借助一些函数,常用的选
择函数可参考表2-3。

在这里插入图片描述

import torch
#设置一个随机种子
torch.manual_seed(100)
#生成一个形状为2x3的矩阵
x = torch.randn(2, 3)
#根据索引获取第1
### Pytorch基础教程入门指南 #### 一、Pytorch简介 Pytorch是一个开源的机器学习库,支持从研究原型到生产部署的无缝流转。其灵活性和易用性使得它成为学术界和工业界的首选工具之一[^1]。 #### 二、环境搭建 为了能够顺利运行Pytorch程序,在开始前需确保已正确安装Pytorch及相关依赖包。推荐通过官方渠道获取最新版本,并按照提示完成配置工作。对于希望快速启动的朋友来说,可以尝试如下命令来进行简易安装: ```bash pip install torch torchvision ``` 这一步骤会自动处理好大部分必要的组件,让使用者尽快投入到实际编码当中去[^3]。 #### 三、核心概念理解 ##### (一)张量(Tensor)操作 作为Pytorch中最基本的数据结构——`tensor`(即多维数组),提供了丰富的API用于创建、变换以及计算各种类型的数值矩阵。值得注意的是,相较于其他方式初始化得到的对象,默认情况下`torch.Tensor()`采用浮型(`FloatTensor`)存储元素;而`torch.tensor()`则更倾向于依据输入源自行判断合适的类型[^2]。 ##### (二)自动求导机制(Autograd) Autograd是实现动态图的核心特性之一,允许开发者轻松定义复杂的数学表达式并高效地对其进行微分运算。具体而言,每一个参与算式的变量都会被记录下来形成所谓的“计算图”,从而便于后续反向传播过程中逐层传递误差信号直至最底层权重参数得以调整优化。 #### 四、实践案例分享 借助于上述理论知识的支持,下面将以构建简单的全连接神经网络为例展示如何利用Pytorch框架解决实际问题: - **定义模型架构**:基于给定的任务需求设计合理的层次组合; - **指定代价函数(loss function)**:衡量预测值与真实标签间的差异程度; - **执行正/逆向传播过程**:前者负责生成输出结果,后者用来修正内部权值偏差; - **迭代更新策略**:根据所得梯度信息适时修改各节系数以期达到最优解状态。 此外,针对特定应用场景如图像识别等领域内的分类任务,还可以进一步探索卷神经网络(CNNs)的设计思路及其对应的实现方法。 #### 五、性能加速技巧 考虑到现代硬件设备的强大计算能力,合理调配资源往往能带来显著的速度提升效果。比如启用CUDA扩展接口即可使整个流程迁移至图形处理器(GPU)之上运作,进而大幅缩短耗时周期提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值