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)

类型转换

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

相关推荐
羑悻的小杀马特8 分钟前
把随身WiFi改成网盘聚合器:中兴F50挂载本地存储+夸克网盘实战
运维·服务器·人工智能·网盘·openlist
meilindehuzi_a16 分钟前
从跑分到生产力:重新理解大模型基准测试与分层协作
人工智能
蜜桃味女焊匠人1 小时前
焊接生产线优化思路:解决手工焊、机器人焊气体浪费问题
人工智能·经验分享·其他·机器人
Georgeviewer6 小时前
商业落地评测|实体门店GEO优化性价比与服务体系深度复盘
大数据·人工智能
GuWenyue6 小时前
分不清AI Workflow与Agent?3个实战案例彻底讲透,做AI应用不再踩选型坑
人工智能
彩讯股份3006347 小时前
彩讯股份与心洲科技签署战略合作协议,共建企业级模型后训练能力
人工智能·科技
迅易科技7 小时前
从场景验证到Agent上线:迅易 × WorkBuddy如何帮助企业建设AI能力?
人工智能·ai·腾讯云
PNP Robotics8 小时前
多伦多大学机器人峰会|物理AI与具身智能落地新趋势
人工智能·深度学习·机器学习·机器人
GIR1238 小时前
官方出品 | 多通道土壤呼吸测量系统市场现状与十五五规划深度报告:行业分析+趋势预测全收录
大数据·人工智能·机器学习
绿算技术8 小时前
绿算技术亮相第十八届HPC AI中国年会,擘画AI基础设施全栈协同新图景
人工智能