Pytorch基础(一)数据类型和创建数据

本文介绍了PyTorch中的数据类型,主要为tensor,并详细讲解了如何在CPU和GPU上创建和转换数据类型。内容涵盖了一维至四维张量的创建方法,包括从numpy转换、随机初始化、指定数值填充等。此外,还讨论了张量的形状操作和类型检查,以及数据类型的默认设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pytorch基础(一)数据类型和创建数据

数据类型

Pytorch中的数据类型主要是tensor:

在这里插入图片描述

这种数据类型与python解释器本身数据类型可以对应。但str类型有所不同。一般用一下几种方式表示字符串:

  • One-hot
  • Embedding
    • Word2vec
    • glove

在python解释器中,数据无论在cpu还是gpu数据类型是相同的。但在pytorch中cpu和gpu中的数据有所不同:

在这里插入图片描述

类型检验:

a = torch.randn(2, 3)

# 输出a的类型
# 法1
print(a.type()) # 'torch.FloatTensor'
# 法2
print(type(a)) # torch.FloatTensor

# 在程序中做数据类型的合法化检验可以用isinstance函数
isinstance(a, torch.FloatTensor) # True

##########放在CPU和GPU上的数据类型会不同##########
isinstance(a, torch.cuda.FloatTensor) # False
a = a.cuda()
isinstance(a, torch.cuda.FloatTensor) # True

标量(Dim 0),常用于LOSS的值:

  • pytorch0.3之后的版本才有Dim0的tensor
# 标量在pytorch中是零维的tensor
a = torch.tensor(2.2)

print(a.shape) # torch.Size([])

print(len(a.shape)) # 0

print(a.size()) # torch.Size([])

Dim为1的张量,常用于Bias的值或batch为1的全连接层的输入输出:

a = torch.tensor([1.1, 2.2]) # tensor接受的这个向量具体的数据

a = torch.FloatTensor(2) # 带数据类型的,比如FloatTensor,接收的是这个向量的长度,这里长度为2,具体数据为随机初始化

# 也可从numpy中引入
a = np.ones(2)
torch.from_numpy(a)

Dim为2的张量,常用于batch size不为1的全连接层

a = torch.randn(2, 3)

print(a.shape) # torch.Size([2, 3])
print(a.shape(0)) # 2
print(a.shape(1)) # 3

Dim为3的张量,常用于RNN的input batch

a = torch.rand(1, 2, 3)

print(a.shape) # torch.Size([1, 2, 3])

list(a.shape) # [1, 2, 3]

Dim为4的张量,常用于CNN的input batch

补充:

a.numel() # 返回a所占的内存数量大小(各个维度相乘)
a.dim() # 返回a的维度

创建tensor

方法1: from numpy

a = np.array([2.2, 3.3]) # 在np中创建一个张量
torch.from_numpy(a) # 将这个array转化为torch中的tensor(从numpy导入的float会变成double)

方法2:from list

a = torch.tensor([2.2, 3.3]) # 直接将list放入tensor中
# 注意,torch.tensor与torch.Tensor不同
# torch.tensor接收的是张量的data
# torch.Tensor接收的是张量的shape,在特殊情况下也会接收data
a = torch.Tensor(2, 3) # 这种格式是创建两行三列的一个二维张量,随机初始化
a = torch.Tensor([2,3]) # 这种格式是创建一个数据为[2,3]的张量。
# 为了避免混淆,一般只用torch.tensor接收具体数据,只用torch.Tensor/torch.FloatTensor接受shape
  • torch.tensortorch.Tensor默认创建的数据类型是Float Tensor
  • 可以使用torch.set_default_tensor_type(torch.DoubleTensor)将默认类型改变为double(增强学习中常用DoubleTensor)

方法3:uninitialized tensor

  • 未初始化的tensor一定要在后续填入数据,否则可能在运行时造成麻烦(直接喂给网络容易出现nan或inf)
a = torch.empty(2, 3) # 接收shape

# 下面这种接收shape的方式也是会创建未初始化的张量
a = torch.IntTensor(2, 3)
a = torch.Tensor(2, 3)

方法4:随机初始化

# 范围为[min,max)的均匀采样的随机张量
a = torch.rand(2, 3) # 接收shape,均匀采样随机创建0到1之间的数据(不包括1)
b = torch.rand_like(a) # 以rand的方式创建一个shape与a相同的tensor

a = troch.randint(1, 10, [2, 3]) # 整型的随机张量,均匀采样范围1到10(不包括10),shape为[2,3]

#范围为[min,max)的正态分布的随机张量
a = torch.randn(3, 3) # 均值为0标准差为1的正态分布随机量,shape为[3,3]

方法5:将张量中的元素全部赋值为一个数值

a = torch.full([2 ,3], 4) # shape为[2,3]的张量,数据全部赋值为4

方法6:等差数列

a = torch.arange(0, 6, 2) # 返回tensor([0,2,4]),前两个参数是范围,范围包括左边不包括右边,最后一个参数是公差

# 返回tensor([0.,1.,2.,3.])。前两个参数是范围,范围左右两边都能包括,最后一个参数是等分的数量
a = torch.linspace(0, 3, steps = 4) 

# 生成10^1到10^2的,5个数构成的等比数列
a = torch.logspace(1,2,base = 10, steps = 5) 

补充

a = torch.ones(2, 3) # 全部是1的张量
a = torch.zeros(2, 3) # 全部是0的张量
a = torch.eye(2, 3) # 单位矩阵

# 将两组有对应关系的tensor进行打乱,但不改变对应关系,这时候可以用torch.randperm()
a = torch.tensor([[100,99,98], [61,62,63]])
b = troch.tensor([[1, 2, 3], [6, 7, 8]])
idx = torch.tensor([1, 0])
a = a[idx]
b = b[idx]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值