当前位置:   article > 正文

Pytorch与Torch的关系与对比_pytorch和torch

pytorch和torch

pytorch可以说是torch的python版,然后增加了很多新的特性

torch是火炬的意思

 

上面的对比图来源于官网,官方认为,这两者最大的区别就是Pytorch重新设计了model模型和intermediate中间变量的关系,在Pytorch中所有计算的中间变量都存在于计算图中,所有的model都可以共享中间变量。而在torch中的中间变量则在每一个模块中,想要调用其他模块的参数就必须首先复制这个模块然后再调用,Python有很多特性是lua语言不具备的,Python的debug功能比lua强大很多,所以效率也就提升了

Pytorch与Torch

Pytorch采用python语言接口来实现编程,而torch是采用lua语言。Lua相当于一个小型加强版的C,支持类和面向对象,运行效率极高,与C语言结合“特别默契”,也就是说在Lua中使用C语言非常容易。torch是采用C语言作为底层,然后lua语言为接口的深度学习库。Pytorch也是主要采用C语言为接口,另外除了C语言那还有C++,因为Pytorch吸收结合了caffe2,进行了很多代码合并,现在Pytorch的底层虽然大部分还是C语言,但是接口什么的也逐渐向C++过渡。

目前来看,两者的底层库的C语言部分区别还是不大,尽管Pytorch使用了C++接口,但是由于代码的兼容性,使用torch拓展的底层代码在Pytorch中照样可以编译使用

编写模型

pytorch在编写模型时最大的特点就是利用autograd技术来实现自动求导,不需要我们再去麻烦地写一些反向的计算函数,这点上继承了torch

pytorch中,我们通过继承 nn.Module 设计一个层,然后定义我们平常使用的成员函数: __init__ forward ,这两个函数相比我们都很熟悉,另外 content_hook 是一个hook函数,通常在需要读取中间参数的时候使用:

  1. # 这个层是风格迁移中的内容层
  2. class ContentLoss(nn.Module):
  3. def __init__(self, target, weight):
  4. super(ContentLoss, self).__init__()
  5. self.target = target.detach()
  6. self.weight = weight
  7. self.loss = 0
  8. def forward(self, input):
  9. self.loss = F.mse_loss(input, self.target) * self.weight
  10. return input
  11. # 这个hook通过register_backward_hook后进行绑定才能使用
  12. # 通过绑定后,这里的函数在这个层进行backward的时候会执行
  13. # 在里面我们可以自定义一些操作实现其他的功能,比如修改grad_input
  14. def content_hook(self, module, grad_input, grad_output):
  15. return grad_input

而在torch中是这样设计的,我们利用lua语言的特定来设计class, __init updateOutput 和上面对应的 __init__ forward 功能相同。其实torch也是有 forward 函数实现,但是由于torch的局限性,不建议直接修改 forward ,我们需要修改 updateOutput 函数来实现forward操作:

  1. local ContentLoss, parent = torch.class('nn.ContentLoss', 'nn.Module')
  2. function ContentLoss:__init(strength, target)
  3. parent.__init(self)
  4. self.strength = strength
  5. self.target = target
  6. self.loss = 0
  7. self.crit = nn.MSECriterion()
  8. end
  9. -- 就是得到输入输出output
  10. function ContentLoss:updateOutput(input)
  11. if input:nElement() == self.target:nElement() then
  12. self.loss = self.crit:forward(input, self.target) * self.strength
  13. else
  14. print('WARNING: Skipping content loss')
  15. end
  16. self.output = input
  17. return self.output
  18. end
  19. -- 这里的函数在backward的时候会执行
  20. function ContentLoss:updateGradInput(input, gradOutput)
  21. if input:nElement() == self.target:nElement() then
  22. self.gradInput = self.crit:backward(input, self.target)
  23. end
  24. self.gradInput:mul(self.strength)
  25. self.gradInput:add(gradOutput)
  26. return self.gradInput
  27. end

通过对比Pytorch和Torch自顶层的设计大概分析了一下两者的区别,其实两者的很多功能函数的操作方式和命名都是类似的:

pytorch

torch

依赖库区别

Pytorch借助于Python强大的第三方库,已经存在的库可以直接使用,利用我们的图像读取直接使用Python自带的PIL图像库或者python-opencv都可以,其他各种想要实现的功能都可以利用python强大的第三方库实现:

https://oldpan.me/archives/pytorch-transforms-opencv-scikit-image https://oldpan.me/archives/pytorch-tensor-image-transform

而在torch中同样有很多Lua语言下开发的很多包:

torch可以很方便地拓展cuda和c代码实现更加丰富的自定义层和算法操作。

而pytorch的可以看这里:https://oldpan.me/archives/pytorch-combine-c-and-cuda

 

Reference

https://cloud.tencent.com/developer/article/1142510

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/356141
推荐阅读
相关标签
  

闽ICP备14008679号