在使用tf.get\u集合(tf.GraphKeys.UPDATE\u OPS)时,必须为占位符张量提供一个值

2024-04-25 20:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在定义一个由在tensorflow中实现的批处理规范化组成的体系结构

我并不是在讨论整个体系结构,只是展示了问题的相关部分

self.w3 = tf.layers.Dense(self.hidden_dimension)

// code

h = tf.layers.dropout(tf.layers.batch_normalization(tf.nn.sigmoid(self.w3(x)), 
training = self.is_training, renorm = True), rate = 0.15, training = self.is_training)

// code

批量标准化的官方tensorflow实现称“更新操作被放置在tf.GraphKeys.update_ops中,因此它们需要与列操作一起执行。”

现在,当我不使用

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
self.optimize = tf.group([self.opt, update_ops])

培训继续正常进行,没有错误。但是,我知道这里没有执行批处理规范化

但一旦引入这两条线,就会出现意外错误

You must feed a value for placeholder tensor

有趣的是,每次我尝试执行此函数时,上述错误都会因不同的占位符而不断变化,并且不会固定到特定的占位符。但是,我确信我已经为所有占位符提供了值(正如我已经提到的,当这两行不存在时,培训可以很好地工作)

以防你想看到损失和优化功能

with tf.variable_scope(name_or_scope = 'op', reuse = tf.AUTO_REUSE) as scope:
        self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = self.p_y,
                                                                            labels = self.ans))

        self.optimizer = tf.train.AdadeltaOptimizer(learning_rate=self.learning_rate)

        gradients, variables = zip(*self.optimizer.compute_gradients(self.cost))
        gradients, _ = tf.clip_by_global_norm(gradients, self.clip_rate)
        self.opt = self.optimizer.apply_gradients(zip(gradients, variables))

        update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
        self.optimize = tf.group([self.opt, update_ops])

Tags: selfratelayerstftensorflow错误trainingupdate