专栏首页奇点大数据神器Pytorch(1)

神器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),作者:高扬

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据科学家节选(1)

    【节选自即将由电子工业出版社出版的《数据科学家养成手册》第一章】 什么是科学家 从我们每个人上学前班的时候,我们就开始受到各种各样的启蒙教育,哪怕是捏橡皮泥、...

    刀刀老高
  • 白话深度学习已在路上

    继《白话大数据与机器学习》一书出版之后反向热烈,很多程序员朋友也和我说找到了一本不用懂高深的数学原理就可以看懂的大数据和机器学习的作品了。这让我...

    刀刀老高
  • Python入门教程十(视频)

    这一课的视频内容简介:python里的正则表达式和系统命令调用。 ? 代码地址:https://github.com/azheng333/video_code...

    刀刀老高
  • Tensorflow 搭建神经网络 (一)

    本文为中国大学MOOC课程《人工智能实践:Tensorflow笔记》的笔记中搭建神经网络,总结搭建八股的部分

    拾点阳光
  • tensorflow: bn层

    可视化 batch normalization 过程中的 tensor演化(以输入一张[1, 4 , 4, 1]的图片为例)

    JNingWei
  • tensorflow编程: Layers (contrib)

    min(max(features, 0), 6)。即对 tf.nn.relu 的优化,防止 relu过后 某些 极端值 依然 大于6

    JNingWei
  • tf.compat.v1的含义

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    于小勇
  • Raw use of parameterized class 'Future'

    警告:Raw use of parameterized class 'Future' Inspection info: Reports any uses of ...

    早安嵩骏
  • 聊聊golang的zap的CheckedEntry

    CheckedEntry内嵌了Entry,定义了ErrorOutput、dirty、CheckWriteAction、cores属性;entry包使用_cePo...

    codecraft
  • ActiveMQ学习之linux下ActiveMQ环境搭建

    https://activemq.apache.org/components/classic/download/

    用户5899361

扫码关注云+社区

领取腾讯云代金券