pytorch入门--Variable

如果用numpy或者Tensor来实现神经网络,需要手动写出前向过程和反向过程。对于简单的网络,反向过程中的导数容易求得,但是随着网络深度以及网络复杂度的增加,求出梯度的解析表达式是非常困难的。PyTorch的包autograd提供了自动求导的功能,当使用autograd时,定义前向网络会生成 一个计算图,每个节点是一个Tensor,边表示由输入Tensor到输出Tensor的函数。沿着计算图的反向传播可以很容易地计算出各个变量的梯度。在实现的时候,用到了Variable对象。Variable对Tensor对象进行封装,只需要Variable::data即可取出Tensor,并且Variable还封装了该Tensor的梯度Variable::grad(是个Variable对象)。现在用Variable作为计算图的节点,则通过反向传播自动求得的导数就保存在Variable对象中了。

定义:

input = Variable(torch.randn(N, D_in).type(torch.TensorFloat), requires_grad=False)#默认值是False。requires_grad控制着是否在反向传播过程中对该节点求梯度

下面通过在pytorch中构建动态计算图。

构建计算图

print(x.grad)

print(w_x.grad)

.......

可以求出各个变量的梯度。

上述代码从最开始处构建了如下的计算图。

上面的tensor换成Variable。PyTorch中, 将用户创建的Variable称之为叶子节点, 由叶子节点,加减乘除出来的Variable成为非叶子节点, 调用非叶子节点的backward函数, 就会沿着非叶子节点,一路回溯到叶子节点。

你可能感兴趣的:(pytorch入门--Variable)