UDN-企业互联网技术人气社区

板块导航

浏览  : 1460
回复  : 0

[云计算] Facebook最新开源Torchnet工具包,加速人工智能研究

[复制链接]
舞操的头像 楼主
  昨日,Facebook 研究人员开源 Torchnet 工具包,并表示这个工具包可快速建立有效且可重复使用的学习系统,从而促进深度学习协同发展。在发布的这篇 Blog 中,Facebook 的三位研究人员介绍了 Torchnet 的特性以及功用,并使用案例进行了详细讲解。

  开源的 Torchnet 能够帮助研究人员及开发者在 Torch 中建立快速且可重复使用的学习系统原型。在建立快速而简洁的深度机器学习运算原型上,Torchnet 帮助我们向前迈进了一大步。它是使用 Torch 的一种新型软件工具包,可以促进深度学习实验的快速协同发展。

  这周于纽约召开的国际机器学习大会(ICML)上我们介绍并开放了源码的 Torchnet,提供包括样板文件代码,关键抽象化及实施参考的工具集合,能够相互咬合或被拆解继而重新使用,大大加快了该领域的发展。它促进了模块化的程序设计方法,减少了异步使用简化中的漏洞,实现了并行数据加载及高效 GPU 计算。

b.webp.jpg


  Facebook 发布的 Torchnet 论文,点击阅读原文下载

  Torchnet 建立在 Torch 的成功之上,后者是一种通过在 CPU (OpenMP/SSE) 和 GPU (CUDA)上快速实现常见代数运算,从而建立深度学习模型的框架。

  一个实验框架

  尽管 Torch 已经成为深度机器学习领域研究的主要框架之一,但它不提供机器学习实验的抽象化代码和样板文件代码。因此研究者们不得不反复从零开始编写实验代码——犯同样的错并可能得出错误结论——完全拖慢了发展进度。我们创造Torchnet 就是为了提供给研究者们有关如何建立代码的清晰指引,和能够加快开发进度的样板文件代码。

  模块化 Torchnet 的设计简化了对数据集,数据加载过程,模型,优化和性能指标等一系列变分编码的测试过程。这使得快速试验成为可能。例如在不同数据集上运行相同的实验,和插入不同(bare-bones)数据装载机一样简单,改变评价标准只需更改一行代码来插入不同的性能表。Torchnet 的总体设计类似于 Legos,其模块建立在一套能够实现简便咬合的协议之上。联锁块制定了一个通用系统,保证组件能够坚固地安装在一起并可以轻易更换其他组件。我们还开发了有关如何建立新组件的清晰指引。

  开源 Torch 已经拥有了一个活跃的开发者社区,他们创建了优化包,流形学习,度量学习与神经网络等。在此基础上建立的 Torchnet 作为一个服务平台,主要通过执行机器学习实验或工具的插件,供研究者共享成果。

  GPU支持

  机器学习与人工智能已经出现很多年,它们的大多最新研究进展已经被公用研究数据集和更强大的计算机所支持——尤其是 GPUs。

  Torchnet 与诸如 Caffe, Chainer, TensorFlow 和 Theano 的深度学习框架基本上是不同的,它不关注深度网络中的有效推论执行和梯度计算,而是提供一个位于深度学习框架之上的框架(也即 torch/nn),从而方便快速试验。Torchnet 提供一组子集包并执行五种主要类型的抽象化:

  数据集——提供返回数据集中样本数的 size 函数,及一个返回到数据集中 idx-th 样本的 get(idx)函数。

  数据集迭代器——从 1 到数据集尺寸的简单 for 循环,并调用 get() 函数的循环值作为输入。

  引擎——提供训练和测试模型所必需的标准逻辑。

  计量仪——用作性能测量,比如一次训练的运行时间或所有样本的平均损失函数值。

  日志——用来记录实验。

  最重要的子集包负责与机器学习问题有关的样板文件代码的实现。它们包括计算机视觉,自然语言处理和语音处理。

  其他子集包或许体量更小,关注的是更明确的问题甚至数据集。比如像 Imagenet 和 COCO 这样的视觉数据集,TIMIT 和 LibriSpeech 这种语音数据集,以及类似 One Billion Word Benchmark 和 WMT-14 的文本数据集。

  案例

  这一节我将展示一个简单而基础的、运用Torchnet在MNIST上训练逻辑回归的例子。首先是必要的依赖代码:

  
  1. require ’nn’local tnt = require ’torchnet’local mnist = require ’mnist’
