资讯专栏INFORMATION COLUMN

Facebook最新开源Torchnet工具包,加速人工智能研究

hightopo / 2033人阅读

摘要:昨日,研究人员开源工具包,并表示这个工具包可快速建立有效且可重复使用的学习系统,从而促进深度学习协同发展。支持机器学习与人工智能已经出现很多年,它们的大多研究进展已经被公用研究数据集和更强大的计算机所支持尤其是。

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

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

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

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上训练逻辑回归的例子。首先是必要的依赖代码:

require ’nn’local tnt   = require ’torchnet’local mnist = require ’mnist’

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

local function getIterator(mode)

  return tnt.ParallelDatasetIterator{

    nthread = 1,

    init    = function() require "torchnet" end,

    closure = function()

      local dataset = mnist[mode .. "dataset"]()

      return tnt.BatchDataset{

         batchsize = 128,

         dataset = tnt.ListDataset{

           list = torch.range(

             1, dataset.data:size(1)

           ), 

           load = function(idx)

             return {

               input  = dataset.data[idx],

               target = torch.LongTensor{

                 dataset.label[idx]

               },

             } -- sample contains input and target

           end,

        }

      }

    end,

  }end

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

local net = nn.Sequential():add(nn.Linear(784,10))

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

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

engine.hooks.onStartEpoch = function(state)

  meter:reset()

  clerr:reset()end

engine.hooks.onForwardCriterion = function(state)

  meter:add(state.criterion.output)

  clerr:add(

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

  print(string.format(

    "avg. loss: %2.4f; avg. error: %2.4f",

    meter:value(), clerr:value{k = 1}))end

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

local criterion = nn.CrossEntropyCriterion()

engine:train{

  network   = net,

  iterator  = getIterator("train"),

  criterion = criterion,

  lr        = 0.1,

  maxepoch  = 10,}

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

engine:test{

  network   = net,

  iterator  = getIterator(’test’),

  criterion = criterion,}

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

require "cunn"

net       = net:cuda()

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

engine.hooks.onSample = function(state)

  input:resize( 

      state.sample.input:size()

  ):copy(state.sample.input)

  target:resize(

      state.sample.target:size()

  ):copy(state.sample.target)

  state.sample.input  = input

  state.sample.target = targetend

协同智能

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

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

欢迎加入本站公开兴趣群

商业智能与数据分析群

兴趣范围包括各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识

QQ群:81035754

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/4354.html

相关文章

  • Facebook贾扬清宣布新机器学习系统Caffe2Go

    摘要:这一新程序被称为,是一个完整的深度学习系统,它的架构已经嵌入手机中。因此,移动设备环境对机器学习系统提出了机遇和挑战。展望下一步,加上这样的研究工具链,是的机器学习产品的核心。 风格迁移一直是机器学习领域内的一项重要任务,很多研究机构和研究者都在努力打造速度更快、计算成本更低的风格迁移机器学习系统,比如《怎么让你的照片带上艺术大师风格?李飞飞团队开源快速神经网络风格迁移代码 》、《谷歌增强型...

    Rango 评论0 收藏0
  • 以静制动的TensorFlow Fold动态计算图介绍

    摘要:近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流向。所以动态框架对虚拟计算图的构建速度有较高的要求。动态计算图问题之一的多结构输入问题的高效计 随着深度学习的发展,深度学习框架之间竞争也日益激烈,新老框架纷纷各显神通,想要在广大DeepLearner的服务器上占据一席之地。近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流...

    waltr 评论0 收藏0
  • Facebook联合微软推出神经网络交换格式ONNX

    摘要:近日,与微软联合推出了开放式神经网络交换格式,它是一个表征深度学习模型的标准,可实现模型在不同框架之间的迁移。例如,在中,条件句通常是对输入张量的大小或维度上的计算。 近日,Facebook 与微软联合推出了开放式神经网络交换(ONNX)格式,它是一个表征深度学习模型的标准,可实现模型在不同框架之间的迁移。ONNX 是构建开源生态环境的第一步,供人工智能开发者轻松选择并组合较先进的工具。开发...

    CrazyCodes 评论0 收藏0
  • 最新Github上各DL框架Star数量大PK

    摘要:下图总结了绝大多数上的开源深度学习框架项目,根据项目在的数量来评级,数据采集于年月初。然而,近期宣布将转向作为其推荐深度学习框架因为它支持移动设备开发。该框架可以出色完成图像识别,欺诈检测和自然语言处理任务。 很多神经网络框架已开源多年,支持机器学习和人工智能的专有解决方案也有很多。多年以来,开发人员在Github上发布了一系列的可以支持图像、手写字、视频、语音识别、自然语言处理、物体检测的...

    oogh 评论0 收藏0
  • IBM表示已经打破Facebook人工智能服务器扩展记录

    摘要:日前,公司宣布推出其分布式深度学习软件的测试版,该软件证明了在深度学习表现出来的技术飞跃。系统加速和内存总监在一篇博文中表示更受欢迎的深度学习框架扩展到服务器中的多个,而不是扩展到具有的多个服务器。 日前,IBM 公司宣布推出其分布式深度学习软件的测试版,该软件证明了在深度学习表现出来的技术飞跃。深度学习是人工智能的一种形式,它依赖于人工神经网络的应用。其重点是让计算机能够像人们那样理解数字...

    Yumenokanata 评论0 收藏0

发表评论

0条评论

hightopo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<