【学习笔记】【Pytorch】张量(Tensor)的基础操作
- 一、创建张量
- 1.使用数据创建张量
- 2.无需数据的创建选项
- 3.torch.Tensor与torch.tensor的区别
- 4.PyTorch中张量的创建方法的选择
- 二、张量的属性
- 1.张量的 torch.dtype
- 2.张量的 torch.device
- 3.张量的 torch.layout
- 三、张量的形状
- 四、重构张量
- reshape函数中-1表示的意义
- 五、CNN中的输入张量形状和特征图
一、创建张量
参考:
Pytorch中张量讲解 | Pytorch系列(四)
PyTorch中张量的创建方法的选择 | Pytorch系列(五)
官方文档
介绍:PyTorch中的张量是我们在PyTorch中编程神经网络时会用到的数据结构。
在对神经网络进行编程时,数据预处理通常是整个过程的第一步,数据预处理的一个目标是将原始输入数据转换成张量形式。
PyTorch中的张量就是torch.Tensor的Python类的一个实例。
1.使用数据创建张量
这些是在PyTorch中使用数据(类似数组)创建张量对象(torch.Tensor类的实例)的主要方法:
- torch.Tensor(data)
- torch.tensor(data)
- torch.as_tensor(data)
- torch.from_numpy(data)
data可以使用Python列表或序列,但是numpy.ndarrays是更常见的选择。
> data = np.array([1,2,3])
> type(data)
numpy.ndarray
> o1 = torch.Tensor(data)
> o2 = torch.tensor(data)
> o3 = torch.as_tensor(data)
> o4 = torch.from_numpy(data)
> print(o1)
> print(o2)
> print(o3)
> print(o4)
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
2.无需数据的创建选项
torch.eye()函数,它返回一个二维张量,对角线上是1,其他地方是0。eye() 这个名称与单位矩阵的思想有关,单位矩阵是一个方阵,主对角线上是1,其他地方都是0。
> print(torch.eye(2))
tensor([
[1., 0.],
[0., 1.]
])
torch.zeros()函数,它用指定形状参数的形状创建一个全部为 0 张量。
> print(torch.zeros([2,2]))
tensor([
[0., 0.],
[0., 0.]
])
torch.ones()函数,它创建了一个全部为 1 的张量。
> print(torch.ones([2,2]))
tensor([
[1., 1.],
[1., 1.]
])
torch.rand()函数,它创建了一个具有指定参数形状的张量,其值是随机的。
> print(torch.rand([2,2]))
tensor([
[0.0465, 0.4557],
[0.6596, 0.0941]
])
3.torch.Tensor与torch.tensor的区别
参考:
torch.Tensor()与torch.tensor()
总结:
-
torch.Tensor()是python类,调用torch.Tensor([1,2, 3, 4, 5])来构造一个tensor的时候,会调用Tensor类的构造函数,生成一个单精度浮点类型的张量。它不能指定数据类型,除非转成一个已知数据类型的张量,使用type_as(tesnor)将张量转换为给定类型的张量。
-
torch.tensor()是python的函数,其中data可以是list,tuple,NumPy,ndarray等其他类型,torch.tensor(data)会从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor 、torch.FloatTensor和torch.DoubleTensor。通过设置dtype的函数参数值,生成对应类型的张量。
-
共同点:都是生成一个 torch.Tensor 对象。
import torch
dd = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 为了处理这个张量的形状,我们将创建一个 torch.Tensor 对象
t = torch.tensor(dd)
print(t)
print(type(t)) # <class 'torch.Tensor'>
print(t.type()) # torch.LongTensor
print(t.dtype) # torch.int64
t = torch.Tensor(dd)
print(t)
print(type(t)) # <class 'torch.Tensor'>
print(t.type()) # torch.FloatTensor
print(t.dtype) # torch.float32
输出:
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
<class 'torch.Tensor'>
torch.LongTensor
torch.int64
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
<class 'torch.Tensor'>
torch.FloatTensor
torch.float32
4.PyTorch中张量的创建方法的选择
参考:
PyTorch中张量的创建方法的选择 | Pytorch系列(五)
二、张量的属性
参考:
Pytorch中张量讲解 | Pytorch系列(四)
作为神经网络程序员,我们需要注意以下几点:
- 张量包含统一类型(dtype)的数据。
- 张量之间的计算取决于 dtype 和 device。
1.张量的 torch.dtype
2.张量的 torch.device
3.张量的 torch.layout
三、张量的形状
Tensor_object.shape 与 **Tensor_object.size()**操作一致。
import torch
dd = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 为了处理这个张量的形状,我们将创建一个 torch.Tensor 对象
t = torch.tensor(dd)
print(t)
print(type(t)) # <class 'torch.Tensor'>
# 张量的形状
print(t.shape) # torch.Size([3, 3])
print(t.size()) # torch.Size([3, 3])
输出:
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
<class 'torch.Tensor'>
torch.Size([3, 3])
torch.Size([3, 3])
四、重构张量
参考:
深度学习中关于张量的阶、轴和形状的解释 | Pytorch系列
介绍:
当我们对神经网络进行编程时,我们必须经常执行的一种操作叫做reshape。
当我们的张量在网络中流动时,在网络内部的不同点上会出现特定的形状,作为神经网络程序员,我们的工作就是理解传入的形状,并有能力根据需要重构形状。
关于重构,需要注意的一点是,形状中的分量值的乘积必须等于张量中元素的总数。
import torch
dd = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
] # 二阶张量
t = torch.tensor(dd)
print(t)
t = t.reshape(1, 9)
print(t)
print(t.shape) # torch.Size([1, 9])
输出:
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
torch.Size([1, 9])
reshape函数中-1表示的意义
-1:表自动计算该位上的值。
import torch
dd = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
] # 二阶张量
t = torch.tensor(dd)
print(t)
t = t.reshape(-1, 1)
print(t)
print(t.shape) # torch.Size([1, 9])
输出:
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
tensor([[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
torch.Size([9, 1])
五、CNN中的输入张量形状和特征图
参考:
CNN中张量的输入形状和特征图 | Pytorch系列(三)
总结:
-
在CNN中的输入张量的形状通常长度为4,[Batch_size, Channels, Height, Width]。使用一个4阶张量表示一整个批次的图片,第一个轴代表图片批次(Image Batches)大小,第二个轴代表图片的颜色通道(Image Color Channels),最后两个轴表示图像的高度(Height)和宽度(Width)。
- 图片的颜色通道:对于RGB图像,此处的通常值为3;如果使用灰度图像,则通常值为1。此颜色通道的解释仅适用于输入张量。
- 图片批次:在神经网络中,我们通常都是批量处理样本,而不是只处理单个样本,因此该轴的长度告诉我们该批次中有多少个样本。
例如给定的张量的形状[3,1,28,28],我们可以确定这个批次是含有三张28x28的灰度图片。
-
输出通道:卷积操作会改变高度和宽度尺寸以及通道数,输出通道的数量是根据卷积层中使用的滤波器的数量而变化。卷积层的输出命名为输出通道而不是颜色通道。
-
特征图(Feature Maps):对于输出通道,我们不再拥有颜色通道,而是修改过的通道,我们称之为feature maps。这些所谓的特征图是使用输入颜色通道和卷积过滤器进行卷积的输出。
之所以使用“特征”这个词,是因为输出代表了图片的特定特征,比如边缘,这些映射是在网络在训练过程中学习的过程中出现的,并且随着我们深入网络而变得更加复杂。