《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili
Pytorch人工智能,从安装到论文实战与代码相结合_哔哩哔哩_bilibili
【PyTorch深度学习】Lesson6.动态计算图与梯度下降_哔哩哔哩_bilibili
张量是什么?
在深度学习以及神经网络编程中,张量可以了看作多维数组,为啥要起一个张量的名字呢?因为我们需要处理的数据有零纬的(数),一维的(数组),二维的(矩阵),三维的(空间矩阵),以及很多维的,pytorch把他们统一起来,所以起名叫张量。
张量在运算中有什么特点?
在 Pytorch的张量计算过程中,如果我们设置初始张量是可微的,则在计算过程中,每一个由原张量计算得出的新张量都是可微的,并且还会保存此前一步的函数关系,这些函数关系都会保存在这些张量的一些属性里面,可以通过调用张量的属性即<name>.grad_fn进行查看,这也就是所谓的回溯机制。而根据这个回溯机制,我们就能非常清楚掌握张量的每步计算,并据此绘制张量计算图。
张量计算图是什么?
借助回溯机制,我们就能将张量的复杂计算过程抽象为一张图( Graph)。比如
#x 是包含一个数值为1的张量 后面的属性设置为ture 表明要进行微分运算 不写就默认为false
x = torch.tensor(1.,requires_grad=True)
x
tensor(1., requires_grad=True)
#grad_fn属性:存储Tensor微分函数
y=x**2
y
tensor(1., grad_fn=<PowBackward0>) #Pow指的是通过幂运算得到的
y.grad_fn #grad_fn就保存了函数关系
<PowBackward0 object at 0x000002D1D280F048>
z = y+1
z.grad_fn
<AddBackward0 object at 0x000002D1D27A2240>
z
tensor(2., grad_fn=<AddBackward0>) #add指的是通过加和运算得到的
●计算图的定义
上图就是用于记录可微分张量计算关系的张量计算图,图由节点和有向边构成,其中节点表示张量,边表示函数计算关系,方向则表示实际运算方向,张量计算图本质是有向无环图。
●节点类型
在张量计算图中,虽然每个节点都表示可微分张量,但节点和节点之间却略有不同。就像在前例中,y和z保存了函数计算关系,但x没有,而在实际计算关系中,我们不难发现z是所有计算的终点,因此,虽然x、y、z都是节点,但每个节点却并不一样。此处我们可以将节点分为三类,分别是:
a):叶节点,也就是初始输入的可微分张量,前例中x就是叶节点;
b):输出节点,也就是最后计算得出的张量,前例中z就是输出节点;
c):中间节点,在一张计算图中,除了叶节点和输出节点,其他都是中间节点,前例中y就是中间节点
当然,在一张计算图中,可以有多个叶节点和中间节点,但大多数情况下,只有一个输出节点,若存在多个输出结果,我们也往往会将其保存在一个张量中。
计算图的动态性是什么意思?
值得一提的是,PyTorch的计算图是动态计算图,会根据可微分张量的计算过程自动生成,并且伴随着新张量或运算的加入不断更新,这使得PyTorch的计算图更加灵活高效,并且更加易于构建,相比于先构件图后执行计算的部分框架(如老版本的TensorFlow),动态图也更加适用于面向对象编程。之前的老版本的tensorflow使用的是静态图,先构建各个张量之间的逻辑计算关系然后才允许你输入张量具体的值执行计算,所以就是先构建了一个图 这个图静态的保存了函数的各个计算关系,然后再输入张量 进行固定的张量的一些运算。
构件计算图的目的是什么?
最核心的目的就是完成反向传播。
当完成反向传播之后(一般是对输出节点尽心反向传播),可以通过<name>.grad 查看这个张量的梯度。
上面的例子 z.backwards()进行反向传播,注意,在默认情况下,在一张计算图上执行反向传播,只能计算一次,再次调用backward方法将报错。
x.grad #没有反应
z.backward() #执行反向传播
x.grad
#有反应
tensor(2.)
张量的基本操作
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
t.sum()
tensor(45)
t.sum(dim=0)
tensor([12, 15, 18])
t.sum(dim=1)
tensor([ 6, 15, 24])
t