对比TensorFlow和Pytorch的动静态图构建上的差异

静态图框架设计好了不能够修改,且定义静态图时需要使用新的特殊语法,这也意味着图设定时无法使用if、while、for-loop等结构,而是需要特殊的由框架专门设计的语法,在构建图时,我们需要考虑到所有的情况(即各个if分支图结构必须全部在图中,即使不一定会在每一次运行时使用到),使得静态图异常庞大占用过多显存。

以动态图没有这个顾虑,它兼容python的各种逻辑控制语法,最终创建的图取决于每次运行时的条件分支选择,下面我们对比一下TensorFlow和Pytorch的if条件分支构建图的实现:

# Author : Hellcat
# Time : 2018/2/9 def tf_graph_if():
import numpy as np
import tensorflow as tf x = tf.placeholder(tf.float32, shape=(3, 4))
z = tf.placeholder(tf.float32, shape=None)
w1 = tf.placeholder(tf.float32, shape=(4, 5))
w2 = tf.placeholder(tf.float32, shape=(4, 5)) 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:
y_out = sess.run(y, feed_dict={
x: np.random.randn(3, 4),
z: 10,
w1: np.random.randn(4, 5),
w2: np.random.randn(4, 5)})
return y_out def t_graph_if():
import torch as t
from torch.autograd import Variable x = Variable(t.randn(3, 4))
w1 = Variable(t.randn(4, 5))
w2 = Variable(t.randn(4, 5)) z = 10
if z > 0:
y = x.mm(w1)
else:
y = x.mm(w2) return y if __name__ == "__main__":
print(tf_graph_if())
print(t_graph_if())

计算输出如下:

[[ 4.0871315   0.90317607 -4.65211582  0.71610922 -2.70281982]
 [ 3.67874336 -0.58160967 -3.43737102  1.9781189  -2.18779659]
 [ 2.6638422  -0.81783319 -0.30386463 -0.61386991 -3.80232286]]
Variable containing:
-0.2474  0.1269  0.0830  3.4642  0.2255
 0.7555 -0.8057 -2.8159  3.7416  0.6230
 0.9010 -0.9469 -2.5086 -0.8848  0.2499
[torch.FloatTensor of size 3x5]

个人感觉上面的对比不太完美,如果使用TensorFlow的变量来对比,上面函数应该改写如下,

# Author : Hellcat
# Time : 2018/2/9 def tf_graph_if():
import tensorflow as tf x = tf.Variable(dtype=tf.float32, initial_value=tf.random_uniform(shape=[3, 4]))
z = tf.constant(dtype=tf.float32, value=10)
w1 = tf.Variable(dtype=tf.float32, initial_value=tf.random_uniform(shape=[4, 5]))
w2 = tf.Variable(dtype=tf.float32, initial_value=tf.random_uniform(shape=[4, 5])) 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:
sess.run(tf.global_variables_initializer())
y_out = sess.run(y)
return y_out

输出没什么变化,

[[ 1.89582038  1.12734962  0.59730953  0.99833554  0.86517167]
 [ 1.2659111   0.77320379  0.63649696  0.5804953   0.82271856]
 [ 1.92151642  1.64715886  1.19869363  1.31581473  1.5636673 ]]

可以看到,TensorFlow的if条件分支使用函数tf.cond(tf.less(z, 0), f1, f2)来实现,这和Pytorch直接使用if的逻辑很不同,而且,动态图不需要feed,直接运行便可。简单对比,可以看到Pytorch的逻辑更为简洁,让人很感兴趣。

