加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

tensorflow-条件循环控制(4)

发布时间:2020-12-14 05:16:44 所属栏目:大数据 来源:网络整理
导读:例如非严格语义的示例:在下面的示例中,计数器i的最终值不依赖于x。while_loop可并行地增加计数器,并更新x。 #!/usr/bin/env python2# -*- coding: utf-8 -*-"""Created on Thu Sep 6 10:16:37 2018@author: myhaspl"""import tensorflow as tfimport tens
例如非严格语义的示例:在下面的示例中,计数器i的最终值不依赖于x。while_loop可并行地增加计数器,并更新x。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018

@author: myhaspl
"""
import tensorflow as tf
import tensorflow as tf

n = 10
x = tf.constant(0)
c = lambda i,x: i < n
b = lambda i,x: (tf.Print(i + 1,[i],"i:"),tf.Print(x + 1,[x],"x:"))
i,out = tf.while_loop(c,b,(0,x))
with tf.Session() as sess:
   print(sess.run([i,out]))

i:[0]x:[0]

x:[1]
i:[1]
i:[2]
x:[2]
i:[3]
x:[3]
i:[4]
x:[4]
i:[5]
x:[5]
i:[6]
x:[6]
i:[7]
i:[8]x:[7]

i:[9]
x:[8]
x:[9]
[10,10]

>>
观察上面例子,x和i是并行计算的,以至于在i为8时,x还是7

i:[6]
x:[6]
i:[7]
i:[8]x:[7]

下面的例子将x设为列表,每次迭代对列表的每个元素加1

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
"""
import tensorflow as tf
import tensorflow as tf

n = 10
x = tf.constant(list(range(n)))
c = lambda i,out]))

i:[0]
x:[0 1 2...]i:[1]

x:[1 2 3...]i:[2]

x:[2 3 4...]
i:[3]
x:[3 4 5...]
i:[4]
x:[4 5 6...]
x:[5 6 7...]i:[5]

x:[6 7 8...]i:[6]

x:[7 8 9...]i:[7]

x:[8 9 10...]
i:[8]
i:[9]
x:[9 10 11...]
[10,array([10,11,12,13,14,15,16,17,18,19],dtype=int32)]

因为一个循环迭代中的循环计数器依赖于前一个迭代中的值循环计数器本身不能并行递增。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018

@author: myhaspl
"""
import tensorflow as tf

def b(i):
    return tf.Print(i + 2,"i:")

def c(i):
    return tf.less(i,n)

n = tf.constant(10)
i = tf.constant(0)

res = tf.while_loop(c,[i])
with tf.Session() as sess:
    print sess.run(res)

i:[0]
i:[2]
i:[4]
i:[6]
i:[8]
10
i这个计算器本身,每次迭代增加,因此依赖于前一个迭代中的值。因此,如果我们只想要计数器i的最终值(我们在行打印(sess.run(i)),那么x永远不会递增,但是计数器i将在单个线程上更新。如下所示:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018

@author: myhaspl
"""
import tensorflow as tf

def b(i,x):
    return (tf.Print(i + 2,"x:"))

def c(i,x):
    return tf.less(i,n)

n = 10
i = 0
x = tf.constant(list(range(n)))

i,(i,x))
with tf.Session() as sess:
    print sess.run(i)

i:[0]
i:[2]
i:[4]
i:[6]
i:[8]
10
相反,如果我们希望输出值(我们在行打印(sess.run(out))上打印),那么计数器可以在自己的线程上递增,而x可以在单独的线程上并行递增。

注意:因为i每次递增2,所以x只会递增5次,每次增加1

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
"""
import tensorflow as tf

def b(i,x))
with tf.Session() as sess:
    print sess.run(out)

i:[0]
x:[0 1 2...]i:[2]

x:[1 2 3...]i:[4]

i:[6]x:[2 3 4...]

x:[3 4 5...]
i:[8]
x:[4 5 6...]
[ 5 6 7 8 9 10 11 12 13 14]

在极端情况下,可以想象,递增计数器的线程在x递增一次之前一直运行到完成。唯一不可能发生的事情是线程更新x永远不可能超过计数器线程,因为递增x的线程取决于计数器的值。下面模拟了这种情况(i>6时,x更新递增)

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
"""
import tensorflow as tf

def b(i,x):
    i=tf.Print(i + 1,"i:")
    x=tf.cond(i<=5,lambda: tf.Print(x,"x:"),lambda: tf.Print(x + 1,"x:"))
    return (i,x)

def c(i,n)

n = 10
i = 0
x = 0

i,x))
with tf.Session() as sess:
    print sess.run(out)

i:[0]
x:[0]
i:[1]
x:[0]
i:[2]
x:[0]
i:[3]
x:[0]
i:[4]
i:[5]
i:[6]x:[0]

x:[0]
i:[7]
x:[1]
i:[8]
i:[9]
x:[2]
x:[3]
x:[4]
5

组合tf.cond与tf.while_loop

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
@email:[email?protected]
二分法猜数字
"""
import tensorflow as tf

def body(a,guessnum,num):
    center = tf.div(tf.add(a,b),2)
    a,num= tf.cond(guessnum>center,lambda: (center,center),lambda: (a,center,center))  
    return (tf.Print(a,[a],"a:"),tf.Print(b,[b],"b:"),num)

def c(a,num):
    return tf.not_equal(guessnum,num)

guessnum = tf.constant(71)
mynum = tf.constant(-1)
a = tf.constant(0)
b = tf.constant(100)

a,num = tf.while_loop(c,body,(a,mynum))
with tf.Session() as sess:
    print sess.run(num)

b:[100]a:[50]a:[50]b:[75]b:[75]a:[62]b:[75]a:[68]a:[68]b:[71]71

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读