24.11.20 深度学习 前置 torch框架

基本创建方式

以下讲的创建tensor的函数中有两个有默认值的参数dtype和device, 分别代表数据类型和计算设备,可以通过属性dtype和device获取。

1.1 torch.tensor

注意这里的tensor是小写,该API是根据指定的数据创建张量。

python 复制代码
import numpy as np
import torch

# 标量创建张量
t1 = torch.tensor(5)
print(t1, t1.shape)
# numpy随机数组来创建张量
t2 = torch.tensor(np.random.randint(1, 10, (3, 3)))
print(t2, t2.shape)
# list来创建张量
t3 = torch.tensor([[1, 2, 3, 4],
                   [5, 6, 7, 8]])
print(t3, t3.shape)

# tensor(5) torch.Size([])
# tensor([[4, 2, 3],
#         [4, 7, 7],
#         [3, 4, 3]], dtype=torch.int32) torch.Size([3, 3])
# tensor([[1, 2, 3, 4],
#         [5, 6, 7, 8]]) torch.Size([2, 4])

torch.Tensor

注意这里的Tensor是大写,该API根据形状创建张量,其也可用来创建指定数据的张量。

python 复制代码
import torch

# 可以根据形状来确定
t1 = torch.Tensor((2,3))
print(t1,t1.shape,t1.dtype)
# 也可以是具体的值
t2 = torch.Tensor([[1,2,3],
                   [4,5,6]])
print(t2,t2.shape,t2.dtype)

torch.IntTensor

用于创建指定类型的张量,还有诸如Torch.FloatTensor、 torch.DoubleTensor、 torch.LongTensor......等。

如果数据类型不匹配,那么在创建的过程中会进行类型转换,要尽可能避免,防止数据丢失。

python 复制代码
    t = torch.IntTensor([10,20,30])
    t = torch.FloatTensor([10,20,30])
    t = torch.DoubleTensor([10,20,30])
    t = torch.LongTensor([10,20,30])
    t = torch.HalfTensor([10,20,30])
    t = torch.BoolTensor([True,False])
    t = torch.tensor([10,20,257],dtype=torch.int8,device='cuda')
    print(t)
    print(t.shape)
    print(t.dtype)
    print(t.device)

创建线性和随机张量

在 PyTorch 中,可以轻松创建线性张量和随机张量。

创建线性张量

使用torch.arange 和 torch.linspace 创建线性张量:

python 复制代码
import torch
# 创建线性张量
t1 = torch.arange(1,10,2)
print(t1)
# 指定空间按照元素个数:等差
t2 = torch.linspace(1,10,3)
print(t2)
# 指定空间按照元素个数:等比
t3 = torch.logspace(1,8,8,base=2)# 2的一次方到2的五次方之间生成9个等比数
print(t3)
随机张量

使用torch.randn 创建随机张量。

随机数种子

随机数种子(Random Seed)是一个用于初始化随机数生成器的数值。随机数生成器是一种算法,用于生成一个看似随机的数列,但如果使用相同的种子进行初始化,生成器将产生相同的数列。

随机数种子的设置和获取 torch.manual_seed(666) # 随机种子是666

torch.initial_seed() # 获取随机种子

随机张量

在 PyTorch 中,种子影响所有与随机性相关的操作,包括张量的随机初始化、数据的随机打乱、模型的参数初始化等。通过设置随机数种子,可以做到模型训练和实验结果在不同的运行中进行复现。

python 复制代码
import torch

# 设置随机种子
torch.manual_seed(666)
# 获取随机种子
print("随机种子是:",torch.initial_seed())
# 随机张量
t1 = torch.rand((3,3))
print(t1)
# 随机张量:标准正态分布
t2 = torch.randn(1,5)
print(t2)
# 原生服从正态分布:均值为2,方差为3,形状为1*4的正态分布
t3 = torch.normal(mean=2,std=3,size=(1,4))
print(t3)

创建01张量

在 PyTorch 中,你可以通过几种不同的方法创建一个只包含 0 和 1 的张量

