带tf.cond()的TensorFlow中的LookUpError

带tf.cond()的TensorFlow中的LookUpError,tensorflow,tensorflow-gpu,Tensorflow,Tensorflow Gpu,工作环境 TensorFlow发布版本:1.3.0-rc2 TensorFlow git版本:v1.3.0-rc1-994-gb93fd37 操作系统:CentOS Linux 7.2.1511版(核心版) 问题描述 我使用tf.cond()在处理时在训练和验证数据集之间移动。以下代码片段显示了我是如何完成的: 将tf.variable_scope(tf.get_variable_scope())作为vscope: 对于范围(4)中的i: 使用tf.device('/gpu:%d“%i”):

工作环境

  • TensorFlow发布版本:1.3.0-rc2
  • TensorFlow git版本:v1.3.0-rc1-994-gb93fd37
  • 操作系统:CentOS Linux 7.2.1511版(核心版)
问题描述

我使用
tf.cond()
在处理时在训练和验证数据集之间移动。以下代码片段显示了我是如何完成的:

将tf.variable_scope(tf.get_variable_scope())作为vscope:
对于范围(4)中的i:
使用tf.device('/gpu:%d“%i”):
将tf.name\u作用域('GPU-Tower-%d“%i”)作为作用域:
worktype=tf.get_变量(“wt”,[],初始值设定项=tf.zeros_初始值设定项())
工作类型=tf.assign(工作类型,1)
工作条件=tf.相等(工作类型,1)
elem=tf.cond(工作条件,lambda:train_iterator.get_next(),lambda:val_iterato\
r、 获取_next())
net=vgg16cnn2(元素[0],numclass=256)
img=elem[0]
centropy=tf.reduce\u mean(tf.nn.sparse\u softmax\u cross\u entropy\u with\u logits(labels=ele\
m[1],logits=net)
reg_损失=tf.get_收集(tf.GraphKeys.regulation_损失,范围)
regloss=0.05*tf.减少总损失(reg损失)
总损失=centropy+regloss
t1=tf.summary.scalar(“训练批次损失”,总损失)
tf.get_variable_scope().重用_variables()
预测=tf.cast(tf.argmax(tf.nn.softmax(net),1),tf.int32)
正确的预测=tf.cast(tf.equal(预测,元素[1]),tf.float32)
批次精度=tf.减少平均值(正确预测)
t2=tf.summary.scalar(“训练批次精度”,批次精度)
正确的\u检测。追加(正确的\u预测)
梯度=最佳计算梯度(总损失)
因此,基本上基于
工作类型的值
,将从培训或验证集中获取一个小批量

当我运行这段代码时,我得到以下
查找错误

LookupError: No gradient defined for operation 'GPU-Tower-0/cond/IteratorGetNext_1' (op type: IteratorGetNext)

为什么
TensorFlow
认为
IteratorGetNext\u 1
需要梯度?如何解决此问题?

变量
worktype
标记为可培训。默认情况下,计算所有可训练变量的梯度

有两种方法可以解决此问题:

  • 在中设置
    trainable=False
  • 使用的
    var\u list
    参数明确指定应计算其梯度的变量

  • 我认为这是因为变量
    worktype
    被标记为可训练的<代码>优化。计算梯度(总损失)默认情况下计算所有可训练变量的梯度。尝试在
    tf.get_variable()
    中设置
    trainable=False
    。非常感谢。它纠正了问题,也很好地阐明了培训的概念。好的,我将添加一个答案,然后。。。