复制代码


  接着我们定义一个在 MNIST 训练集或测试集上构造异步数据集迭代器的函数。这个数据集迭代器接收一个用来构建 Torchnet 数据集对象的闭包(closure)作为输入。这里的数据集是从包含图像和目标的张量中,仅返回相关行的一个ListDataset;其实你也可以用自己的数据集定义来替换这个 ListDataset。核心数据集会被装进一个 BatchDataset 中用以构建 128 大小的 mini-batches。

 
  1.  local function getIterator(mode)

  2.   return tnt.ParallelDatasetIterator{

  3.   nthread = 1,

  4.   init = function() require 'torchnet' end,

  5.   closure = function()

  6.   local dataset = mnist[mode .. 'dataset']()

  7.   return tnt.BatchDataset{

  8.   batchsize = 128,

  9.   dataset = tnt.ListDataset{

  10.   list = torch.range(

  11.   1, dataset.data:size(1)

  12.   ),

  13.   load = function(idx)

  14.   return {

  15.   input = dataset.data[idx],

  16.   target = torch.LongTensor{

  17.   dataset.label[idx]

  18.   },

  19.   } -- sample contains input and target

  20.   end,

  21.   }

  22.   }

  23.   end,

  24.   }end
复制代码


  随后,建立一个简单的线性模型:

  
  1. local net = nn.Sequential():add(nn.Linear(784,10))
复制代码


  接下来,我们初始化 Torchnet 引擎并执行重置,更新,打印平均损失和平均分类错误的挂钩。在训练标准中调用forward() 之后,再调用这个更新平均损失和平均分类错误的挂钩:

  
  1. local engine = tnt.SGDEngine()local meter = tnt.AverageValueMeter()local clerr = tnt.ClassErrorMeter{topk = {1}}

  2.   engine.hooks.onStartEpoch = function(state)

  3.   meter:reset()

  4.   clerr:reset()end

  5.   engine.hooks.onForwardCriterion = function(state)

  6.   meter:add(state.criterion.output)

  7.   clerr:add(

  8.   state.network.output, state.sample.target)

  9.   print(string.format(

  10.   'avg. loss: %2.4f; avg. error: %2.4f',

  11.   meter:value(), clerr:value{k = 1}))end
复制代码


  然后,最小化使用 SGD 的逻辑损失:

  
  1. local criterion = nn.CrossEntropyCriterion()

  2.   engine:train{

  3.   network = net,

  4.   iterator = getIterator('train'),

  5.   criterion = criterion,

  6.   lr = 0.1,

  7.   maxepoch = 10,}
复制代码


  训练完毕后,我们在测试集上测量平均损失和平均分类错误:

  
  1. engine:test{

  2.   network = net,

  3.   iterator = getIterator(’test’),

  4.   criterion = criterion,}
复制代码


  更高级的例子可能会在引擎中实行额外的挂钩。比如你想在每个训练期后测量试验误差,就需要 EndEpoch 挂钩。运行GPU 做同一个案例,则需增加一些简单代码——这里尤其注意把模型和数据备份到 GPU 中。可通过在样本可用后执行一个挂钩的方式将数据样本复制到 GPU3 的缓冲区。

 
  1.  require 'cunn'

  2.   net = net:cuda()

  3.   criterion = criterion:cuda()local input = torch.CudaTensor()local target = torch.CudaTensor()

  4.   engine.hooks.onSample = function(state)

  5.   input:resize(

  6.   state.sample.input:size()

  7.   ):copy(state.sample.input)

  8.   target:resize(

  9.   state.sample.target:size()

  10.   ):copy(state.sample.target)

  11.   state.sample.input = input

  12.   state.sample.target = targetend
复制代码


  协同智能

  开源 Torchnet 的目的是授权开发者社区,快速建立有效且可重复使用的学习系统。原型能够更快咬合,实验便可蓬勃发展。成功的实现方案将更容易复制,漏洞也会随之减少。

  我们希望 Torchnet 能开辟出 Torch 社区的协同智能,从而一起创造更高效的深度学习实验。

原文作者: 机器之心 来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部