由于tensorflow使用的是graph的计算概念,在没有涉及控制数据流向的时候编程和普通编程语言的编程差别不大,但是涉及到控制数据流向的操作时,就要特别小心,不然很容易出错。这也是TensorFlow比较反直觉的地方。

在TensorFlow中,tf.cond()类似于c语言中的if...else...,用来控制数据流向,但是仅仅类似而已,其中差别还是挺大的。关于tf.cond()函数的具体操作,我参考了tf的说明文档。

format:tf.cond(pred, fn1, fn2, name=None)

Return :either fn1() or fn2() based on the boolean predicate `pred`.(注意这里,也就是说'fnq'和‘fn2’是两个函数)

arguments:`fn1` and `fn2` both return lists of output tensors. `fn1` and `fn2` must have the same non-zero number and type of outputs('fnq'和‘fn2’返回的是非零的且类型相同的输出)

官方例子:

z = tf.multiply(a, b)result = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))

上面例子执行这样的操作,如果x<y则result这个操作是tf.add(x,z),反之则是tf.square(y)。这一点上,确实很像逻辑控制中的if...else...,但是官方说明里也提到

Since z is needed for at least one  branch of the cond,branch of the cond, the tf.mul operation is always executed, unconditionally.

因为z在cond函数中的至少一个分支被用到,所以

z = tf.multiply(a, b)

总是被无条件执行,这个确实很反直觉,跟我想象中的不太一样,按一般的逻辑不应该是不用到就不执行么?,然后查阅官方文档,我感受到了来之官方文档深深的鄙视0.0

Although this behavior is consistent with the dataflow model of TensorFlow,it has occasionally surprised some users who expected a lazier semantics.

翻译过来应该是:尽管这样的操作与TensorFlow的数据流模型一致,但是偶尔还是会令那些期望慵懒语法的用户吃惊。(应该是这么翻译的吧,淦,我就那个懒人0.0)

好吧,我就大概记录一下我自己的理解(如果错了,欢迎拍砖)。因为TensorFlow是基于图的计算,数据以流的形式存在,所以只要构建好了图,有数据源,那么应该都会 数据流过,所以在执行tf.cond之前,两个数据流一个是tf.add()中的x,z,一个是tf.square(y)中的y,而tf.cond()就决定了是数据流x,z从tf.add()流过,还是数据流y从tf.square()流过。这里这个tf.cond也就像个控制水流的阀门,水流管道x,z,y在这个阀门交汇,而tf.cond决定了谁将流向后面的管道,但是不管哪一个水流流向下一个管道,在阀门作用之前,水流应该都是要到达阀门的。(啰啰嗦嗦了一大堆,还是不太理解)

栗子:

import tensorflow as tf
a=tf.constant(2)
b=tf.constant(3)
x=tf.constant(4)
y=tf.constant(5)
z = tf.multiply(a, b)
result = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))
with tf.Session() as session:    print(result.eval())

												

tf.cond()的用法相关推荐

  1. tf.estimator的用法

    tf.estimator的用法 利用 tf.estimator 训练模型时需要写两个重要的函数,一个用于数据输入的函数(input_fn),另一个用于模型创建的函数(model_fn).下面逐一来说明 ...

  2. 值域范围 tf.clip_by_value的用法

    tf.clip_by_value的用法 tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间.小于min的让它等于min,大于m ...

  3. tensorflow随笔-条件语句-tf.cond

    tf.cond tf.cond( pred, true_fn=None, false_fn=None, strict=False, name=None, fn1=None, fn2=None ) 如果 ...

  4. 记录 之 tensorflow 常用函数:tf.split(),tf.clip_by_value() 和 tf.cond()

    1.tf.split(axis, num_or_size_splits,value) 该函数是通道拆分函数,将原来的的多通道tensor,拆分为单通道 axis:拆分的维度 num_or_size_s ...

  5. 【TensorFlow基础函数】tf.concat的用法

    tf.concat 的用法 TF官方的文档 tf.concat(values,axis,name='concat' ) 连接多个Tensor的操作 values 多个Tensor axis是哪个纬度 ...

  6. tf.matmul函数用法

    tf.matmul函数用法 函数:tf.matmul 表示:将矩阵 a 乘以矩阵 b,生成a * b matmul(a,b,transpose_a=False,transpose_b=False,ad ...

  7. Tensorflow - tf.cond 与条件判断

    一.引言 上一篇文章 py_function 中提到一些自定义操作可以通过 py_function 实现,其中就涉及 If-else,其实条件判断也可以通过 tf.cond 实现,下面看一下如何使用. ...

  8. Tensorflow中的tf.layers.batch_normalization()用法

    使用tf.layers.batch_normalization()需要三步: 在卷积层将激活函数设置为None. 使用batch_normalization. 使用激活函数激活. 需要特别注意的是:在 ...

  9. tf.concat, tf.stack和tf.unstack的用法

    tf.concat, tf.stack和tf.unstack的用法 tf.concat相当于numpy中的np.concatenate函数,用于将两个张量在某一个维度(axis)合并起来,例如: a ...

最新文章

  1. Unity发布WebGL时如何修改默认的载入进度条sf?
  2. Egret note
  3. [Debugging]分析博客园提交评论的校验规则
  4. icem密度盒怎么设置_怎么做好火灾自动报警系统施工安装?
  5. mysql left 数学原理,MySQL全面瓦解21(番外):一次深夜优化亿级数据分页的奇妙经历...
  6. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)
  7. 计算机辅助构成和图像处理,计算机辅助图像处理技术,Image process computer-assisted,音标,读音,翻译,英文例句,英语词典...
  8. MS17-010 补丁下载官方地址
  9. Android官方文档中文版
  10. 展锋芒,一遇风云便化龙
  11. SpringBoot使用Validation校验参数
  12. php正则保留字母数字,php正则只保留汉字字母数字
  13. java 时分秒 转换 秒_【Java】 秒转时分秒天
  14. 分享一款免费OPC UA服务器
  15. 统计笔记4:ANOVA
  16. m序列码产生电路设计与仿真
  17. 项目学习 —— 图书商城后台管理
  18. R语言数学函数及统计函数及概率函数
  19. 2007年河北省高校计算机一级考试大纲及心得
  20. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

热门文章

  1. Windows X64汇编入门
  2. 一篇文章让你从JAVA零基础入门`OOP`编程12.20
  3. 计算机组成原理 复习资料
  4. 大数据离线---网站日志流量分析系统(1)---简介及框架
  5. 联想thinkpad E420电脑蓝屏
  6. 饥荒联机版Mod开发——制作可入锅,烹饪,凉干的食物(七)
  7. 抖音美妆教学领域人设如何打造?几个建议送给你
  8. 骑行健身,是普通人走出信息泛滥时代的捷径
  9. 【免费资源】《Open Design Specification for .dwg files》dwg文件格式解析 免费下载
  10. 什么样的软件算是功能安全软件?