0

0

PyTorch张量维度处理深度解析:从创建到聚合与转换

聖光之護

聖光之護

发布时间:2025-08-24 16:12:11

|

786人浏览过

|

来源于php中文网

原创

PyTorch张量维度处理深度解析:从创建到聚合与转换

本文深入探讨PyTorch张量在维度处理上的核心机制,涵盖张量创建时size参数的解读、聚合操作(如sum)中axis参数的行为,以及转换操作(如softmax)中dim参数的指定。通过详细示例和解释,旨在帮助开发者全面理解PyTorch张量的维度逻辑,从而更高效地进行张量操作。

在pytorch中,张量(tensor)是进行数值计算的基本数据结构。理解张量如何处理维度,是高效使用pytorch进行深度学习开发的关键。本文将从张量的创建、聚合和转换三个核心操作入手,详细解析pytorch张量中维度(dimension)和轴(axis/dim)参数的行为。

1. PyTorch张量的维度创建与理解

创建PyTorch张量时,size参数用于指定张量的形状。这个参数通常接受一个元组,其中的每个元素代表对应维度的长度。PyTorch对维度的解读有一个特定的顺序:size元组中的元素是从最内层(即列)到最外层依次指定的。

具体而言,如果size为(..., m, n),则n表示最内层维度(通常可视为列数),m表示次内层维度(通常可视为行数),以此类推。

示例代码:

import torch

# 创建一个2行3列的矩阵
# size=(2,3) 表示2行(m=2),3列(n=3)
tensor_2x3 = torch.ones((2, 3))
print(f"torch.ones((2, 3)):\n{tensor_2x3}\nShape: {tensor_2x3.shape}\n")

# 也可以省略元组括号,但并非所有创建函数都支持
tensor_abbreviated = torch.ones(2, 3)
print(f"torch.ones(2, 3) (abbreviated):\n{tensor_abbreviated}\nShape: {tensor_abbreviated.shape}\n")

# 对于某些函数,如torch.randint,size参数必须是元组
# torch.randint(high, size)
tensor_randint = torch.randint(10, (2, 3))
print(f"torch.randint(10, (2, 3)):\n{tensor_randint}\nShape: {tensor_randint.shape}\n")

维度解读表格:

下表展示了不同size参数对应的张量形状及其维度含义:

size 参数 描述 列数(最内层) 行数(次内层) 更外层维度
(2,) 长度为2的行向量;只有一个维度 2 - -
(2,1) 2行1列的矩阵;具有两个维度 1 2 -
(1,2) 1行2列的矩阵;具有两个维度 2 1 -
(3,2) 3行2列的矩阵 2 3 -
(4,3,2) 4个3行2列的矩阵组成的3D张量 2 3 4

从表中可以看出,size元组的最后一个元素总是对应张量的“列”维度,倒数第二个元素对应“行”维度,依此类推。理解这种“从后向前”的维度定义方式对于后续的聚合和转换操作至关重要。

2. 张量聚合操作中的维度处理

PyTorch张量中的许多聚合方法,如sum()、mean()、max()等,都接受一个axis或dim参数(通常是int或int列表)。这个参数指定了操作沿着哪个维度进行。当操作沿着某个维度进行时,该维度上的所有元素会被聚合,并且该维度通常会被缩减(移除)

以torch.Tensor.sum()为例,其axis参数的行为如下:

示例:使用torch.ones创建张量并进行sum操作

XPaper Ai
XPaper Ai

AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

下载
import torch

# 示例 1: 一维张量
t1 = torch.ones(2) # tensor([1., 1.])
print(f"Tensor: {t1}, Shape: {t1.shape}")
sum_t1_axis0 = t1.sum(axis=0) # 或 axis=-1
print(f"sum(axis=0): {sum_t1_axis0}, Output Shape: {sum_t1_axis0.shape}\n")
# 解释:沿着唯一的维度求和,结果是一个标量,维度被移除。

# 示例 2: 2行1列矩阵
t2 = torch.ones(2, 1) # tensor([[1.], [1.]])
print(f"Tensor:\n{t2}, Shape: {t2.shape}")
sum_t2_axis1 = t2.sum(axis=1) # 或 axis=-1
print(f"sum(axis=1): {sum_t2_axis1}, Output Shape: {sum_t2_axis1.shape}\n")
# 解释:沿着列(axis=1)求和,每行只有一个元素,结果是保留行维度的一维张量。

# 示例 3: 1行2列矩阵
t3 = torch.ones(1, 2) # tensor([[1., 1.]])
print(f"Tensor:\n{t3}, Shape: {t3.shape}")
sum_t3_axis1 = t3.sum(axis=1) # 或 axis=-1
print(f"sum(axis=1): {sum_t3_axis1}, Output Shape: {sum_t3_axis1.shape}\n")
# 解释:沿着列(axis=1)求和,结果是包含所有元素和的单元素一维张量。

