入门
深度学习领域方向
自然语言处理、计算机视觉、深度学习
具体领域
图片分类、物体检测与分割、样式迁移(为图片加滤镜)、人脸合成、文字生成图片、文字生成、无人驾驶
张量
表示一个多维矩阵,核心是一个数据容器,多数情况下包含数字,可以想象成一个数字的水桶。
张量的每个值称为张量的元素,新的张量将存储在内存中,并且在计算时通常是基于CPU的。
N维数组是机器学习和神经网络的主要数据结构。
张量维度 | 代表含义 |
0维张量 | 标量(数字) |
1维张量 | 向量 |
2维张量 | 矩阵 |
3维张量 | 时间序列数据 股价 文本数据 单张彩色图片 |
4维张量 | 图像 |
5维张量 | 视频 |
0-d(标量)一个类别
1-d(向量)一个特征向量
2-d(矩阵)一个样本-特征矩阵
3-d(RGB图片)宽*高*通道[(width, height, channel) = 3D]
4-d(一个RGB图片批量)批量大小*宽*高*通道[(batch_size, width, height, channel) = 4D]
5-d(一个视频批量)批量大小*时间*宽*高*通道
创建数组需要的元素:
- 形状:例3*4的矩阵
- 每个元素的数据类型:例如32位浮点数
- 每个元素的值:例如全是0
例子:
访问元素
访问第二行第三列元素
访问第二行所有元素
访问第二列所有元素(表示方法有误,应改为 一列:[:,1])
1:3 表示访问的是第二行到第三行,实质上为[1,3)的一个区间,不包括第四行
1: 表示从第一列开始的所有列跳着访问, ::3 表示从第0行到第四行,::2 表示从第0列到第三列
常见构造Tensor(张量)的方法
x=torch.arange(start=0,step=1,*,out=None,dtype=None, layout=torch.strided, device=None, requires_grad=False) --> Tensor
作用:表示返回大小为[(end-start)/step]的一维张量,值介于[start,end)区间,以step为步长等间隔取值。
参数意义:
start:起始值,默认值为0
end:结束值
step:步长,默认值为1
out:输出张量
dtype:期待返回的张量,如果是None,使用全局默认值,如果未给出dtype,则从其他输入参数推断类型,如果 start、end、step 任意一个数是浮点数,则dtype推断为默认值
例:
本章用到的一些方法如下:
x.shape():可以查看已创建的张量x的形状。
x.numel():可以查看张量的大小。
x.reshape():可以改变张量的形状而不改变元素的量以及元素的值,并且张量的大小也没有改变。
torch.zeros():创建一个全0的张量(元素都为0)。
torch.ones():创建一个全1的张量。
torch.device():代表torch.Tensor分配到对象存储的设备,包含一个设备类型和可选设备的序号,没有序号默认为当前设备。torch.randn():表示创建一个元素都从均值为0,标准差为1的正态分布中随机采样。
torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False) 构造一个包含单一数据类型元素的多维矩阵,通过提供列表为张量的每个元素赋予确定的值。
data:张量的初始数据。可以是列表、元祖、numpy和数组、标量等类型。torch.exp(input,*,out=None) --> Tensor:对input逐元素进行以自然数e为底指数运算。
math.log(x[,base]) :该操作是导入math,然后对二维张量(0,ln2)进行逐元素的以自然数e为底数的求幂运算。
x:输入的数字,如果不是数字返回TypeError,如果是0或负数,返回ValueError。
base:可选,log函数的底数,默认是e。torch.cat(tensors,dim=0,*,out=None)-->Tensor:将多个tensor类型张量进行连接。
tensors:tensor元祖或者tensor列表。
dim:可选参数,代表张量连接的维数,若tensor是二维的,dim=0表示在行上连接,dim=1指在列上连接。torch.reshape(input,shape):返回具有相同数据和元素的张量,且具有指定的形状。
input(Tensor) 要被重塑的张量
shape(python元组:int) 新的形状torch.zeros_like(tensor):生成和括号内张量维度一致的全是零的块。
torch.device()的使用方法:
torch.randn()的使用方法:
torch.tensor的使用方法:
torch.exp()的使用方法:
这里可以将这个函数泛化为下面这个数学式子
torch.zeros_like()的使用方法:
广播机制
- 通过适当复制元素来扩展一个或两个数组,以便在转换后两个张量具有相同的形状。
- 对生成的数组执行按元素操作。
总结:通过复制元素使两个张量形状相同后再按元素进行计算。
注:两个张量进行广播机制需满足以下条件:
- 两个张量都至少有一个维度
- 两个张量对应的每一个维度都要能够匹配的上(需满足以下三个条件):
- 这两个维度大小相等
- 某个维度,一个张量有,一个张量没有。
- 某个维度,一个张量有,一个张量也有但是大小是1。
使用广播机制的例子:
解释:x为1行2列的矩阵,y为3行1列的矩阵,二者要想实现相加,x需要将第一行的元素复制到第二行和第三行,y需要将第一列的元素复制到第二列,这样二者形状相同,可以完成按元素相加操作。
索引和切片
张量的元素可以通过索引访问,第一个元素的索引是0,最后一个元素的索引是-1。
例:
X[-1]表示选择X张量的最后一个元素,X[1:3]表示取到X张量的第二个到第三个元素。
也可以指定索引将元素写入矩阵。
X[1,2] = 9 表示将原第二行第三列的元素改为9。
同时为多个元素赋予相同的值,可以将全部元素索引后赋值。
原有X张量中第一行与第二行的元素:
重新赋值后,X张量中第一行与第二行元素被改为了12。
X[0:2,:] = 12 中, : 表示索引全部元素。
节省内存
运行一些操作可能会为新结果分配内存。
id(Y)操作可以提供内存引用对象的确切地址,执行了Y = Y + X 后,Y的内存发生改变,执行id(Y) == before 结果为False,可以看出其内存发生改变。
日常工作中,我们不想总是进行不必要的分配内存,我们希望原地执行这些更新。
如果不原地更新,其他引用仍然会指向旧的内存位置,某些代码无意中会引用旧的参数,这是不可取的。
可以采用切片法将操作的结果分配给先前分配的数组。如Y[:] = <expression>
可以使用X[:]= X + Y或X += Y减少内存操作的开销。
转换为其他Python对象
深度学习中定义的张量(Tensor)与Python中NumPy张量(ndarray)的相互转换很容易,并且torch张量和numpy数组将共享底层内存。
将大小为1的张量转换为python标量,可以调用item函数或python内置函数。