神器Pytorch
Posted 奇点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神器Pytorch相关的知识,希望对你有一定的参考价值。
话说,自从我自己入坑深度学习以来,也是用了不少的框架,什么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在深度学习应用中的厉害之处。
以上是关于神器Pytorch的主要内容,如果未能解决你的问题,请参考以下文章