# 示例 4: 3行2列矩阵
t4 = torch.ones(3, 2)
print(f"Tensor:\n{t4}, Shape: {t4.shape}")
sum_t4_axis1 = t4.sum(axis=1) # 或 axis=-1
print(f"sum(axis=1): {sum_t4_axis1}, Output Shape: {sum_t4_axis1.shape}\n")
# 解释:沿着列(axis=1)求和,对每一行进行求和,结果是一个包含3个元素的行向量。

# 示例 5: 4x3x2 的3D张量
t5 = torch.ones(4, 3, 2)
print(f"Tensor:\n{t5}, Shape: {t5.shape}")
sum_t5_axis2 = t5.sum(axis=2) # 或 axis=-1
print(f"sum(axis=2):\n{sum_t5_axis2}, Output Shape: {sum_t5_axis2.shape}\n")
# 解释:沿着最内层维度(axis=2,即列)求和,每个2元素的子向量和为2,结果是4x3的矩阵。

axis=-1的特殊行为:

当axis=-1(或指定最末尾的维度索引)时,torch.sum()通常会执行以下两个主要操作:

  1. 沿着最内层维度(列维度)求和: 它会对张量中的每个“行”向量(或更高维张量中的最内层子张量)的所有元素进行求和。例如,对于一个2D矩阵,它会沿着每一行中的列方向求和。
  2. 缩减维度并“移动”轴: 被求和的维度会被移除。例如,如果对一个(A, B, C)形状的张量沿着C维度(即axis=2或axis=-1)求和,结果的形状将是(A, B)。原先的B维度会占据C维度的位置,A维度会占据B维度的位置。这种行为有时会让人感到困惑,但这是因为PyTorch在显示张量时,最末尾的维度总是被视为列。

3. 张量转换操作中的维度指定

张量转换操作,例如torch.softmax(),会改变张量的值,但通常会保留其原始形状。dim参数在此类操作中指定了转换发生的维度。例如,softmax函数会将指定维度上的元素进行归一化,使得该维度上所有元素的和为1。

示例:torch.softmax()的使用

import torch

# 创建一个随机的2x2x2的3D张量
random_tensor = torch.randn((2, 2, 2))
print(f"Original Tensor:\n{random_tensor}\nShape: {random_tensor.shape}\n")

# 沿着 dim=-1 (最内层维度,即列) 进行 softmax
# 结果中,每个最内层子向量(即每“行”的“列”)的和为1
softmax_dim_neg1 = random_tensor.softmax(dim=-1)
print(f"Softmax (dim=-1):\n{softmax_dim_neg1}\nShape: {softmax_dim_neg1.shape}")
# 验证:检查每个最内层子向量的和是否接近1
print(f"Sums along dim=-1:\n{softmax_dim_neg1.sum(dim=-1)}\n")

# 沿着 dim=-2 (次内层维度,即行) 进行 softmax
# 结果中,每个“列”中的“行”的和为1
softmax_dim_neg2 = random_tensor.softmax(dim=-2)
print(f"Softmax (dim=-2):\n{softmax_dim_neg2}\nShape: {softmax_dim_neg2.shape}")
# 验证:检查每个次内层子向量的和是否接近1
print(f"Sums along dim=-2:\n{softmax_dim_neg2.sum(dim=-2)}\n")

结果解读:

  • 当dim=-1时,softmax操作是沿着最内层维度进行的。这意味着对于张量中的每一个[..., i, :]切片,其所有元素的和将被归一化为1。在上面的示例中,[[0.7512, 0.2488]]中0.7512 + 0.2488约等于1,[[0.1585, 0.8415]]中0.1585 + 0.8415约等于1,以此类推。
  • 当dim=-2时,softmax操作是沿着次内层维度进行的。这意味着对于张量中的每一个[..., :, j]切片,其所有元素的和将被归一化为1。在上面的示例中,[[0.8773], [0.1227]]中0.8773 + 0.1227约等于1,[[0.3083], [0.6917]]中0.3083 + 0.6917约等于1,以此类推。

通过指定不同的dim,我们可以控制softmax(或其他转换函数)在哪个维度上进行归一化或转换,这对于构建神经网络层(如多头注意力机制中的注意力权重)至关重要。

注意事项与总结

  • 负数索引: 在PyTorch中,维度索引可以使用负数,其中-1代表最末尾的维度,-2代表倒数第二个维度,以此类推。这在处理高维张量时非常方便,因为它不受张量实际维度数量的影响。
  • 维度顺序: 始终记住size参数的维度顺序是从最内层到最外层。
  • 聚合与转换的区别 聚合操作(如sum)通常会减少张量的维度,而转换操作(如softmax)则保持张量形状不变。
  • axis与dim: 虽然在不同函数中参数名可能不同(axis或dim),但它们的功能是相同的,都用于指定操作所作用的维度。

理解PyTorch张量如何处理维度是掌握其强大功能的基础。通过本文的详细解释和示例,希望读者能够对张量的创建、聚合和转换过程中的维度逻辑有更清晰、更深入的理解,从而在实际开发中更加游刃有余。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

7

2025.12.22

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

428

2024.05.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.8万人学习

时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号