对比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. 教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor

    Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架. Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架. ...

  2. Python入门之logging日志模块以及多进程日志

    本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...

  3. Android http通信案例

    Android studio 编写安卓程序,实现 http 通信,获得百度主页源代码. -------------------------------------------------------- ...

  4. 02: 安装epel 解决centos7无法使用yum安装nginx

    参考网址: http://www.mamicode.com/info-detail-1671603.html 1.yum命令安装 yum install epel-release -y 2.更新数据 ...

  5. Java第一次实验 20145104张家明

    Java第一次实验 实验报告 实验要求: 1.使用JDK编译.运行简单的Java程序 2.使用IDEA 编辑.编译.运行.调试Java程序 实验内容: 1.使用JDK编译.运行简单的Java程序: 2 ...

  6. python2.7+pyqt4 +eric4安装配置

    eric4安装与汉化一直没找到合适python的IDE工具,直到遇到了eric4这款开源软件.然而在使用过程中发现输出的中文字符竟然是乱码,修修改改配置总算正常显示了,何不干脆把软件界面也汉化下. 一 ...

  7. openwrt如何单独编译uboot

    答:make package/boot/uboot-<chip series>/compile

  8. thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?

    为什么会产生这样的 路径 常量等 的 困扰? 是由于 在tp中, 使用了多种形式的常量导致的, 比如, 有php语言本身的 "魔术常量", 有 php函数, 比如dirname定义 ...

  9. Wireshark 显示域名列

    一般使用Wireshark只能看到ip地址,但是看域名更方便更简明 只要修改一个配置就可以 编辑-->首选项 勾选Resolve network(IP) addresses 重新捕捉:

  10. excel的C#操作教程

    C# Excel Tutorial http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm How to transfer ...