前言
这篇博客主要记录有关深度学习数据操作部分的内容并介绍这一部分所需的基础知识。
本文的内容都是作者的理解,如果出现错误希望各位大佬能在留言区指正。也欢迎一同学习的同学们互相交流。
存储数据的工具——张量
张量的本质——一个n维的数组。
Q:为什么要用到张量呢?
A:张量类支持自动微分,这使得张量类更适合深度学习。
一、创建张量
首先,我们要导入torch。虽然这个库叫pytorch,但我们在代码中使用的是torch。导入pytorch后我们才能开始借助里面的函数来创建张量。
import torch
张量表示一个由数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量;具有两个轴的张量对应数学上的矩阵;具有两个轴以上的张量没有特殊的数学名称。
(一)、行向量
我们可以使用arange来建立一个行向量x,他们都默认创建为整数,但也可以指定创建为浮点数。张量中的每一个值被称为张量中的元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。
x = toech.arange(24)
print(x)
我们可以通过张量的shape属性来访问张量的形状(沿每个轴的长度)
print(x.shape)
如果想知道一个张量的元素个数,可以检查他的大小(size)。例子中处理的是一个向量,所以形状和大小是一样的。
print(x.numel())
(二)、矩阵
假如我们想要改变一个张量的形状但不改动其中所包含的元素,那么我们可以使用reshape函数来操作。例如在这里我们可以将原本的行向量变为一个(6,4)的矩阵。
x = x.reshape(6,4)
print(x)
记忆方式:
注:改变后的形状必须能刚好放下所有元素,不然就会报错。比如:将x变为(5,5)的矩阵
当遇到含有大量元素的张量时我们不用亲自计算出长度和宽度,我们可以让程序为我们自动计算得出。当我们知道长度或宽度后可以用-1来代替我们想让他自动计算的值,比如我们可以用(-1,4)或者(6,-1)来代替(6,4)。
x = x.reshape(-1,4)
print(x)
有时我们希望创建的矩阵中的元素全为0、1、其他常量或者从特定分布中随机采样的数字以此来初始化矩阵。比如我们可以创建一个(2,3,4)的全0张量。
print(torch.zeros((2,3,4)))
或者一个元素全部为1的张量
print(torch.ones((2,3,4)))
再或者是从均值为0标准差为1的正态分布中随机取值。
print(torch.randn(3,4))
除此之外,我们还可以通过给每一个元素都赋予确定的值来创建一个张量。
print(torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]))
(三)、张量运算
1.按元素计算
对于任意具有相同形状的张量, 常见的标准算术运算符(+
、-
、*
、/
和**
)都可以被升级为按元素运算。我们可以在同一形状的任意两个张量上调用按元素操作。注:**
是求幂运算。
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y
“按元素”计算也可以用于更多的计算方式比如求幂运算
print(torch.exp(x))
2.线性代数运算
除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法。
我们也可以把多个张量连结在一起, 把它们像积木一样地叠起来形成一个更大的张量。 我们只需要提供张量列表,并给出沿哪个轴连结。例如:当我们沿行(轴-0,形状的第一个元素)连结时
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(torch.cat((X, Y), dim=0))
或者当我们按列(轴-1,形状的第二个元素)连结时。
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(torch.cat((X, Y), dim=1))
我们可以通过逻辑运算符构建二元张量。比如X == Y如果在对应位置上成立,那么数值应该为1否则为0。
print(X == Y)
注:也可以换成X > Y或者X < Y试一试。
我们还可以对张量内的所有元素进行求和并输出
print(X.sum())
结语
这只是深度学习数据操作的一部分内容,后面的博客中会继续汇总这一基础部分的内容。
本文的内容都是作者在看完书后的理解,如果发现作者理解或者汇总出现错误,希望各位大佬能在留言区指正。也欢迎一同学习的同学们互相交流。