Pytorch 中的 Tensor , Variable和Parameter区别与联系

前面的博客简单讲了Variable和Parameter的区别,这次加入tenor,详细的分析三者的区别和联系。文中参考了Pytorch 中的 Tensor , Variable & Parameter

1.Tensor

       pytorch中的Tensor类似于numpy中的array,而不直接用tensor的原因,是因为tensor能够更方便地在GPU上进行运算。pytorch为tensor设计了许多方便的操作,同时tensor也可以轻松地和numpy数组进行相互转换。

2.Variable

        Variable是对Tensor的封装,操作与tensor基本一致,不同的是,每一个Variable被构建的时候,都包含三个属性:

  • Variable中所包含的tensor
  • tensor的梯度 .grad
  • 以何种方式得到这种梯度 .grad_fn

        之所以有Variable这个数据结构,是为了引入计算图(自动求导),方便构建神经网络。       

        简单举个例子:

from torch.autograd import Variable
a = torch.randn(10, 5)
b = torch.randn(10, 5)
x = Variable(a, requires_grad=True)
y = Variable(b, requires_grad=True)
z = x + y
z.backward()
x.grad            # x的梯度 10x1 的全1 tensor
z.grad_fn         # <SumBackward0 object at 0x7f809e33fcf8> 

       通过调用backward(),我们可以对某个Variable(譬如说y)进行一次自动求导,但如果我们再对这个Variable进行一次backward()操作,会发现程序报错。这是因为PyTorch默认做完一次自动求导后,就把计算图丢弃了。我们可以通过设置retain_graph来实现多次求导。

3.Parameter

       我们知道网络中存在很多参数,这些参数需要在网络训练的过程中实时更新(一个batch更新一次),完成“学习”的过程,譬如最直观的梯度下降法更新参数w

w.data = w.data - lr * w.grad.data  # lr 是学习率
  • 网络中若是有100个参数,都要手写更新代码吗?1000个呢?10000个呢......
  • Variable默认是不需要求梯度的,那还需要手动设置参数 requires_grad=True
  • Variable因为要多次反向传播,那么在bcakward的时候还要手动注明参数w.backward(retain_graph=True)

​​​​​​​

        Pytorch主要通过引入nn.Parameter类型的变量和optimizer机制来解决了这个问题。Parameter是Variable的子类,本质上和后者一样,只不过parameter默认是求梯度的,同时一个网络net中的parameter变量是可以通过 net.parameters() 来很方便地访问到的,只需将网络中所有需要训练更新的参数定义为Parameter类型,再佐以optimizer,就能够完成所有参数的更新了,具体如下:

class Net(Module):
        def __init__(self, a, b, ...):
                super(net, self).__init__()
                self...   #  parameters
                self...    # layers
        def forward(self):
                x = ...
                x = ...    # 数据流
                return x
net = Net(a, b, ...)
net.train()
...
optimizer = torch.optim.SGD(net.parameters(), lr=1e-1)
# 然后在每一个batch中,调用optimizer.step()即可完成参数更新了(loss.backward()之后)

 

 

  • 22
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值