我正在训练一个面具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)
Run Code Online (Sandbox Code Playgroud)
但是,有时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)
Run Code Online (Sandbox Code Playgroud)
这引发了一个错误:
ValueError:变量lambda_5/cond/mrcnn_mask_conv1/kernel /的初始化器来自控制流构造内部,例如循环或条件.在循环或条件内创建变量时,使用lambda作为初始化程序.
我谷歌它但没有有用的信息.这似乎是错误地使用keras/tensorflow的问题.任何线索都会受到欢迎!
顺便说一句,如果我使用这个代码,它将没有错误(但我不想提前计算):
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)
Run Code Online (Sandbox Code Playgroud)
iga*_*iga 16
错误基本上就是消息所说的.您不能在条件中包含变量初始值设定项.与普通编程语言的粗略类比是:
if my_condition:
a = 1
print a # can't do this. a might be uninitialized.
Run Code Online (Sandbox Code Playgroud)
下面是一个简单的示例来说明此问题以及错误消息中建议的修复:
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])
Run Code Online (Sandbox Code Playgroud)
这是使用tf.while_loop但它与tf.cond此目的相同.如果按原样运行此代码,您将收到相同的错误.如果您更换body同body_ok一切都会好起来.原因是当初始化程序是一个函数时,张量流可以将其置于"控制流上下文之外"以确保它始终运行.
为了澄清未来读者可能存在的混淆," a先计算"的方法并不理想,而是出于一个微妙的原因.首先,请记住您在这里所做的是构建计算图(假设您没有使用急切的执行).所以,你实际上并不是在计算a.你只是定义它如何可以被计算出来.Tensorflow运行时决定在运行时需要计算的内容,具体取决于参数session.run().因此,可以预期如果条件为假,a则不会执行返回的分支(因为不需要).不幸的是,这不是TensorFlow运行时的工作原理.您可以在第一个答案更多的细节在这里,但简要地说,TensorFlow运行时将执行所有依赖于任一分支,只是里面的操作true_fn/false_fn将被有条件地执行.
小智 6
将 keras 与 CNN-LSTM 一起使用时,我也遇到了同样的问题。代码在 GPU 服务器上运行良好,但是当我尝试在本地机器上运行它时,出现了这个奇怪的错误。
以下技巧对我有用。
解决方案:清除变量并重新启动内核。这对我有用。也许其他人遇到我正在经历的完全相同的问题会有所帮助。
| 归档时间: |
|
| 查看次数: |
6920 次 |
| 最近记录: |