tensorflow随笔-tf.while_loop
tf.while_loop(
cond,
body,
loop_vars,
shape_invariants=None,
parallel_iterations=10,
back_prop=True,
swap_memory=False,
name=None,
maximum_iterations=None,
return_same_structure=False
)
當條件謂詞cond為True,重復body
cond是一個調用,返回一個boolean的標量tensor,body是一個調用,返回一個(可能嵌套的)元組。tensors的命名元組或列表與loop_vars有相同數量(長度和結構)和類型,loop_vars是一個(可能嵌套的)元祖。tensors的命名元組或列表傳送到cond和body中。cond和body都采用和loop_vars一樣多的參數。
除了常規張量或索引片斷外,body還可以接受和返回TensorArray對象。TensorArray的流動將在循環期間和梯度計算期間適當地傳送。
while_loop調用cond和body剛好一次(在 while_loop內部,而不是 Session.run()間。while_loop將cond和body調用期間創建的計算圖片段與一些附加的圖節點縫合在一起,重復body直到cond返回false。
為了正確起見,tf.while_loop() 嚴格執行循環變量的形狀不變量。形狀不變量是一個(可能是部分的)形狀,在循環的迭代過程中是不變的。如果迭代后的循環變量的形狀被確定為比其形狀不變量更通用或不兼容,則會產生錯誤。例如,[11, None]的形狀比[11, 17 ]的形狀更一般,并且[11, 21 ]與[11, 17 ]不兼容。默認情況下(如果沒有指定參數shape_invariants),則假定loop_vars中的每個張量的初始形狀在每次迭代中都是相同的。 shape_invariants參數允許調用者為每個循環變量指定一個不太特定的形狀不變量,如果形狀在迭代之間發生變化,則需要使用該形狀不變量。還可以在body函數中使用tf.Tensor.set_shape函數來指示輸出循環變量具有特定的形狀。SparseTensor和索引片斷的形狀不變量被特別地處理如下:
a)如果循環變量是稀疏張量(SparseTensor),則形狀不變量必須是張量形狀(TensorShape[r]),其中r是由稀疏張量表示的稠密張量的秩。這意味著閃光燈的三個張量的形狀是([None], [None, r], [r])。注意:這里的形狀不變量是SparseTensor.dense_shape形狀屬性的形狀。這必須是一個vector的形狀。
b)如果循環變量是IndexedSlices,則形狀不變量必須是IndexedSlices的值張量的形狀不變量。這意味著索引數組(IndexedSlice)的三個張量的形狀是(shape, [shape[0]], [shape.ndims])
while_loop實現非嚴格語義,使多個迭代并行運行。并行迭代的最大次數可以由parallel_iterations控制,這允許用戶控制內存消耗和執行順序。對于正確的程序,HyyLoad應該為任何parallel_iterations>0返回相同的結果。
對于訓練,TensorFlow存儲張量(tensors),這些張量在前向傳遞和反射傳播中產生,這些張量是內存消耗的主要來源,并且經常在GPU上訓練時導致OOM錯誤。當標志swap_memory為真時,我們將這些張量從GPU交換到CPU。例如,這允許我們訓練具有很長序列和大批量的RNN模型。
參數:
cond:可調用的表示循環終止條件。
body: 表示循環體的可調用體。
loop_vars: 一個(可能嵌套)元組、namedtuple或numpy數組列表、張量、和TensorArray 對象
shape_invariants: 循環變量的形狀不變量。
parallel_iterations: 允許并行運行的迭代次數。它必須是正整數。
back_prop: 是否在這個while循環中啟用了backprop。
swap_memory: 是否為這個循環啟用了GPU-CPU內存交換。
name: 返回的張量的可選名稱前綴。
maximum_iterations: 可選while循環運行的最大迭代次數.如果提供,則cond輸出與確保執行的迭代數量不大于maximum_iterations
return_same_structure: 如果True, 輸出具有與loop_vars相同的結構。如果啟用了緊急執行,則忽略此操作(并且始終被視為true)。
返回:
循環后的循環變量的輸出張量。如果return_same_structure是True,返回值的結構與loop_vars相同。如果return_same_structure是False,則返回的是一個Tensor、TensorArray或IndexedSlice,否則為列表。
Raises:
TypeError:如果cond或body不能調用
ValueError: 如果loop_vars為空
運行結果為10,函數b的最后運行結果。
循環將i每次增加1,直到10
#!/usr/bin/env python2 # -*- coding: utf-8 -*-import tensorflow as tf i = tf.constant(100) def b(i):res=tf.subtract(i, 2)return resc = lambda i: tf.greater(i, 0)r = tf.while_loop(c, b, [i])sess=tf.Session() with sess:print sess.run(r)循環每次將i減1,直到0
運行結果為0,函數b的最后運行結果。
總結
以上是生活随笔為你收集整理的tensorflow随笔-tf.while_loop的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qtabwidget放大_Qt自定义弹窗
- 下一篇: 百度自动推送html5,百度暂停 JS