分享一篇关于pytorch和torch关系的文章,讲的很清楚。

本文转载至:https://m.oldpan.me/archives/pytorch-torch-relation, 对pytorch感兴趣的可以关注Oldpan博客微信公众号,干货多多,同步更新博客深度学习文章。

Pytorch发布已经有一段时间了,我们在使用中也发现了其独特的动态图设计,让我们可以高效地进行神经网络的构造、实现我们的想法。那么Pytorch是怎么来的,追根溯源,pytorch可以说是torch的python版,然后增加了很多新的特性,那么pytorch和torch的具体区别是什么,这篇文章大致对两者进行一下简要分析,有一个宏观的了解。

上面的对比图来源于官网,官方认为,这两者最大的区别就是Pytorch重新设计了model模型和intermediate中间变量的关系,在Pytorch中所有计算的中间变量都存在于计算图中,所有的model都可以共享中间变量。而在torch中的中间变量则在每一个模块中,想要调用其他模块的参数就必须首先复制这个模块然后再调用。

当然,Python有很多特性是lua语言不具备的,Python的debug功能比lua强大很多,所以效率也就提升了。

Pytorch与Torch

接下来让我们稍微稍微具体谈一下两者的区别(ps:torch是火炬的意思)。

我们都知道Pytorch采用python语言接口来实现编程,而torch是采用lua语言,Lua是一个什么样的语言,可以这样说,Lua相当于一个小型加强版的C,支持类和面向对象,运行效率极高,与C语言结合“特别默契”,也就是说在Lua中使用C语言非常容易也很舒服。

因此,torch是采用C语言作为底层,然后lua语言为接口的深度学习库。而Pytorch呢,Pytorch其实也是主要采用C语言为接口(相关文章),另外除了C语言那还有C++了,因为Pytorch吸收结合了caffe2,进行了很多代码合并,现在Pytorch的底层虽然大部分还是C语言,但是接口什么的也逐渐向C++过渡。

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

编写模型方面的区别

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

举个例子:

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

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

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

local ContentLoss, parent = torch.class('nn.ContentLoss', 'nn.Module')function ContentLoss:__init(strength, target)parent.__init(self)self.strength = strengthself.target = targetself.loss = 0self.crit = nn.MSECriterion()
end-- 就是得到输入输出output
function ContentLoss:updateOutput(input)if input:nElement() == self.target:nElement() thenself.loss = self.crit:forward(input, self.target) * self.strengthelseprint('WARNING: Skipping content loss')endself.output = inputreturn self.output
end-- 这里的函数在backward的时候会执行
function ContentLoss:updateGradInput(input, gradOutput)if input:nElement() == self.target:nElement() thenself.gradInput = self.crit:backward(input, self.target)endself.gradInput:mul(self.strength)self.gradInput:add(gradOutput)return self.gradInput
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

后记

暂且说这么多,Pytorch和Torch都很优秀,现在仍然有很多优秀的项目是使用torch来编写,Pytorch和torch的思想都值得我们去借鉴,闲暇之余,我们也可以看看Torch的代码,体验一下其优秀的构架和设计。

Torch-WIki:https://github.com/torch/torch7/wiki/Cheatsheet

参考资料:
https://apaszke.github.io/torch-internals.html

pytorch与torch的关系相关推荐

  1. 2021.08.23学习内容Pytorch与Torch的关系以及Torchvision作用

    ** PyTorch **: 是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序. 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTo ...

  2. PyTorch 中 torch.optim优化器的使用

    一.优化器基本使用方法 建立优化器实例 循环: 清空梯度 向前传播 计算Loss 反向传播 更新参数 示例: from torch import optim input = ..... optimiz ...

  3. 8_用opencv调用深度学习框架tenorflow、Pytorch、Torch、caffe训练好的模型(20190212)

    用opencv调用深度学习框架tenorflow.Pytorch.Torch.caffe训练好模型(20190212) 文章目录: https://blog.csdn.net/hust_bochu_x ...

  4. Pytorch学习-torch.max()和min()深度解析

    Pytorch学习-torch.max和min深度解析 max的使用 min同理 dim参数理解 二维张量使用max() 三维张量使用max() max的使用 min同理 参考链接: 参考链接: 对于 ...

  5. 【PyTorch】torch.cat==>张量拼接,在图像的应用上可以有效利用原始图像结构信息

    1. 字面理解:torch.cat是将两个张量(tensor)拼接在一起,cat 是 concatenate 的意思,即拼接,联系在一起. 使用torch.cat((A,B),dim)时,除拼接维数d ...

  6. Pytorch和Torch和torchvision的安装

    超详细的Pytorch和torch和torchvision的安装步骤~~~~~ Pytorch安装步骤 包地址:https://download.pytorch.org/whl/torch_stabl ...

  7. YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别

    YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别 区别: 1. torch.tensor.size() 可用通过 :t ...

  8. Pytorch中torch.nn.Softmax的dim参数含义

    自己搞了一晚上终于搞明白了,下文说的很透彻,做个记录,方便以后翻阅 Pytorch中torch.nn.Softmax的dim参数含义

  9. 深入浅出Pytorch函数——torch.zeros

    分类目录:<深入浅出Pytorch函数>总目录 相关文章: · 深入浅出Pytorch函数--torch.Tensor · 深入浅出Pytorch函数--torch.ones · 深入浅出 ...

  10. 深入浅出Pytorch函数——torch.arange

    分类目录:<深入浅出Pytorch函数>总目录 相关文章: · 深入浅出TensorFlow2函数--tf.range · 深入浅出Pytorch函数--torch.arange · 深入 ...

最新文章

  1. Cypress USB开发文档列表(积累中)
  2. Android构建流程——篇七
  3. 论文浅尝 | 改善多语言KGQA的 Zero-shot 跨语言转换
  4. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量
  5. php mysql 日期查找_PHP / MySQL存储和搜索日期
  6. 华为机试——整理数字字符串
  7. python多维列表索引越界怎么处理_Python中remove漏删和索引越界问题的解决
  8. java打卡-day3 变量和数据类型
  9. python 推荐系统库_python-recsys:一款实现推荐系统的python库
  10. python tkinter应用:文本编辑器
  11. 【MATLAB】通信信号调制通用函数 — 带通滤波器
  12. 卫星通信 | 使用虹科SAF手持式频谱分析仪进行TDD信号分析
  13. android加载dex方法,[原创]分享一个快速加载dex文件的方法
  14. WebRTC音频处理流程简介
  15. 2019年首批!网易易盾加固系统通过中国反网络病毒联盟认证
  16. 《深入理解Bootstrap》勘误
  17. 企业运维,至少包括如下几个大方面: 1,桌面运维(以windows为主,工资偏低,桌面运维经理可以达到8K到10K,很多人在公司里干的就是安装windows系统,windows里的QQ坏了重装下,砸个
  18. 第17课:强化学习的模型训练
  19. 斯坦福cs231n作业数据集下载
  20. Java中2.5D游戏(斜45度角)的设计与实现(1)

热门文章

  1. Aspose.Words五 MergeField
  2. netty 给指定用户推送消息_Netty实战:设计一个IM框架就这么简单!
  3. Winedit7.0自定义一键编译
  4. 有时候你只是看起来很努力
  5. 对校招生培养工作的建议_19、贵单位对我院学生培养工作有何建议:
  6. 单身的程序猿伤不起,在神棍节感慨下
  7. mmdetection在bbox head中获取epoch值
  8. MySQL字符集是什么
  9. 如何管理好一个研发管理团队
  10. 程序员的爱情最纯洁?