二维张量类似于二维矩阵。与二维矩阵一样,二维张量也具有 $n$ 行 $n$ 列。
我们以一张灰度图像为例,它是一个二维数值矩阵,通常称为像素。每个数字的范围从“0”到“255”,代表一个像素强度值。其中,最低强度值(“0”)表示图像中的黑色区域,而最高强度值(“255”)表示图像中的白色区域。使用 PyTorch 框架,可以将此二维图像或矩阵转换为二维张量。
在上一篇文章中,我们学习了 PyTorch 中的一维张量并应用了一些有用的张量操作。在本教程中,我们将使用 PyTorch 库将这些操作应用于二维张量。具体来说,我们将学习:
- 如何在 PyTorch 中创建二维张量并探索它们的类型和形状。
- 详细了解二维张量的切片和索引操作。
- 如何对张量应用多种方法,例如张量加法、乘法等。
通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码的自学教程。
让我们开始吧。

Pytorch中的二维张量
图片作者 dylan dolte。保留部分权利。
教程概述
本教程分为以下几个部分:
- 二维张量的类型和形状
- 将二维张量转换为 NumPy 数组
- 将 pandas Series 转换为二维张量
- 二维张量的索引和切片操作
- 二维张量上的操作
二维张量的类型和形状
首先,让我们导入本教程中将使用的一些必要库。
1 2 3 |
import torch import numpy as np import pandas as pd |
为了检查二维张量的类型和形状,我们将使用 PyTorch 中之前介绍过的一维张量的相同方法。但是,它应该像处理一维张量那样工作吗?
让我们通过将整数的二维列表转换为二维张量对象来演示。作为示例,我们将创建一个二维列表并应用 torch.tensor()
进行转换。
1 2 3 4 5 |
example_2D_list = [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]] list_to_tensor = torch.tensor(example_2D_list) print("我们的新二维张量来自二维列表:", list_to_tensor) |
1 2 3 |
我们的新二维张量来自二维列表: tensor([[ 5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]) |
如您所见,torch.tensor()
方法也适用于二维张量。现在,让我们使用 shape()
、size()
和 ndimension()
方法来返回张量对象的形状、大小和维度。
1 2 3 |
print("获取张量对象的形状:", list_to_tensor.shape) print("获取张量对象的大小:", list_to_tensor.size()) print("获取张量对象的维度:", list_to_tensor.ndimension()) |
1 2 3 |
print("获取张量对象的形状:", list_to_tensor.shape) print("获取张量对象的大小:", list_to_tensor.size()) print("获取张量对象的维度:", list_to_tensor.ndimension()) |
想开始使用PyTorch进行深度学习吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
将二维张量转换为 NumPy 数组
PyTorch 允许我们将二维张量转换为 NumPy 数组,然后再转换回张量。让我们看看如何做到这一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 将二维张量转换为 numpy 数组 twoD_tensor_to_numpy = list_to_tensor.numpy() print("将二维张量转换为 numpy 数组:") print("转换后的 Numpy 数组:", twoD_tensor_to_numpy) print("转换后的数据类型:", twoD_tensor_to_numpy.dtype) print("***************************************************************") # 将 numpy 数组转换回张量 back_to_tensor = torch.from_numpy(twoD_tensor_to_numpy) print("将 numpy 数组转换回二维张量:") print("转换后的张量:", back_to_tensor) print("转换后的数据类型:", back_to_tensor.dtype) |
1 2 3 4 5 6 7 8 9 10 11 |
将二维张量转换为 numpy 数组 转换后的 Numpy 数组: [[ 5 10 15 20] [25 30 35 40] [45 50 55 60]] 转换后的数据类型: int64 *************************************************************** 将 numpy 数组转换回二维张量 转换后的张量: tensor([[ 5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]) 转换后的数据类型: torch.int64 |
将 Pandas Series 转换为二维张量
同样,我们也可以将 pandas DataFrame 转换为张量。与一维张量一样,我们将使用相同的步骤进行转换。使用 values 属性,我们将获得 NumPy 数组,然后使用 torch.from_numpy
,它允许您将 pandas DataFrame 转换为张量。
我们将这样做:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 将 Pandas DataFrame 转换为张量 dataframe = pd.DataFrame({'x':[22,24,26],'y':[42,52,62]}) print("Pandas 到 numpy 转换:", dataframe.values) print("张量转换前的数据类型:", dataframe.values.dtype) print("***********************************************") pandas_to_tensor = torch.from_numpy(dataframe.values) print("获取新张量:", pandas_to_tensor) print("转换为张量后的数据类型:", pandas_to_tensor.dtype) |
1 2 3 4 5 6 7 8 9 |
Pandas 到 numpy 转换: [[22 42] [24 52] [26 62]] 张量转换前的数据类型: int64 *********************************************** 获取新 张量: tensor([[22, 42], [24, 52], [26, 62]]) 转换为张量后的数据类型: torch.int64 |
二维张量的索引和切片操作
对于索引操作,可以使用方括号访问张量对象中的不同元素。您可以简单地在方括号中输入相应的索引来访问张量中所需的元素。
在下面的示例中,我们将创建一个张量并使用两种不同的方法访问某些元素。请注意,索引值应始终比元素在二维张量中的位置少一。
1 2 3 4 5 6 7 8 9 10 |
example_tensor = torch.tensor([[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]) print("访问第2行第2列的元素:", example_tensor[1, 1]) print("访问第2行第2列的元素:", example_tensor[1][1]) print("********************************************************") print("访问第3行第4列的元素:", example_tensor[2, 3]) print("访问第3行第4列的元素:", example_tensor[2][3]) |
1 2 3 4 5 |
访问第2行第2列的元素: tensor(60) 访问第2行第2列的元素: tensor(60) ******************************************************** 访问第3行第4列的元素: tensor(120) 访问第3行第4列的元素: tensor(120) |
如果我们需要同时访问两个或更多元素呢?这就是张量切片发挥作用的地方。让我们使用前面的示例来访问第二行的前两个元素和第三行的前三个元素。
1 2 3 4 5 6 7 8 9 10 |
example_tensor = torch.tensor([[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]) print("访问第二行的前两个元素:", example_tensor[1, 0:2]) print("访问第二行的前两个元素:", example_tensor[1][0:2]) print("********************************************************") print("访问第三行的前三个元素:", example_tensor[2, 0:3]) print("访问第三行的前三个元素:", example_tensor[2][0:3]) |
1 2 3 4 5 6 7 8 9 10 |
example_tensor = torch.tensor([[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]) print("访问第二行的前两个元素:", example_tensor[1, 0:2]) print("访问第二行的前两个元素:", example_tensor[1][0:2]) print("********************************************************") print("访问第三行的前三个元素:", example_tensor[2, 0:3]) print("访问第三行的前三个元素:", example_tensor[2][0:3]) |
二维张量上的操作
虽然您可以使用 PyTorch 框架对二维张量执行许多操作,但在这里,我们将向您介绍张量加法以及标量和矩阵乘法。
二维张量加法
两个张量相加类似于矩阵加法。这是一个非常直接的过程,您只需使用加法 (+) 运算符即可执行操作。让我们在下面的示例中添加两个张量。
1 2 3 4 5 6 7 8 |
A = torch.tensor([[5, 10], [50, 60], [100, 200]]) B = torch.tensor([[10, 20], [60, 70], [200, 300]]) add = A + B print("A 和 B 相加得到:", add) |
1 2 3 |
A 和 B 相加得到: tensor([[ 15, 30], [110, 130], [300, 500]]) |
二维张量的标量和矩阵乘法
二维张量中的标量乘法也与矩阵中的标量乘法相同。例如,通过将张量乘以一个标量(例如标量 4),您将张量中的每个元素乘以 4。
1 2 3 4 |
new_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]]) mul_scalar = 4 * new_tensor print("标量乘法结果:", mul_scalar) |
1 2 |
标量乘法结果: tensor([[ 4, 8, 12], [16, 20, 24]]) |
谈到二维张量的乘法,PyTorch 中的 torch.mm()
使事情变得更容易。与线性代数中的矩阵乘法类似,张量对象 A 的列数(即 2×3)必须等于张量对象 B 的行数(即 3×2)。
1 2 3 4 5 6 7 |
A = torch.tensor([[3, 2, 1], [1, 2, 1]]) B = torch.tensor([[3, 2], [1, 1], [2, 1]]) A_mult_B = torch.mm(A, B) print("A 乘以 B 的结果:", A_mult_B) |
1 2 |
A 乘以 B 的结果: tensor([[13, 9], [ 7, 5]]) |
进一步阅读
PyTorch 与 TensorFlow 同时开发,直到 TensorFlow 在其 2.x 版本中采用 Keras,PyTorch 的语法才变得更简单。要学习 PyTorch 的基础知识,您可能需要阅读 PyTorch 教程:
特别是 PyTorch 张量的基础知识可以在张量教程页面找到:
还有一些适合初学者的 PyTorch 书籍。建议阅读最近出版的书籍,因为工具和语法正在积极发展。一个例子是:
- 《用 PyTorch 进行深度学习》,作者 Eli Stevens、Luca Antiga 和 Thomas Viehmann,2020 年出版。
https://www.manning.com/books/deep-learning-with-pytorch
总结
在本教程中,您了解了 PyTorch 中的二维张量。
具体来说,你学到了:
- 如何在 PyTorch 中创建二维张量并探索它们的类型和形状。
- 详细了解二维张量的切片和索引操作。
- 如何对张量应用多种方法,例如张量加法、乘法等。
感谢您的文章。不过,我建议您仔细检查本文中输出的显示,因为至少有两个地方显示的是输入而不是输出。
感谢您的反馈,Will!
非常感谢。我是一名初学者,这篇文章帮助很大。
非常欢迎您,Prakriti!我们非常感谢您的反馈和支持!
我有一个问题想问,我使用 1000 个 64×64 的矩阵作为输入,输出也是 64×64 的矩阵,可以实现吗?
我有一个问题想问,我使用 1000 个 64×64 的矩阵作为输入,输出也是 64×64 的矩阵,可以实现吗?谢谢。
你好 Alger……以下资源可能会提供帮助:
https://www.geeksforgeeks.org/two-dimensional-tensors-in-pytorch/
我有一个问题想问,我使用 1000 个 64×64 的矩阵作为输入,输出也是 64×64 的矩阵,可以实现吗?