【发布时间】:2018-07-08 23:04:41
【问题描述】:
我正在训练一个掩码 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:变量 lambda_5/cond/mrcnn_mask_conv1/kernel/ 的初始化程序来自控制流构造内部,例如循环或条件。在循环或条件中创建变量时,请使用 lambda 作为初始值设定项。
我用谷歌搜索,但没有得到有用的信息。 这似乎是错误使用 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)
【问题讨论】:
-
有时由于数据类型不匹配(例如,尝试连接 tf.float32 和 tf.int32 类型的张量)会出现此错误。这在此处进行了更详细的讨论:stackoverflow.com/questions/47393356/… 和此处:github.com/tensorflow/tensorflow/issues/14729。不幸的是,我认为您的代码实际上并非如此,因为您有一个实际的 lambda。但即使不是,这些链接也可能对在谷歌搜索该错误时发现此问题的其他人有用。
-
是的,不是数据类型的问题。这只是 Keras 的一个问题。 Keras 使用张量来初始化变量,这在条件内部是不合法的。参考:github.com/matterport/Mask_RCNN/issues/170我还没找到解决办法。
标签: tensorflow keras