Bootstrap

24.11.20 深度学习 前置 torch框架

基本创建方式

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

1.1 torch.tensor

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

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根据形状创建张量,其也可用来创建指定数据的张量。

 

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......等。

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

    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 创建线性张量:

 

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

 

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 的张量

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 创建全为指定值张量。

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的单位张量

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

 

Tensor常见属性

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

获取属性

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:不同设备上的数据是不能相互运算的

 

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)

类型转换

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

;