Pytorch-01张量-Tensor的基本认识和操作

部署运行你感兴趣的模型镜像

目录

1.张量是什么

  1. 如何初始化张量
    • 用原生python列表数据初始化
    • 用numpy数组形式初始化
    • 用其他张量初始化
    • 随机初始化张量中的值
  2. 获得张量的属性
  3. 对张量的操作
    • 索引和切片
    • 拼接
    • 算数操作
    • 主元素
    • 单元素tensor的python item化
    • 就地操作(直接改变原数据)
  4. 与numpy数据的关联性
    • 修改的互通性

1. Tensor(张量)

Tensor,中文名叫张量。理论上任何维度的数据都属于张量。只不过我们对于一些常见的张量有习惯的叫法,比如:

  • 零维的数据叫Scalar,也就是标量
  • 一维的数据叫Vector,也就是向量,其中还分为行向量和列向量
  • 二维的数据叫Matrix,也就是矩阵
  • 在上面几个常用语存在的情况下,在日常DL/ML语境中,张量一般指3维及以上的数据。

![[Pasted image 20250729214158.png]]

张量是pytorch特有的一种数据类型,和numpy的ndarry类似,但不同之处在于tensor可以在GPU上加速运行

2. 初始化一个张量

2.1 直接从python列表数据初始化一个张量

python的list列表嵌套可以在逻辑上存储n维度的数据。要想把它转换为tensor类型,直接执行如下代码即可。

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

2.2 用numpy array创建tensor

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

主要注意的是,这里对np_array或者x_np的任何修改都会映射到另外一个,因为它们是共享内存的。这个之后会详细说这是什么情况。

2.3 用其他tensor初始化tensor

x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")

x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")
  • ones_like 会创建元素全1的,其他属性例如尺寸,数据类型都和原来的tensor一样的tensor
  • rand_like则是每个随机初始化每个元素,其他的属性都和原来的tensor一样。
    ![[Pasted image 20250729223857.png]]

2.4 指定尺寸后随机初始化tensor元素

  • torch.rand(shape)
  • torch.ones(shape)
  • torch.zeros(shape)
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

3. 获得Tensor的属性

可以获得tensor的属性有

  • shape:tensor的形状
  • dtype:tensor元素的数据类型
  • device:现在这个tensor在cpu侧还是在gpu侧
tensor = torch.rand(3,4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

4. 对Tensor的操作

对于tensor,pytorch提供了1200种操作,包括常规算术,线性代数,矩阵乘法等等,你可以从这个链接找到所有操作的文档:here.

4.1 把tensor搬到GPU上

所有的这些操作都可以在CPU或者有CUDA的GPU上运行。默认情况下,tensors会在CPU上被创建。要想让GPU加速计算过程,就得使用.to方法来把tensor从CPU搬到GPU上。

if torch.accelerator.is_available():
	tensor = tensor.to(torch.accelerator.current_accelerator())

在做这个操作的的时候,一定要记住:越大的tensor,搬到GPU上的时间开销和空间开销都会越大!

4.2 索引和切片操作

tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}") # 这个和tensor[:, -1]是一样的
tensor[:,1] = 0
print(tensor)

![[Pasted image 20250729225355.png]]

4.3 拼接操作

torch.cat

这是一个比较重要的操作,你可以使用torch.cat来把一系列tensors在指定的,已存在的维度上进行拼接

t1 = torch.cat([tensor, tensor, tensor], dim=1)

这一句就是在列方向上把tensor拼接3次,结果如下:
在这里插入图片描述

t2 =  torch.cat([tensor, tensor, tensor], dim=0) # 在行方向上进行拼接
print(t2)

这个就是在行方向上拼接3次:
在这里插入图片描述

torch.stack

这个操作是一种升维操作,最常见的就是二维图片的堆叠成为一个视频块。

t3 = torch.stack([tensor, tensor], dim=0) # 在0维插入一个维度
print(t3)

在这里插入图片描述

4.4 算术操作

矩阵类操作

y1 = temsor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)

element-wise类操作

# This computes the element-wise product. z1, z2, z3 will have the same value
z1 = tensor * tensor
z2 = tensor.mul(tensor)

z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

4.5 单元素tensor的item化

当tensor只有一个元素的时候,可以使用.item()方法把它转换回pytorch的数据类型。

agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))

在这里插入图片描述

4.6 就地操作

可以理解为直接对向量本身进行值的修改,而不返回副本。所有这种方法都有一个_作为后缀

print(f"{tensor} \n")
tensor.add_(5)
print(tensor)

在这里插入图片描述

5. Ndarray和Tensor的互通性

当tensors在GPU上的时候,如果使用t.numpy()方法返回一个ndarray副本,那么此时tensor和ndarray是 共享内存 的,对其中任意一个的修改都会影响另外一个。
![[Pasted image 20250730091629.png]]

