如何检测哪个变量是“非类型”'在张量流中

时间:2016-05-17 19:30:55

标签: python tensorflow

我使用TensorFlow创建一个新模型,其中包含一个动态循环。我使用tf.while_loop来实现这个实例。我遇到的一个问题是:

AttributeError: 'NoneType' object has no attribute 'back_prop'

执行

时出现此问题
gradients = tf.gradients(self.loss, params)

然后,我尝试打印所有params,结果表明每个参数都有一个形状。我想如果有一个nonetype参数,它的形状也应该是None?另一方面,有没有其他方法可以帮助我检测哪个变量未分配或类似[]

这是完整的引用:

  Traceback (most recent call last):
  File "main.py", line 125, in <module>
    tf.app.run()
  File "/usr/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 30, in run
    sys.exit(main(sys.argv))
  File "main.py", line 119, in main
    train()# if FLAGS.train:
  File "main.py", line 95, in train
    model = create_model(sess, False)
  File "main.py", line 75, in create_model
    forward_only=False)
  File "/home/sniu/lab/ai_lab/DMN-tensorflow/models/DMN.py", line 248, in __init__
    gradients = tf.gradients(self.loss, params)
  File "/usr/lib/python2.7/site-packages/tensorflow/python/ops/gradients.py", line 481, in gradients
    in_grads = _AsList(grad_fn(op, *out_grads))
  File "/usr/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_grad.py", line 181, in _EnterGrad
    if not grad_ctxt.back_prop:
AttributeError: 'NoneType' object has no attribute 'back_prop'

2 个答案:

答案 0 :(得分:1)

NoneType仅表示值为None

>>> item = None
>>> item.value
Traceback (most recent call last):
  File "<stdin>", line 1 in <module>
AttributeError: 'NoneType' object has no attribute 'value'

您可以看到是否在type

上致电None
>>> type(None)
<type 'NoneType'>

None在python中是一种特殊的值。这是一个singleton对象。它是NoneType的一个实例,所有None都是完全相同的对象。

通常,为了防止这些类型的错误,人们要先测试值None,还是将表达式包装在try/except块中

if item is not None:
    print item.back_prop

或使用try/except

try:
    item.back_prop
except AttributeError:
    pass

请注意,try/except阻止可能会阻止与AttributeErrors item无关的其他None,例如item的某个其他值也没有back_prop属性。您可能希望以与item None {/ 1}}相同的方式处理这种情况。

答案 1 :(得分:0)

基于this comment,我解决了一个类似的问题,即渐变为“无”。

opt = tf.train.RMSPropOptimizer(1e-3)
grads, vars = zip(
    *opt.compute_gradients(loss, var_list=my_varlist))
grads = [g if g is not None else tf.zeros_like(v)
         for g, v in zip(grads, vars)]
optim = opt.apply_gradients(zip(grads, vars))