【动手学深度学习v2】第二章预备知识-2.1入门

入门

深度学习领域方向
自然语言处理、计算机视觉、深度学习

具体领域
图片分类、物体检测与分割、样式迁移(为图片加滤镜)、人脸合成、文字生成图片、文字生成、无人驾驶

张量 

        表示一个多维矩阵,核心是一个数据容器,多数情况下包含数字,可以想象成一个数字的水桶。
        张量的每个值称为张量的元素,新的张量将存储在内存中,并且在计算时通常是基于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(一个视频批量)批量大小*时间*宽*高*通道


创建数组需要的元素:

  1. 形状:例3*4的矩阵
  2. 每个元素的数据类型:例如32位浮点数
  3. 每个元素的值:例如全是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. 通过适当复制元素来扩展一个或两个数组,以便在转换后两个张量具有相同的形状。
  2. 对生成的数组执行按元素操作。

总结:通过复制元素使两个张量形状相同后再按元素进行计算。

注:两个张量进行广播机制需满足以下条件:

  • 两个张量都至少有一个维度
  • 两个张量对应的每一个维度都要能够匹配的上(需满足以下三个条件):
    • 这两个维度大小相等
    • 某个维度,一个张量有,一个张量没有。
    • 某个维度,一个张量有,一个张量也有但是大小是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内置函数。

教材地址:《动手学深度学习》 — 动手学深度学习 2.0.0 documentation

B站教程: 02 深度学习介绍【动手学深度学习v2】_哔哩哔哩_bilibili

猜你喜欢

转载自blog.csdn.net/WS_Change/article/details/132032092