Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras,tensorflow:变量的初始值设定项。。。是来自控制流构造、循环或条件的内部_Tensorflow_Keras - Fatal编程技术网

Keras,tensorflow:变量的初始值设定项。。。是来自控制流构造、循环或条件的内部

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可能是全零,在这种情况下,我希望直

我正在培训一个面具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可能是全零,在这种情况下,我希望直接返回全零。因此,我使用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])