gpt4 book ai didi

tensorflow - Keras, tensorflow : Initializer for variable. .. 来自控制流结构、循环或条件

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

我正在训练一个掩码 r-cnn 模型,引用 github 上的这个代表:
https://github.com/matterport/Mask_RCNN

我遇到了一个似乎是使用 Keras 的问题,所以我来到这里。

代码从感兴趣区域(rois)和特征图计算掩码:

mrcnn_mask = build_fpn_mask_graph(rois, mrcnn_feature_maps,
config.IMAGE_SHAPE,
config.MASK_POOL_SIZE,
config.NUM_CLASSES)

但是,有时 rois 可能全为零,在这种情况下,我想直接返回全零。所以,我像这样使用 tf.cond:
def ff_true():
mrcnn_mask = build_fpn_mask_graph(rois, mrcnn_feature_maps,
config.IMAGE_SHAPE,
config.MASK_POOL_SIZE,
config.NUM_CLASSES)

def ff_false():
return tf.zeros_like(target_mask)

mrcnn_mask = KL.Lambda(lambda x: tf.cond(tf.equal(tf.reduce_mean(x), 0),
ff_true, ff_true)) (rois)

这引发了一个错误:

ValueError: Initializer for variable lambda_5/cond/mrcnn_mask_conv1/kernel/ is from inside a control-flow construct, such as a loop or conditional. When creating a variable inside a loop or conditional, use a lambda as the initializer.



我谷歌它,但没有得到有用的信息。
这似乎是错误使用 keras/tensorflow 的问题。
任何线索将受到欢迎!

顺便说一句,如果我使用此代码,则不会出错(但我不想提前计算 a):
a = build_fpn_mask_graph(rois, mrcnn_feature_maps,
config.IMAGE_SHAPE,
config.MASK_POOL_SIZE,
config.NUM_CLASSES)
def ff_true():
return a
def ff_false():
return tf.zeros_like(target_mask)

mrcnn_mask = KL.Lambda(lambda x: tf.cond(tf.equal(tf.reduce_mean(x), 0),
ff_true, ff_true)) (rois)

最佳答案

错误基本上是消息所说的。条件中不能有变量初始值设定项。对普通编程语言的粗略类比是:

if my_condition:
a = 1
print a # can't do this. a might be uninitialized.

这是一个简单的示例来说明此问题以及错误消息中建议的修复:
import tensorflow as tf

def cond(i, _):
return i < 10

def body(i, _):
zero = tf.zeros([], dtype=tf.int32)
v = tf.Variable(initial_value=zero)
return (i + 1, v.read_value())

def body_ok(i, _):
zero = lambda: tf.zeros([], dtype=tf.int32)
v = tf.Variable(initial_value=zero, dtype=tf.int32)
return (i + 1, v.read_value())

tf.while_loop(cond, body, [0, 0])

这是使用 tf.while_loop但它与 tf.cond 相同为此目的。如果按原样运行此代码,您将收到相同的错误。如果更换 bodybody_ok一切都会好起来的。原因是当初始化器是一个函数时,tensorflow 可以将它放在“控制流上下文之外”以确保它始终运行。

为了澄清 future 读者可能出现的困惑,“先计算 a”的方法并不理想,但有一个微妙的原因。首先,请记住您在这里所做的是构建一个计算图(假设您没有使用 eager execution )。所以,你实际上并不是在计算 a .您只是在定义它的方式 可以 被计算。 Tensorflow 运行时根据 session.run() 的参数决定运行时需要计算的内容。 .因此,人们可能会期望如果条件为假,分支返回 a不会被执行(因为它不需要)。不幸的是,这不是 TensorFlow 运行时的工作方式。您可以在第一个回答 here 中找到更多详细信息,但简单地说,TensorFlow 运行时将执行所有 依赖项 要么 分支,只有 true_fn/false_fn里面的操作将有条件地执行。

关于tensorflow - Keras, tensorflow : Initializer for variable. .. 来自控制流结构、循环或条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48515034/

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