您现在的位置是:首页 >技术交流 >DataWhale 二月组队学习 -- 深入浅出Pytorch网站首页技术交流

DataWhale 二月组队学习 -- 深入浅出Pytorch

NeoFii 2025-12-19 12:01:02
简介DataWhale 二月组队学习 -- 深入浅出Pytorch

简介

Pytorch是当前主流的开源深度学习框架,基于Torch库开发,由Meta(原Facebook)团队创建。主要应用于人工智能领域如CV,NLP等。

有关Pytorch的介绍、安装和相关学习资源,请参考DataWhale的开源项目thorough-pytorch

基本概念

1. 张量 (tensor)

张量是机器学习领域中重要的基础数据结构,可以简单理解为多维数组的扩展形式,比如:

  • 0维张量:即为标量,基本的数字
  • 1维张量:也称为向量,在标量的基础上加上了方向
  • 2维张量:常见的矩阵即为2维张量
  • 3维张量:图片即为三维张量,包含三个维度分别为宽度,高度和通道数(3表示RGB三原色组成的图片,1表示灰度图)
    等等…

互联网上的数据形式多样,通过增加维度数组成新的数据形式

2. 创建张量

这部分内容与numpy相似,涉及以下几个知识点

  • 随机初始化矩阵
import torch # 下载的是pytorch 导入的是torch 

x = torch.rand(2,5) # rand中的参数即为创建的张量形状 此处表示二维张量 形状为2行5列
print(x)

"""output: 
tensor([[0.2190, 0.4405, 0.0621, 0.4368, 0.1064],
        [0.3914, 0.5235, 0.5057, 0.9916, 0.3479]])
每一个单元数据都是随机初始化的
"""
  • 构造全0矩阵
import torch

x = torch.zeros(4, 3, dtype=torch.long) # dtype指定了单元数据的数据类型
print(x)
"""output:
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
"""
  • 自我构建tensor向量
import torch

x = torch.tensor([2, 34])
print(x)
"""output:
tensor([ 2, 34])
"""
  • 基于已存在的tensor,创建一个新的tensor,新创建的tensor具有与原tensor相同的形状和数据类型,且新张量的元素值服从标准正态分布
import torch

original_tensor = torch.tensor([[1, 2], [3, 4]])
new_tensor = torch.randn_like(original_tensor)

print("Original Tensor:
", original_tensor)
print("New Tensor:
", new_tensor)

# output:
# Original Tensor:
# tensor([[1, 2],
#         [3, 4]])
# New Tensor:
# tensor([[-0.5412,  1.2034],
#         [ 0.7632, -0.9321]])

original tensor是torch.int64(默认的整数类型),但是randn_like函数会将生成的张量自动转换为torch.float32(默认的浮点数类型)
还有一些常见的构造Tensor的函数:

函数功能描述参数说明
Tensor(sizes)基础构造函数,创建未初始化张量sizes: 张量维度(元组形式)
tensor(data)从数据直接创建张量(自动推断类型)data: Python列表/NumPy数组等
ones(sizes)创建全1张量(默认float32类型)sizes: 张量维度
zeros(sizes)创建全0张量(默认float32类型)sizes: 张量维度
eye(n)创建n×n单位矩阵(对角线为1,其余为0)n: 矩阵维度
arange(s, e, step)创建从s到e(不包含e),步长为step的一维张量s: 起始值,e: 结束值,step: 步长
linspace(s, e, steps)创建从s到e(包含e),均匀分成steps个元素的张量s: 起始值,e: 结束值,steps: 元素数量
rand(sizes)生成[0,1)区间均匀分布的随机数张量sizes: 张量维度
randn(sizes)生成服从标准正态分布(N(0,1))的随机数张量sizes: 张量维度
normal(mean, std)生成服从指定正态分布(N(mean, std))的随机数张量mean: 均值,std: 标准差
randperm(n)生成0到n-1的随机排列(常用于索引打乱)n: 元素个数

注意:

  • 所有尺寸参数接收tuple形式(例如:(3, 224, 224))
  • 默认数据类型可通过dtype参数指定(例如:torch.float64)
  • 设备选择可通过device参数指定(例如:device=‘cuda’)
  • 生成随机数时可通过torch.manual_seed()设置随机种子保证可重复性

3. 张量的操作
张量支持常见的加减乘除四则运算

  • 加法
import torch
# 方式1
y = torch.rand(4, 3) 
print(x + y)

# 方式2
print(torch.add(x, y))

# 方式3 提供一个输出 tensor 作为参数
# 这里的 out 不需要和真实的运算结果保持维数一致,但是会有警告提示!
result = torch.empty(5, 3) 
torch.add(x, y, out=result) 
print(result)

# 方式4 in-place
y.add_(x) 
print(y)
  • 索引 与numpy类似
    索引出来的结果与原数据共享内存,修改一个,另一个会跟着修改。如果不想修改,可以考虑使用copy()等方法

import torch

a = torch.tensor([[22,65], [13, 43]])
b = a[0,:] # 取第一行数据
# output: tensor([22, 65])

修改tensor的大小或形状,使用方法torch.view

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # -1是指这一维的维数由其他维度决定
print(x.size(), y.size(), z.size())

注意

  • view() 返回的新tensor与源tensor共享内存(其实是同一个tensor),也即更改其中的一个,另 外一个也会跟着改变。(顾名思义,view仅仅是改变了对这个张量的观察⻆度)

4. 广播机制

当两个形状不同的tensor做元素运算时触发广播机制,即将两个tensor转换成两个形状相同后再做运算,比如一个(2,1)形状的tensor与一个形状(2,2)的tensor做加法,(2,1)的tensor通过广播机制变成(2,2)的形状,然后做加法

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。