python 复制代码
import torch
import numpy as np
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("被仿照的tensor:",st)
# 全0
z1 = torch.zeros((4,4))
print(z1)
z2 = torch.zeros_like(st)
print(z2)
# 全1
o1 = torch.ones((4,4))
print(o1)
o2 = torch.ones_like(st)
print(o2)

创建指定值张量

torch.full 和 torch.full_like 创建全为指定值张量。

python 复制代码
import torch
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("被仿照的tensor:",st)
# 指定所有值为666的3*3的tensor
t1 = torch.full((3,3),666)
print(t1)
# 仿照形状创建一个指定值为555的tensor
t2 = torch.full_like(st,555)
print("仿照后指定值创建的tensor:",t2)

创建单位矩张量

创建对角线上为1的单位张量

python 复制代码
import torch
# 创建一个5*5的单位矩张量
t1 = torch.eye(5)
print(t1)

Tensor常见属性

张量有device、dtype、shape等常见属性,知道这些属性对我们认识Tensor很有帮助。

获取属性

python 复制代码
import torch
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print(st,"st的里面装的数据的数据类型:",st.dtype)
print("st在CPU上还是显卡上:",st.device)
print("st的形状",st.shape)

st2 = torch.tensor(np.random.randint(1,100,(5,5)),device="cuda")
print(st2,"st2的里面装的数据的数据类型:",st2.dtype)
print("st2在CPU上还是显卡上:",st2.device)
print("st2的形状",st2.shape)

切换设备

默认在cpu上运行,可以显式的切换到GPU:不同设备上的数据是不能相互运算的

python 复制代码
import torch
# 切换设备
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("st在CPU上还是显卡上:",st.device)
# 第一种切换: 张量.cuda()
st = st.cuda()
print(st.device)
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("st在CPU上还是显卡上:",st.device)
# 第一种切换的判断写法
st = (st.cuda() if torch.cuda.is_available() else st)
print(st.device)


# 第二种切换: 张量.to("cuda")
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("st在CPU上还是显卡上:",st.device)
st = st.to("cuda")
print(st.device)
# 第二种切换的判断写法
# 初始化一个5*5的tensor
st = torch.tensor(np.random.randint(1,100,(5,5)))
print("st在CPU上还是显卡上:",st.device)
st = st.to("cuda" if torch.cuda.is_available() else "cpu")
print(st.device)

# 直接在GPU上创建张量
data = torch.tensor([1, 2, 3], device='cuda')
print(data.device)

类型转换

在训练模型或推理时,类型转换也是张量的基本操作,是需要掌握的

相关推荐
冬奇Lab几秒前
一天一个开源项目(第105篇):Academic Research Skills - 学术研究全流程 AI 代理套件,及其工作流设计的启示
人工智能·开源·资讯
冬奇Lab2 分钟前
RAG 系列(二十一):性能优化——又快又省钱
人工智能·llm
Robot_Nav11 分钟前
深度学习与强化学习面试八股文知识点汇总
人工智能·深度学习·强化学习
Z1Y492Vn3ZYD9et3B0635 分钟前
李彦宏:今年小龙虾明年可能螃蟹,AI的杀手级产品还没定型
人工智能
啊哈哈121381 小时前
系统设计复盘:为什么 Agent 的 ReAct 循环必须内嵌确定性保护层——以 FitMind 健康助手的路由与步骤控制为例
人工智能·python·react
@蔓蔓喜欢你1 小时前
数据可视化入门:让你的数据说话
人工智能·ai
2401_832298101 小时前
破解智能体幻觉难题,OpenClaw思维链重构,夯实工业级执行可靠性
人工智能
沪漂阿龙1 小时前
面试题详解:检索链路设计全攻略——RAG 检索架构、查询理解、多路召回、混合检索、Rerank、上下文构造与评估闭环
大数据·人工智能·架构
金融小师妹1 小时前
基于AI通胀预期模型与美元流动性监测框架的黄金6周新低行分析:美元五连涨周期下贵金属定价机制重构研究
大数据·人工智能·重构·逻辑回归·线性回归
gaosushexiangji1 小时前
DIC系统推荐:基于千眼狼三维数字图像相关的无人机旋翼疲劳试验全场应变与位移测量
人工智能·算法