Pytorch使用教学2-Tensor的维度
创始人
2024-11-24 04:38:00
0

在这里插入图片描述

PyTorch使用的过程中,维度转换一定少不了。而PyTorch中有多种维度形变的方法,我们该在什么场景下使用什么方法呢?

本小节我们使用的张量如下:

# 一维向量 t1 = torch.tensor((1, 2)) # 二维向量 t2 = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 三维向量 t3 = torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]]]) 

1 张量的维度与形状

张量为一组数的结构化表示。简单理解,向量就是一维数组,矩阵为二维数组,此外我们还可以定义更高维度的数组。张量的高维数组和Numpy中高维Array概念类似。

1.1 ndim查看张量维度

print(t1.ndim, t2.ndim, t3.ndim, sep = ', ') # 1, 2, 3 # t1为1维向量 # t2为2维矩阵 # t3为3维张量 

1.2 shape&size()查看向量的形状

print(t1.shape, t2.shape, t3.shape, sep = ', ') # torch.Size([2]), torch.Size([2, 3]), torch.Size([2, 2, 2])  print(t1.size(), t2.size(), t3.size(), sep = ', ') # torch.Size([2]), torch.Size([2, 3]), torch.Size([2, 2, 2]) 

t1向量torch.Size([2])的理解:向量的形状是1行2列。

t2矩阵torch.Size([2, 3])的理解:包含两个一维向量,每个一维向量的形状是1行3列。

t3矩阵torch.Size([2, 2, 2])的理解:包含两个二维矩阵,每个二维矩阵的形状是2行2列。

1.3 numel()查看张量中的元素个数

print(t1.numel(), t2.numel(), t3.numel(), sep = ', ') # 2, 6, 8 # t1向量中共有2个元素 # t2矩阵中共有6个元素 # t3张量中共有8个元素 

1.4 形状相同的数组可创建一个高维张量

import numpy as np a1 = np.array([[1, 2], [3, 4]]) a2 = np.array([[5, 6], [7, 8]]) t3 = torch.tensor([a1, a2]) print(t3) # tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) 

2 张量的形变

2.1 flatten()将任意维度张量转为一维张量

t2.flatten() # tensor([1, 2, 3, 4, 5, 6])  t3.flatten() # tensor([1, 2, 3, 4, 5, 6, 7, 8]) 

2.2 reshape()任意变形

形变维度的乘积需要等于张量元素的个数。

# 将`t3`变成2×4的矩阵 t3.reshape(2, 4) #tensor([[1, 2, 3, 4],[5, 6, 7, 8]])  # 将`t3`变成1×4×2的矩阵 t3.reshape(1, 4, 2) # tensor([[[1, 2], [3, 4], [5, 6], [7, 8]]]) 

2.3 squeeze()&unsqueeze()

  • squeeze()的作用是压缩张量,去掉维数为1位置的维度
# 将t3的维度变为2×1×4 t_214 = t3.reshape(2, 1, 4) print(t_214) # tensor([[[1, 2, 3, 4]], [[5, 6, 7, 8]]])  # 使用squeeze()将其变成2×4,去掉维度为1位置的维度 t_24 = t_214.squeeze(1) print(t_24) # tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) 
  • unsqueeze()的作用是解压张量,给指定位置加上维数为一的维度。
# 将2×4的维度再转换成2×1×4,在第二个维度上加一维 # 索引是从0开始的。参数0代表第一维,参数1代表第二维,以此类推 print(t_24.unsqueeze(1)) tensor([[[1, 2, 3, 4]], [[5, 6, 7, 8]]]) 

2.4 维度变化总结

一般我们最常使用的就是flatten()reshape()。仔细思考的同学们肯定也可以发现,reshape()也可以实现flatten()的功能,reshape()所需的参数就是张量中的元素数。

print(t3.flatten()) # tensor([1, 2, 3, 4, 5, 6, 7, 8])  print(t3.reshape(t3.numel())) # tensor([1, 2, 3, 4, 5, 6, 7, 8]) 

3 特殊的零维张量

Tensor的零维张量只包含一个元素,可以理解为标量,只有大小,没有方向。

3.1 零维张量的属性

# 零维张量的创建只有一个数,不具备一维或多维的概念 t0 = torch.tensor(1)  # 因为它是标量,所以维度是0 print(t0.ndim) # 0  # 因为它是标量,所以也不具有形状 print(t0.shape) # torch.Size([])  # 它没有维度,但是有一个数 print(t0.numel()) # 1 

3.2 零维张量的转化

使用flatten()reshape()可以将标量转为向量。

t0 = torch.tensor(1) print(t0.flatten()) # tensor([1])  t0 = torch.tensor(1) print(t0.reshape(1)) # tensor([1]) 

4 再谈什么是张量

在这里插入图片描述
Tensor是一个多维数组,它是标量、向量、矩阵的高维拓展。

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取
在这里插入图片描述

相关内容

热门资讯

黑科技辅助!wepoke透明挂... 黑科技辅助!wepoke透明挂在哪买(透视)软件透明挂ai辅助器(一直真的是有挂)-哔哩哔哩,wep...
黑科技辅助!红龙扑克会作假(透... 黑科技辅助!红龙扑克会作假(透视)软件透明挂ai辅助工具(本来是真的有挂)-哔哩哔哩;最新版2026...
黑科技辅助!wepoke是有挂... 黑科技辅助!wepoke是有挂软件(透视)先前真的是有挂(有挂方式)-哔哩哔哩;1、完成wepoke...
黑科技辅助!红龙扑克辅助器第一... 黑科技辅助!红龙扑克辅助器第一视角(透视)软件透明挂ai辅助器(竟然存在有挂)-哔哩哔哩;黑科技辅助...
黑科技辅助!wepoke真的有... 黑科技辅助!wepoke真的有挂嘛(透视)都是存在有挂(有挂工具)-哔哩哔哩;是一款可以让一直输的玩...
黑科技辅助!德州ai辅助可以打... 黑科技辅助!德州ai辅助可以打(透视)软件透明挂ai辅助软件(素来有挂)-哔哩哔哩;1、让任何用户在...
黑科技辅助!智星菠萝德州辅助器... 黑科技辅助!智星菠萝德州辅助器(透视)原生真的有挂(详细教程)-哔哩哔哩是一款可以让一直输的玩家,快...
黑科技辅助!wpk透视辅助(透... 黑科技辅助!wpk透视辅助(透视)软件透明挂ai辅助安装(原来有挂)-哔哩哔哩;wpk透视辅助是一种...
黑科技辅助!poker外挂(透... 黑科技辅助!poker外挂(透视)素来真的是有挂(有挂详情)-哔哩哔哩;AI辅助机器人普及解说快速成...
黑科技辅助!pokerworl... 黑科技辅助!pokerworld软件(透视)软件透明挂ai辅助安装(竟然真的是有挂)-哔哩哔哩;1、...