深度学习:张量标量概念、PyTorch张量创建、类型转换等
前言:前一篇文章介绍了PyTorch概念,此次介绍PyTorch的API。
本文目录:
- 一、张量和标量
- 张量
- 标量
- 标量与张量的关系
- 二、PyTorch创建张量
- (一)根据torch.tensor(data=, dtype=) 根据指定数据创建张量;
- (二)torch.Tensor(size=) 根据形状创建张量, 其也可用来创建指定数据或者指定类型的张量;
- (三)torch.arange(start=, end=, step=):固定步长线性张量;torch.linspace(start=, end=, steps=):固定元素数线性张量;
- (四)torch.randn/rand(size=) 创建随机浮点类型张量;torch.randint(low=, high=, size=) 创建随机整数类型张量,左闭右开;torch.initial_seed() 和 torch.manual_seed(seed=) 随机种子设置;
- (五)torch.zeros(size=) 和 torch.zeros_like(input=) 创建全0张量;
- (六)torch.ones(size=) 和 torch.ones_like(input=) 创建全1张量;
- (七)torch.full(size=, fill_value=) 和 torch.full_like(input=, fill_value=) 创建全为指定值张量;
- 三、类型转换
- (一)张量类型转换
- (二)张量、标量和numpy相互转换
一、张量和标量
张量和标量是深度学习和科学计算中最基本的数据表示形式,它们之间有着明确的区别和联系。
张量
元素为同一种数据类型的多维矩阵,与NumPy数组类似,张量既有数值,也有方向,可以看做是标量的高维扩展。
标量
标量是零维的单个数值,没有方向,只有大小。
标量与张量的关系
二、PyTorch创建张量
(一)根据torch.tensor(data=, dtype=) 根据指定数据创建张量;
import numpy as np
# 导入torch库,用于创建和操作张量
import torch# 创建并打印各种形状和类型的张量
print(torch.tensor(10))
print(torch.tensor([10],dtype=torch.int))
print(torch.tensor([[10]]))
print(torch.tensor([[[10]]]))
print(torch.tensor([[10,20],[30,40]]))# 从numpy数组创建并打印张量
print(torch.tensor(np.array([[10,20],[30,40]])))
(二)torch.Tensor(size=) 根据形状创建张量, 其也可用来创建指定数据或者指定类型的张量;
# 创建并打印各种形状的浮点数张量
print(torch.Tensor(5))# 指定形状,多的‘.’代表浮点,生成5个0
print(torch.Tensor(2,3))# 指定形状,生成2行3列0(浮点数)
print(torch.Tensor(size=(2,3))) #指定size
# 计算并打印张量的维度
print(torch.Tensor([10]).ndim)
print(torch.Tensor([[[10]]]).ndim)# 通过列表和numpy数组创建并打印张量
print(torch.Tensor([[10,20],[30,40]]))
print(torch.Tensor(np.array([[10,20],[30,40]])))# 使用指定的数据类型创建并打印张量
print(torch.IntTensor([[10.2,20.7],[30.5,40.9]]))# 输出10,20,30,40,int32
print(torch.FloatTensor([[10,20],[30,40]]))# 输出10,20,30,40,float32
print(torch.LongTensor([[10,20],[30,40]]))# int64
print(torch.ShortTensor([[10,20],[30,40]]))# int16
print(torch.ByteTensor([[10,20],[30,40]]))# uint8
print(torch.HalfTensor([[10,20],[30,40]]))# float16
(三)torch.arange(start=, end=, step=):固定步长线性张量;torch.linspace(start=, end=, steps=):固定元素数线性张量;
# 1. 在指定区间按照步长生成元素 [start, end, step) 左闭右开
data = torch.arange(0, 10, 2)
print(data)# 2. 在指定区间按照元素个数生成 [start, end, steps] 左闭右闭
# step = (end-start) / (steps-1)
# value_i = start + step * i
data = torch.linspace(0, 9, 10)
print(data)
(四)torch.randn/rand(size=) 创建随机浮点类型张量;torch.randint(low=, high=, size=) 创建随机整数类型张量,左闭右开;torch.initial_seed() 和 torch.manual_seed(seed=) 随机种子设置;
# 1. 创建随机张量
data = torch.randn(2, 3) # 创建2行3列张量
print(data)
# 查看随机数种子
print('随机数种子:', torch.initial_seed())# 2. 随机数种子设置
torch.manual_seed(100)
data = torch.randn(2, 3)
print(data)
print('随机数种子:', torch.initial_seed())
(五)torch.zeros(size=) 和 torch.zeros_like(input=) 创建全0张量;
# 1. 创建指定形状全0张量
data = torch.zeros(2, 3)
print(data)# 2. 根据张量形状创建全0张量
data = torch.zeros_like(data)
print(data)
(六)torch.ones(size=) 和 torch.ones_like(input=) 创建全1张量;
# 1. 创建指定形状全1张量
data = torch.ones(2, 3)
print(data)# 2. 根据张量形状创建全1张量
data = torch.ones_like(data)
print(data)
(七)torch.full(size=, fill_value=) 和 torch.full_like(input=, fill_value=) 创建全为指定值张量;
# 1. 创建指定形状指定值的张量
data = torch.full([2, 3], 10)
print(data)# 2. 根据张量形状创建指定值的张量
data = torch.full_like(data, 20)
print(data)
三、类型转换
(一)张量类型转换
#类型转换
data=torch.rand(2,3)
print(data.dtype)
#类型转换方式1
print(data.type(torch.int32))
print(data.type(torch.float32))
print(data.type(torch.int64))
print(data.type(torch.int16))
print(data.type(torch.int8))
print(data.type(torch.uint8))#类型转换方式2
print(data.type(torch.double))
print(data.type(torch.long))
print(data.type(torch.short))
print(data.type(torch.half))
print(data.type(torch.bool))
#类型转换方式3
print(data.type(torch.ShortTensor))
print(data.type(torch.FloatTensor))
print(data.type(torch.LongTensor))
print(data.type(torch.IntTensor))
print(data.type(torch.DoubleTensor))
print(data.type(torch.HalfTensor))
(二)张量、标量和numpy相互转换
#标量转numpy
print(data.numpy())#numpy转张量,共享内存,但id不同
n1=np.array([1,2,3])
print(n1,id(n1))
t1=torch.from_numpy(n1)
print(t1,id(t1)) #n1和t1的id不同
【验证n1和t1是否共享内存:
n1[0] = 100 # 修改 NumPy 数组
print("修改后的 NumPy 数组:", n1)
print("PyTorch 张量是否同步变化:", t1) # 结果显示:t1同步变为 tensor([100, 2, 3]),说明n1和t1共享内存】#使用copy不共享内存
n2=np.array([1,2,3])
print(n2,id(n2))
print(torch.from_numpy(n2.copy()),id(torch.from_numpy(n2.copy()))) #张量转标量
n3=3
print(torch.tensor(n3).item()) #先将3转为张量,再转为了标量;单数值numpy转标量也可用item()#标量转张量
print(torch.tensor(3)) #标量3被转为张量
今天的分享到此结束。