神器Pytorch(1)

话说,自从我自己入坑深度学习以来,也是用了不少的框架,什么Tensorflow、Chainer、Theano、Caffe、Torch等等。鉴于赶时髦以及对谷歌老大的盲目崇拜与脑残般的信任,我和很多友商公司的小伙伴们一直都在执着地使用着Tensorflow。

Tensorflow这货固然是不错,不管是从其背后老大的业界影响力还是社区的火热程度来看,都可以让我们感觉到这东西是很有前途的。不过,随着接触的工程的复杂性慢慢增强,以及自己逐步对Paper做实现的工作慢慢多起来,我越来越觉得Tensorflow有点不捏么好用。

先说说它的三大“罪状”吧。

第一、频繁变动的接口

几乎每一个从Tensorflow 0.x开始使用它的码农们都能感受到Tensorflow接口API变动的变态程度。几乎每一个小版本的升级都会导致原先旧版本上编译通过的代码在新版本上报错。究竟Tensorflow官方处于什么动机才使用这样的策略我不得而知,但是每次发生这种情况我总有骂街的冲动。我们的目的是为了做工程,在生产环境中运行稳定,开发具有连贯性,不是来追求回字的四种写法的。

第二、繁多的模块

或许是处于好意,很多的团队都为Tensorflow开发了封装的接口工程,相信很多人也都有印象——Keras、TFLearn、Slim、TensorLayer等等,每一种都有自己的函数接口,写法各不相同,而且种类还在不断翻新。也就是说,在Tensorflow的世界观中,回字远不止四种写法……问题是它翻新我就闹心,到现在为止我在阅读Github上各种代码的时候,已经见过了基于不下10种的不同模块接口的工程。这让阅读和维护都有无限的痛感。

第三、繁文缛节般的运行方式

在Tensorflow里,一个网络的定义完,当你想训练它。你需要在程序的“正文部分”使用

sess.run(xxx)

这样的方式进行调用。

Tensorflow会根据你定义的图再去找这个部分对应的表达式依赖关系。这样就会导致在运行中,你会感觉自己在朗读“倒装句”一样的在回顾这个网络的训练过程。

如果你想输出一个Tensor的值,你同样需要使用诸如

print(sess.run(xxx))

一类的方法来做输出。这种感觉非常不方便,非常不Python。

这种方式也会直接导致在运行的过程中,报错的信息位置和代码的语句位置不对应,给排错带来很多的麻烦。

这些问题,对于使用Tensorflow已经很熟练的人来说,也许不再是什么问题,然而对于那些希望学习深度学习的同学来说,这就非常痛苦,令人生畏。好在,现在有了Pytorch。

Pytorch有着更简洁优美的接口,更为友好,更为接地气,让一个普通Python程序员几乎可以无痛过度到对深度学习的学习中来,而不用再去跟着Tensorflow那怪异的思路编程。

我们随便来看一个例子就知道了,同样的功能,不一样的风格:

Pytorch:
import torch as t
from torch.autograd import Variable
N,D,H=3,4,5
x=Variable(t.randn(N,D))
w1=Variable(t.randn(D,H))
w2=Variable(t.randn(D,H))
z=10
if z>0:
  y=x.mm(w1)
else:
  y=x.mm(w2)
Tensorflow:
import tensorflow as tf
import numpy as np
N,D,H=3,4,5
x=tf.placeholder(tf.float32, shape=(N,D))
z=tf.placeholder(tf.float32, shape=None)
w1=tf.placeholder(tf.float32, shape=(D,H))
w2=tf.placeholder(tf.float32, shape=(D,H))
def f1():
  return tf.matmul(x,w1)
def f2():
  return tf.matmul(x,w2)
y=tf.cond(tf.less(z,0), f1, f2)
with tf.Session() as sess:
  values={
    x: np.random.randn(N,D),
    z: 10,
    w1: np.random.randn(D,H),
    w2: np.random.randn(D,H)
  }
y_val=sess.run(y, feed_dict=values)

熟悉Tensorflow的工程师应该更能理解其中的痛苦——不是我不想写短一些,Tensorflow里哪允许你随便两个Tensor直接当成普通变量一样来操作,不套上tf的各种函数做运算寸步难行。

因此上,我周边越来越多的Team或个人要么开始逐步尝试使用Pytorch进行工作,要么干脆弃用Tensorflow转而使用Pytorch。既然我们也从这个小例子中看到Pytorch的优点了,何不也尝试一下用Pytorch作为我们的工作框架呢?

从今天开始,我将用3到4周的时间做20篇左右的Pytorch入门笔记,希望能带大家感受一下Pytorch在深度学习应用中的厉害之处。

原文发布于微信公众号 - 奇点(qddata)

原文发表时间:2018-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

为个人深度学习机器选择合适的配置

对于那些一直想进行深度学习研究的同学来说,如何选择合适的配置一直是个比较纠结的问题,既要考虑到使用的场景,又要考虑到价格等各方面因素。日前,medium上的一篇...

6235
来自专栏量子位

TensorFlow 1.9.0正式版来了!新手指南全新改版,支持梯度提升树估计器

1122
来自专栏数据魔术师

干货|十分钟快速get蚁群算法(附代码)

之前分享了TSP的动态规划解法,本期来介绍它的另一种解法——蚁群算法。 什么?不知道?次元壁?高大上? 小编接下来这套 素质三连 攻略三连...

10.1K5
来自专栏AI科技评论

学界 | Facebook AI实验室开源相似性搜索库Faiss:性能高于理论峰值55%,提速8.5倍

在用户日常搜索过程中,一个经常出现的问题即大多数返回的网站结果拥有完全相同或者几乎一样的信息。而应用了相似性搜索的相似引擎即可为用户返回最恰当、最合适的结果,同...

50610
来自专栏Y大宽

Cytoscape插件2:CytoHubba

CytoHubba:发现复杂网络的关键目标和子网络 网络对呈现包括PPI,基因调控,细胞路径和信号转导等多种类型生物数据非常有用。我们//+重要性,并且这也能...

9661
来自专栏吉浦迅科技

【讲座】在NVIDIA Jetson上从Tensorflow到TensorRT

NVIDIA在太平洋时间3月8日上午11:00-12:00(北京时间3月9日凌晨3:00-4:00)举办了主题为“AI at the Edge: TensorF...

5956
来自专栏专知

【开源】基于Keras的知识图谱处理实战

【导读】近日,Daniel Shapiro博士利用开源的图结构卷积网络进行知识图谱处理,并应用于交易数据的欺诈检测,其知识图谱处理相关源码也开源出来,并且Dan...

1K4
来自专栏机器学习人工学weekly

机器学习人工学weekly-2018/2/18

新年快乐! 注意下面很多链接都需要翻墙,无奈国情如此。 1. RL相关 1.1 DeepMind发布IMPALA算法和新的RL测试环境DMLab-30 ?...

31311
来自专栏计算机视觉life

Facebook Surround360 学习笔记--(4)色彩/视差不一致问题

surround360的开源资料地址: 下载好代码和测试数据集,配置好环境,关于环境配置可以参考这篇博客,写的挺详细: 运行代码的说明可以参考这篇博客...

2205
来自专栏机器人网

[学习}28 款 GitHub 最流行的开源机器学习项目

现在机器学习逐渐成为行业热门,经过二十几年的发展,机器学习目前也有了十分广泛的应用,如:数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊...

4018

扫码关注云+社区

领取腾讯云代金券