Keras,tensorflow:变量的初始值设定项。。。是来自控制流构造、循环或条件的内部
我正在培训一个面具r-cnn模型,请参考github上的此代表: 我遇到了一个问题,似乎是使用Keras的问题,所以我来到这里 代码根据感兴趣区域(ROI)和特征图计算遮罩:Keras,tensorflow:变量的初始值设定项。。。是来自控制流构造、循环或条件的内部,tensorflow,keras,Tensorflow,Keras,我正在培训一个面具r-cnn模型,请参考github上的此代表: 我遇到了一个问题,似乎是使用Keras的问题,所以我来到这里 代码根据感兴趣区域(ROI)和特征图计算遮罩: mrcnn_mask = build_fpn_mask_graph(rois, mrcnn_feature_maps, config.IMAGE_SHAPE, config.MASK_POOL_SIZE, config.NUM_CLASSES) 然而,有时ROI可能是全零,在这种情况下,我希望直
mrcnn_mask = build_fpn_mask_graph(rois, mrcnn_feature_maps,
config.IMAGE_SHAPE,
config.MASK_POOL_SIZE,
config.NUM_CLASSES)
然而,有时ROI可能是全零,在这种情况下,我希望直接返回全零。因此,我使用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:变量lambda_5/cond/mrcnn_mask_conv1/kernel/的初始值设定项来自控制流构造内部,例如循环或条件。在循环或条件内创建变量时,请使用lambda作为初始值设定项
我用谷歌搜索它,但没有得到有用的信息。
这似乎是错误使用keras/tensorflow的问题。
任何线索都欢迎
顺便说一句,如果我使用此代码,它将不会出错(但我不想提前计算a):
错误基本上就是消息所说的。条件中不能有变量初始值设定项。与普通编程语言的粗略类比是:
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])
将tensorflow导入为tf
定义条件(i,u):
返回i<10
def主体(一、二):
zero=tf.zeros([],dtype=tf.int32)
v=tf.变量(初始值=0)
返回值(i+1,v.read_value())
def主体_正常(i,u):
zero=lambda:tf.zeros([],dtype=tf.int32)
v=tf.Variable(初始值=0,数据类型=tf.int32)
返回值(i+1,v.read_value())
tf.while_循环(cond,body,[0,0])
这是使用tf.while\u loop
,但出于此目的,它与tf.cond
相同。如果按原样运行此代码,您将得到相同的错误。如果用body\u ok
替换body
,一切都会好起来。原因是当初始值设定项是函数时,tensorflow可以将其置于“控制流上下文之外”,以确保它始终运行
为了澄清未来读者可能存在的困惑,“先计算
a
first”的方法并不理想,但有一个微妙的原因。首先,请记住,您在这里所做的是构建一个计算图(假设您没有使用)。因此,您实际上并不是在计算a
。您只是定义如何计算它。Tensorflow运行时决定运行时需要计算的内容,具体取决于session.run()
的参数。因此,如果条件为false,则返回a
的分支将不会执行(因为不需要它)。不幸的是,这不是TensorFlow运行时的工作方式。您可以在第一个答案中找到更多详细信息,但简单地说,TensorFlow运行时将执行任一分支的所有依赖项,只有true\u fn/false\u fn
内的操作将有条件地执行 在CNN-LSTM中使用keras时,我也会遇到同样的问题。该代码在GPU服务器上运行良好,但当我试图在本地机器上运行它时,出现了一个奇怪的错误
下面的技巧对我有用
解决方案:清除变量并重新启动内核。这是我的工作。也许其他人也会遇到与我所经历的完全相同的问题,这会有所帮助。有时,由于数据类型不匹配(例如,试图连接tf.float32和tf.int32类型的张量),可能会出现此错误。这里将更详细地讨论这一点:这里:。不幸的是,我认为您的代码实际上不是这样,因为您有一个实际的lambda。但即使不是这样,这些链接也可能对在谷歌搜索错误时发现这个问题的其他人有用。是的,这不是数据类型的问题。这只是Keras的问题。Keras使用张量初始化变量,这在条件内部是不合法的。我还没有找到解决方案。谢谢,这真的很有帮助!我在疯狂地寻找解决这个错误的办法。我在LSTM上应用它时得到了它。最后,你的回答帮助我解决了这个问题。我正在使用GoogleColab,在我重新启动运行时后,我停止了这个错误。
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])