gpt4 book ai didi

python - 使用 TF 数据集和 Eager 创建有状态计数器

转载 作者:行者123 更新时间:2023-12-01 09:00:09 25 4
gpt4 key购买 nike

我正在尝试在我的 Tensorflow 数据集管道中添加累加器。基本上,我有这个:

  def _filter_bcc_labels(self, labels, labels_table, bcc_count):
bg_counter = tf.zeros(shape=(), dtype=tf.int32)

def _add_to_counter():
tf.add(bg_counter, 1)
# Here the bg_counter is always equal to 0
tf.Print(bg_counter, [bg_counter])
return tf.constant(True)

return tf.cond(tf.greater_equal(bg_counter, tf.constant(bcc_count, dtype=tf.int32)),
true_fn=lambda: tf.constant(False),
false_fn=_add_to_counter)


ds = ds.filter(lambda file, position, img, lbls: self._filter_bcc_labels(lbls, {"BCC": 0, "BACKGROUND": 1}, 10))

我的目标是在达到 tf.cond false_fn 时增加 bg_counter,但我的变量始终具有值 0,它实际上从未增加。有人可以向我解释发生了什么吗?

请记住,我正在使用 TF eager,并且无法使用 ds.make_initialized_iterator() 然后输入我的 bg_counter 初始值。谢谢

最佳答案

您可能希望将计数器包装在一个类中,因为 Eager 中的变量在超出范围时会被删除。

代码:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
tf.enable_eager_execution()
import tensorflow.contrib.eager as tfe

dataset = tf.data.Dataset.from_tensor_slices(([1,2,3,4,5], [-1,-2,-3,-4,-5]))

class My(object):
def __init__(self):
self.x = tf.get_variable("mycounter", initializer=lambda: tf.zeros(shape=[], dtype=tf.float32), dtype=tf.float32
, trainable=False)

v = My()
print(v.x)
tf.assign(v.x,tf.add(v.x,1.0))
print(v.x)

def map_fn(x,v):
tf.cond(tf.greater_equal(v.x, tf.constant(5.0))
,lambda: tf.constant(0.0)
,lambda: tf.assign(v.x,tf.add(v.x,1.0))
)
return x

dataset = dataset.map(lambda x,y: map_fn(x,v)).batch(1)

for batch in tfe.Iterator(dataset):
print("{} | {}".format(batch, v.x))

日志:

<tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=0.0>    
<tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=1.0>
[1] | <tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=2.0>
[2] | <tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=3.0>
[3] | <tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=4.0>
[4] | <tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=5.0>
[5] | <tf.Variable 'mycounter:0' shape=() dtype=float32, numpy=5.0>

工作示例: https://www.kaggle.com/mpekalski/tfe-conditional-stateful-counter

关于python - 使用 TF 数据集和 Eager 创建有状态计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com