『PyTorch』第一弹_静动态图构建if逻辑对比的更多相关文章

  1. 『PyTorch』第九弹_前馈网络简化写法

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下 在前面的例子中,基本上都是将每一层的输出直接作为下一层的 ...

  2. 『MXNet』第一弹_基础架构及API

    MXNet是基础,Gluon是封装,两者犹如TensorFlow和Keras,不过得益于动态图机制,两者交互比TensorFlow和Keras要方便得多,其基础操作和pytorch极为相似,但是方便不 ...

  3. 『PyTorch』第二弹_张量

    参考:http://www.jianshu.com/p/5ae644748f21# 几个数学概念: 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量 ...

  4. 『PyTorch』第二弹重置_Tensor对象

    『PyTorch』第二弹_张量 Tensor基础操作 简单的初始化 import torch as t Tensor基础操作 # 构建张量空间,不初始化 x = t.Tensor(5,3) x -2. ...

  5. 关于『Markdown』:第一弹

    关于『Markdown』:第一弹 建议缩放90%食用 声明: 在我之前已有数位大佬发布 "Markdown" 的语法知识点, 在此, 仅整理归类以及补缺, 方便阅读. 感谢 C20 ...

  6. 关于『HTML5』第一弹

    关于『HTML5』:第一弹 建议缩放90%食用 祝各位国庆节快乐!!1 经过了「过时的 HTML」.「正当时的 Markdown」的双重洗礼后,我下定决心,好好学习HTML5  这回不过时了吧(其实和 ...

  7. 关于『HTML』:第一弹

    关于『HTML』:第一弹 建议缩放90%食用 根据C2024XSC212童鞋的提问, 我准备写一稿关于『HTML』基础的帖 But! 当我看到了C2024XSC130的 "关于『HTML5』 ...

  8. 『TensorFlow』第九弹_图像预处理_不爱红妆爱武装

    部分代码单独测试: 这里实践了图像大小调整的代码,值得注意的是格式问题: 输入输出图像时一定要使用uint8编码, 但是数据处理过程中TF会自动把编码方式调整为float32,所以输入时没问题,输出时 ...

  9. 『MXNet』第九弹_分类器以及迁移学习DEMO

    解压文件命令: with zipfile.ZipFile('../data/kaggle_cifar10/' + fin, 'r') as zin: zin.extractall('../data/k ...

随机推荐

  1. 借助IDE到处Runnable JAR 的步骤

    1. 选择项目,右键,export,选择Java目录下的Runnable JAR file , next 2. Lanch configuration 中选择启动类 3. Export destina ...

  2. C/C++之全局、static对象/变量的初始化问题

    关于全局.static对象/变量的初始化问题 1. 全局变量.static变量的初始化时机:main()函数执行之前(或者说main中第一个用户语句执行之前). 2. 初始化顺序. 1)全局对象.外部 ...

  3. c++第十四天

    <c++ primer, 5E> 第91页到第94页,笔记: 1.vector支持的操作. v.empty().v.size().v.push_back(t).v[n] 2.试图通过下标访 ...

  4. JAVA第十周《网络编程》学习内容总结

    JAVA第十周<网络编程>学习内容总结 学习内容总结 1.初听到网络编程四个字可能会觉得很困难,实际上网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据,把数据发送到指定的位置, ...

  5. 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践

    20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...

  6. SQLSERVER中order by ,group by ,having where 的先后顺序

    SELECT [Name]  FROM [LinqToSql].[dbo].[Student]  where name='***' group  by  name    having (name='* ...

  7. 导出数据库表为world文档说明,以及PowerDesigner导出表结构pdm设计文档

    如何使用“mysql导出数据库结构为world工具”以及如何使用powerdesigner映射数据库模型 一.通过powerdesigner配置ojdbc 1.安装并打开powerdesigner,新 ...

  8. JSON类库Jackson与JSON-lib性能对比[转]

    Jackson:http://jackson.codehaus.org/ JSON-lib:http://json-lib.sourceforge.net/ Gson:http://code.goog ...

  9. Luogu P1533 可怜的狗狗

    题目链接:https://www.luogu.org/problemnew/show/P1533 没人写$fhq\ treap$做法,那我就补一篇qwq 看到这题第一时间想主席树,然后发现我还没学主席 ...

  10. [Shiro] - Shiro之进阶

    上一个知识点ssm, 哪里需要权限,哪里写注解@RequirePermission就行. 但是,真正项目开发的时候, 这种方式就很有局限性了, 当权限配置关系发生变化, 每次都要修改代码, 编译打包重 ...