文章目录
本文参考于: 与凤行——灵界碧苍王:Pytorch教程
Tensor基础
Tensor(张量) 是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。
1.1、Tensor的维度(Dimensions)
Tensor的维度可以理解为Tensor包含的数据在不同方向上的层次或级别。在数学和计算机科学中,维度通常用来描述数据结构的复杂性或者数据在空间中的方向。对于Tensor来说,每一个维度都代表了数据的一个特定的方向或特性。
Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。可以类似用坐标轴来理解,可以类比的用坐标轴理解,即Tensor有多少个方向。比如1维,x轴只有一个方向;2维,x轴y轴,两个方向,x轴固定长度;3维,x轴y轴z轴,三个方向,x轴和y轴固定长度。
基本的tensor创建,以便于后续学习:
import torch
x=torch.tensor(data)#利用data创建tensor,data可以是各总维度的列表,或一个常数
1.1.1、举例说明
- 0维Tensor:也就是一个标量(Scalar),它没有维度,仅仅是一个单一的数值。例如,温度值、价格或者某个计数。
- 举例说明:
torch.tensor(1)
、torch.tensor(2)
- 举例说明:
- 1维Tensor:也称作向量(Vector),它有一个维度,可以看作是一系列数值的集合。例如,一维数组
[1, 2, 3]
代表一系列数值或某个特性的不同测量值。当我们将一维张量称为向量时,那么 tensor([1,2,3])是一个3维向量,一个一维张量。- 举例说明:
torch.tensor([1,2,3,4,5])
、torch.tensor([15,2,3,4,5,51])
- 举例说明:
- 2维Tensor:也称作矩阵(Matrix),它有两个维度,可以表示为行和列。例如,在表格数据中,行可能代表不同的样本,列代表不同的特征或观察值。注意,由于列代表了不同的特征,因此每一行的元素数必须相同,每一行是一个一维的。相当于多个一维构成一个二维。
- 举例说明:
torch.tensor([ [1,2,5],[3,4,2] ])
,暂且可以理解为这里有两行分别为[1,2,5]和[3,4,2],这是一个2×3的矩阵。
- 举例说明:
- 3维Tensor:可以想象为一个数据立方体,常用于表示时间序列数据、图像数据等。例如,在处理图像时,一个3维Tensor可能有三个维度:高度、宽度和颜色通道。相当于多个二维构成一个三维,每个二维的性状必须相同。
- 举例说明:
torch.tensor([ [[1,2],[3,4]] , [[3,3][2,2]] ])
,一个三维中,有两个二维,这是一个2×2×2的三维Tensor。
- 举例说明:
1.1.2、高维Tensor
随着维度的增加,Tensor可以表示更加复杂的数据结构。例如,在深度学习中,经常会处理4维Tensor来表示一批图像数据,其中维度分别代表样本数、高度、宽度和颜色通道。在自然语言处理(NLP)任务中,可能会使用3维或更高维度的Tensor来表示句子、单词和特征向量。
1.2、.dim()和.size()方法
在PyTorch中,.dim()
和.size()
方法用于获取Tensor的维度信息,但它们提供了不同类型的信息:
1.2.1、.dim()方法
.dim()
方法返回Tensor的维度数,即Tensor有多少轴。(类似多少个坐标轴)- 对于一个给定的Tensor,
.dim()
告诉你这个Tensor是几维的。 - 例如,如果你有一个2D Tensor(比如一个矩阵),
.dim()
将返回2;如果是一个3D Tensor(比如一个时间序列数据集),.dim()
将返回3。
1.2.2、.size()方法
.size()
方法返回一个Tensor每个维度的大小(长度),以torch.Size
类型表示,其实质是一个元组。 (类似告诉你 每一个坐标轴的长度,不过是按照z,y,x的方式给出的。z个矩形,y行,x列,更高维以此类推)- 它提供了关于Tensor每个轴的具体大小的详细信息。如果你想知道一个Tensor的形状,比如有多少行和列,你会使用
.size()
。 .size()
可以返回全部维度的大小,也可以通过指定维度的索引来返回特定维度的大小。例如,对于一个形状为(3, 4, 5)
的3D Tensor,.size()
将返回torch.Size([3, 4, 5])
,而.size(1)
将仅返回第二维(即4行)的大小,这和.size(-2)
等价。
1.2.3、.shape属性
.shape
属性 和 直接调用.size()返回的是一样的。
1.2.4、torch.randn()
torch.randn()
可以生成一个指定维度的随机数据的张量。
import torch
tensor=torch.randn(3,3,4,5)
print(tensor.size())
- 输出:
torch.Size([3, 3, 4, 5])
1.2.5、示例代码
1.2.5.1、一维Tensor
import torch
oneD=torch.tensor([1,3,4,5,5,6,6,0])
print(".size()方法:",oneD.size())
print("一维张量的大小:",oneD.size(0))
print(type(oneD.size()))
print("一维张量的维数:",oneD.dim())
print(type(oneD.dim()))
1.2.5.2、二维Tensor
import torch
oneD=torch.tensor([[1,3,4,5,5,6,6,0],[1,3,4,5,5,6,6,8],[1,3,4,5,5,6,6,0]])#3×8
print(".size()方法:",oneD.size())
print("二维张量最外层元素数:",oneD.size(0))
print("二维张量的维数:",oneD.dim())
tensor的维度信息是[3, 8],表示矩阵的大小为3x8。通过调用dim()方法,我们可以得到张量的轴数,这里是2。
1.2.5.3、三维Tensor
import torch
oneD=torch.tensor([ [[1,2],[2,3],[2,3]],[[3,4],[5,6],[2,3]] ])#2×3×2
print(".size()方法:",oneD.size())
print("三维张量最外层元素数:",oneD.size(0))
print("三维张量的维数:",oneD.dim())
tensor的维度信息是[2, 3, 2],表示有2个矩阵,每个矩阵的大小为3x2。通过调用dim()方法,我们可以得到张量的轴数,这里是3。
1.2.6、unsqueeze
在 PyTorch 中,unsqueeze(0)
的操作是用来在张量中增加一个额外的维度,这个新的维度被添加在指定的索引位置。当你调用 unsqueeze(0)
时,这意味着你正在添加一个新的维度到张量的最前面。这在深度学习中非常常用,尤其是在处理图像数据时,因为很多深度学习模型,如卷积神经网络,预期输入数据有一个特定的维度格式,通常是 [batch_size, channels, height, width]
。
1.2.6.1、 解释 unsqueeze(0)
的具体作用:
-
批次维度(Batch Size):
- 批次大小是一次性处理的数据项(例如图像)的数量。在训练神经网络时,通常不会一次只处理一个样本,而是将多个样本打包成一个批次。这样做可以提高内存利用率,加快计算速度,并有助于模型的泛化能力。
- 在处理单个数据项(如一张图像)时,我们通常需要将其“伪装”成一个批次,即使这个批次里只有一个元素。这就是为什么我们需要在单个图像张量前使用
unsqueeze(0)
,从而将其形状从[channels, height, width]
转变为[1, channels, height, width]
。这里的1
代表批次大小为1。
-
PyTorch的卷积层期望的输入:
- 大多数PyTorch的卷积层操作期望输入是四维张量,即使在处理单个图像时也是如此。例如,
torch.nn.Conv2d
需要输入维度为[batch_size, channels, height, width]
。通过使用unsqueeze(0)
,你可以确保即使是单个图像也能以正确的格式传递给这些层。
- 大多数PyTorch的卷积层操作期望输入是四维张量,即使在处理单个图像时也是如此。例如,
示例代码:
假设有一个三通道的图像张量 img_tensor
,其形状为 [channels, height, width]
(例如,[3, 224, 224]
),我们需要将其转换为适合网络输入的格式:
import torch
# 假设 img_tensor 是一个已经转换为张量的图像,形状为 [3, 224, 224]
img_tensor = torch.randn(3, 224, 224) # 创建一个示例张量,模拟图像数据
# 使用 unsqueeze 添加批次维度
img_tensor = img_tensor.unsqueeze(0) # 现在形状变为 [1, 3, 224, 224]
这样,img_tensor
就准备好了,可以被作为输入传递给一个接受四维输入的卷积神经网络层。通过这种方式,你可以处理单张图片,而不需要改变网络架构或输入处理流程。
1.3、Tensor数据类型
- 在创建张量时,可以通过dtype参数指定数据类型:
import torch
x = torch.tensor( [1, 2, 3], dtype=torch.float32 )
print(x)
print(x.dtype)
- 也可以通过.float()等方法修改数据类型:
import torch
x = torch.tensor( [1, 2, 3])
x=x.float()
print(x)
print(x.dtype)
1.4、观察维度
1.4.1、直接访问
有 Python内置类型——序列 的操作,从内到外索引:
当然还有切片操作。