您现在的位置是:首页 >技术交流 >DataWhale 二月组队学习 -- 深入浅出Pytorch网站首页技术交流
DataWhale 二月组队学习 -- 深入浅出Pytorch
简介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)的形状,然后做加法
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结