浅谈Pytorch与Torch的关系

本文对比分析了Pytorch和Torch两种深度学习框架的区别,包括动态图设计、中间变量处理、模型编写、语言接口及底层实现。Pytorch在Python环境下提供更强大的debug功能和自动求导能力,而Torch则基于Lua语言,拥有与C语言的良好结合。
部署运行你感兴趣的模型镜像

前言

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 = weight
        self.loss = 0

    def forward(self, input):
        self.loss = F.mse_loss(input, self.target) * self.weight
        return input

    # 这个hook通过register_backward_hook后进行绑定才能使用
    # 通过绑定后,这里的函数在这个层进行backward的时候会执行
    # 在里面我们可以自定义一些操作实现其他的功能,比如修改grad_input
    def 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 = strength
  self.target = target
  self.loss = 0
  self.crit = nn.MSECriterion()
end

-- 就是得到输入输出output
function ContentLoss:updateOutput(input)
  if input:nElement() == self.target:nElement() then
    self.loss = self.crit:forward(input, self.target) * self.strength
  else
    print('WARNING: Skipping content loss')
  end
  self.output = input
  return self.output
end

-- 这里的函数在backward的时候会执行
function ContentLoss:updateGradInput(input, gradOutput)
  if input:nElement() == self.target:nElement() then
    self.gradInput = self.crit:backward(input, self.target)
  end
  self.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

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

参考资源链接:[浅谈pytorch torch.backends.cudnn设置作用](https://wenku.youkuaiyun.com/doc/6401abe5cce7214c316e9e47?utm_source=wenku_answer2doc_content) 在深度学习的模型训练中,合理配置PyTorchtorch.backends.cudnn能够显著提升计算效率。首先,我们需要了解torch.backends.cudnn的功能和作用。cuDNN(CUDA Deep Neural Network library)是专门为深度神经网络设计的GPU加速库,它使用了多种优化算法来提升运算速度,但这些算法是非确定性的。这意味着在不同的输入尺寸或类型下,cuDNN可能会选择不同的算法来实现最优性能,这可能会导致每次运行结果的一致性问题。 为了获得最佳性能,我们通常推荐在输入数据维度或类型变化不大时开启torch.backends.cudnn.benchmark。这个选项允许cuDNN自动寻找最适合当前硬件配置的算法,以优化运行速度。但需要注意,开启这一选项可能会导致每次运行模型时得到略有差异的结果,这对于需要精确重现结果的实验是不利的。 如果你希望获得更一致的运行结果,可以在模型训练前将torch.backends.cudnn.deterministic设置为True,这样cuDNN会使用确定性算法,以保证每次运行结果的一致性,代价是可能会牺牲一些性能。 下面是一个简单的示例代码,展示如何进行配置: ```python import torch import torch.backends.cudnn as cudnn # 设置为True,cuDNN将采用确定性算法,保证每次运行结果的一致性 cudnn.deterministic = True # 设置为True,cuDNN将自动寻找最合适的算法以优化性能 cudnn.benchmark = True # 开启或关闭cuDNN的加速功能 cudnn.enabled = True # 接下来是模型训练代码... ``` 通过上述配置,我们可以在保持结果一致的同时,尽可能地提升模型训练的速度。但是,务必在实际应用中测试不同的配置对性能的影响,因为硬件配置和具体任务的差异可能会导致不同的最优配置。 为了进一步深入学习关于PyTorch中cuDNN配置的知识,你可以参考《浅谈pytorch torch.backends.cudnn设置作用》这篇资料。该资料详细解释了cuDNN的工作原理,torch.backends.cudnn的各个配置项及其作用,并通过实例展示了如何在实际项目中应用这些设置来优化深度学习模型的训练过程。深入理解这些内容,将有助于你更灵活地应用PyTorch进行高效模型训练。 参考资源链接:[浅谈pytorch torch.backends.cudnn设置作用](https://wenku.youkuaiyun.com/doc/6401abe5cce7214c316e9e47?utm_source=wenku_answer2doc_content)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值