同理,对ndarray使用torch.from_numpy()也是一样的。
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>首先,用户要求查询关于PyTorchTensor的使用特性。用户提供了多个引用,这些引用是关于PyTorch Tensor的概述、创建、属性、操作等。 系统级指令: - 使用$...$格式行内数学表达式。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户的问题:PyTorchTensor的使用特性。 从引用中提取关键信息: - 引用[1]: Tensor是核心数据结构,支持多维数组、自动求导、GPU加速。 - 引用[2]: Tensor类方便创建、操作、计算张量,隐藏底层细节。 - 引用[3]: 详细结构:概念、特点、数据类型、创建方式、属性、数据转换、常见操作- 引用[4]: 示例代码,展示形状操作如view()resize()。 我需要结构化回答: 1. **介绍Tensor**:简要定义Tensor及其重要性。 2. **特性**:列出Tensor的主要特性,如多维数组、自动求导、GPU支持。 3. **使用方法**: - 创建Tensor- 操作Tensor(如形状操作、运算)。 - 数据类型属性。 - 与NumPy的转换。 4. **示例**:参考引用[4],提供简单代码示例。 5. **引用标识**:在相关段落末尾添加引用标识。 6. **生成相关问题**:在最后添加相关问题部分。 步骤: - **开头介绍**:解释什么是PyTorch Tensor- **详细内容**: - 特性:多维数据、自动求导、GPU加速、高效计算。 - 创建方式:使用torch.tensor, torch.Tensor等。 - 常见操作:如view(), reshape(), transpose(), 元素运算。 - 属性:shape, dtype, device。 - 数据类型转换设备切换。 - 与NumPy互操作- **添加引用**:基于引用内容,在适当位置添加[^1], [^2], [^3], [^4]。 - **示例代码**:保持简短,使用Python代码块。 - **结尾**:总结重要性。 - **相关问题**:生成至少三个相关问题,如优化、应用场景等。 确保数学表达式格式: - 如果有数学,使用$...$,例如在描述形状时,或是运算。 -PyTorch上下文中,可能没有太多数学,但如果有,如形状变换,可以用数学表示。 最终输出格式: - 回答主体。 - 相关问题部分,以"§§相关问题§§"开头。 现在,草拟回答结构: 1. **Tensor概述**:定义重要性。引用[1][^2]。 2. **主要特性**: - 多维数组功能。 - 自动求导(关键于深度学习)。 - GPU加速计算。 - 灵活性:支持多种数据类型设备。 3. **创建Tensor**: - 基本创建如torch.tensor(), torch.rand()。 - 创建线性随机张量。 4. **Tensor操作**: - 形状操作:view(), reshape(), transpose(), permute()。 - 元素运算:加法、乘法等。 - 索引切片。 5. **属性管理**: - 获取shape, dtype, device。 - 切换设备(CPU到GPU)。 - 数据类型转换。 6. **示例**:引用[4]的代码,简要说明。 7. **与NumPy交互**。 8. **总结**。 9. **相关问题**。 添加引用标识: - 在描述特性时加[^1]。 - 在创建部分加[^3]。 -操作部分加[^3][^4]。 - 在示例加[^4]。 生成相关问题: 1. 如何优化Tensor操作以提高性能? 2. Tensor在深度学习模型中的应用? 3. TensorNumPy数组的优缺点比较? </think>### PyTorch Tensor 的使用特性详解 PyTorch 中的 Tensor 是其核心数据结构,用于表示多维数组,支持高效计算、自动求导 GPU 加速,是深度学习模型开发的基础。下面我将逐步介绍 Tensor 的主要特性、使用方法,并结合示例帮助您理解。内容基于站内引用,确保真实可靠。 #### 1. Tensor 概述 PyTorchTensor 是多维数组的封装,类似于 NumPy 的 ndarray,但增加了自动求导 GPU 支持等高级功能。它允许用户在 Python 层面轻松创建、操作数据,同时隐藏底层实现细节,使开发者能专注于模型构建。Tensor 的核心概念包括维度、数据类型存储设备,这些特性使其在深度学习任务中不可或缺[^1][^2]。 #### 2. 主要特性 Tensor 的设计目标是为深度学习提供高效、灵活的计算基础。以下是其关键特性: - **多维数组功能**:Tensor 可以表示标量(0 维)、向量(1 维)、矩阵(2 维)或更高维数据,例如图像数据可存储为 $ \text{shape}~(C \times H \times W) $ 的 3D Tensor,其中 $ C $ 是通道数,$ H $ $ W $ 是高度宽度。这使得处理复杂数据(如卷积神经网络输入)变得简单[^1]。 - **自动求导(Autograd)**:Tensor 支持梯度计算,通过设置 `requires_grad=True`,PyTorch 会自动跟踪操作并构建计算图,便于反向传播优化模型参数。例如,在损失函数计算中,梯度可通过 `.backward()` 方法自动获取[^1][^2]。 - **GPU 加速**:Tensor 可以轻松迁移到 GPU 设备(如 NVIDIA CUDA),利用并行计算大幅提升训练速度。使用 `.to('cuda')` 方法即可将 Tensor 从 CPU 移动到 GPU,显著加速大规模矩阵运算[^1]。 - **灵活的数据类型**:支持多种数据类型,如整数 (`torch.int32`)、浮点数 (`torch.float32`),以及布尔型 (`torch.bool`)。数据类型可通过 `.dtype` 属性查询,并用 `.to()` 方法转换,例如 `tensor.to(torch.float64)`[^3]。 - **内存连续性优化**:Tensor 的存储是连续的,操作如 `view()` 或 `reshape()` 可高效改变形状而不复制数据(前提是内存连续)。这减少了资源开销,提升了性能[^3][^4]。 #### 3. Tensor 的创建 Tensor 的创建方式多样,常用方法包括: - **基本创建**:使用 `torch.tensor()` 或 `torch.Tensor()` 从 Python 列表或 NumPy 数组初始化。例如,`tensor = torch.tensor([1, 2, 3])` 创建一个 1D Tensor。`torch.IntTensor()` 等函数指定特定数据类型[^3]。 - **创建特定张量**: - **随机张量**:`torch.rand(shape)` 生成均匀分布的随机数 Tensor,如 `rand_tensor = torch.rand(2, 3)`。 - **线性张量**:`torch.linspace(start, end, steps)` 创建等间隔序列,如 `lin_tensor = torch.linspace(0, 10, 5)` 生成 $[0, 2.5, 5, 7.5, 10]$。 - **特殊张量**:`torch.zeros()`, `torch.ones()`, 或 `torch.eye()` 创建零矩阵、单位矩阵等[^3]。 #### 4. Tensor 的常见操作 Tensor 支持丰富的操作,包括形状调整、运算索引: - **形状操作**:关键于数据预处理: - `view()` 或 `reshape()`:改变 Tensor 形状而不复制数据(如果内存连续)。例如,一个 $2 \times 3$ Tensor 可重塑为 $3 \times 2$,形状变换满足元素总数不变,即原始形状 $a \times b$ 变换后 $c \times d$ 满足 $ a \times b = c \times d $。 - `transpose()` 或 `permute()`:交换维度,如将 $ \text{shape}~(N \times C \times H \times W) $ 转置为 $ \text{shape}~(N \times H \times W \times C) $。 - `squeeze()` `unsqueeze()`:压缩或增加维度。例如,`unsqueeze(dim=0)` 在指定维度添加大小为 1 的维度[^3][^4]。 - **元素运算**:支持逐元素操作,包括加法、乘法(阿达玛积)、矩阵乘法 (`torch.matmul()`)。例如,两个 Tensor $A$ $B$ 的逐元素乘法为 $ A \odot B $。 - **索引切片**:类似 NumPy,使用索引获取子集,如 `tensor[0, :]` 获取第一行所有元素[^3]。 - **数据类型设备切换**:使用 `.to()` 方法,如 `tensor.to('cuda')` 移动到 GPU 或 `tensor.to(torch.float16)` 转换精度[^3]。 #### 5. 示例代码 以下代码演示了 Tensor 的创建形状操作,基于引用[^4]。它展示了 `view()` 方法改变形状,并验证内存共享(原 Tensor 重塑后的 Tensor 指向相同存储): ```python import torch # 创建一个 2x3 的随机 Tensor tensor = torch.rand(2, 3) print("原始形状:", tensor.shape) # 输出: torch.Size([2, 3]) # 使用 view() 改变形状为 3x2 new_tensor = tensor.view(3, 2) print("新形状:", new_tensor.shape) # 输出: torch.Size([3, 2]) # 检查内存地址,相同表示共享存储 print("原 Tensor 存储地址:", tensor.storage().data_ptr()) print("新 Tensor 存储地址:", new_tensor.storage().data_ptr()) # 地址相同 ``` #### 6. 与 NumPy 互操作 Tensor 可与 NumPy 数组无缝转换: - `torch.from_numpy(np_array)` 将 NumPy 数组转为 Tensor- `tensor.numpy()` 将 Tensor 转为 NumPy 数组。 这在数据加载预处理中非常实用,允许结合 PyTorch 传统科学计算库的优势[^3]。 #### 总结 PyTorch Tensor 提供了高效、灵活的数据处理能力,是深度学习开发优化的核心。通过多维数组支持、自动求导 GPU 加速,它简化了模型实现。掌握创建、操作属性管理,能提升您在项目中的效率[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值