tensorflow tf.control_dependencies和tf.layers.batch_normalization获取错误 - python

我正在尝试构建具有两个损失函数的神经网络,这些函数像加权总和一样组合在一起。第一个简单地计算密集层和给定标签的线性输出mean square error,但是另一个大量使用嵌套的tf.map_fn。有与tf.layers.batch_normalization()一起使用的批处理规范层,因此我不得不将这些行添加到优化目标中:

    with tf.name_scope("Optimizer"):
        with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
            adam = tf.train.AdamOptimizer()
            self.train_op = adam.minimize(self.total_loss)

但是我得到错误:

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

它来自minimize()方法。如果我删除控件依赖项,则没有错误。另外,如果我删除依赖于循环的第二个优化目标,则没有错误。我已经测试了正向传播中的第二损失函数,它工作得很好。

任何想法如何跟踪问题?完整的错误日志:

Traceback (most recent call last):
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-6d5efdb6d091>", line 1, in <module>
    runfile('/home/mtarasov/PycharmProjects/ML/src/utils/model.py', wdir='/home/mtarasov/PycharmProjects/ML/src/utils')
  File "/home/mtarasov/Installations/pycharm-2018.2.4/helpers/pydev/_pydev_bundle/pydev_umd.py", line 198, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "/home/mtarasov/Installations/pycharm-2018.2.4/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/home/mtarasov/PycharmProjects/ML/src/utils/model.py", line 168, in <module>
    model = Model().build()
  File "/home/mtarasov/PycharmProjects/ML/src/utils/model.py", line 60, in build
    self.train_op = adam.minimize(self.total_loss)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 400, in minimize
    grad_loss=grad_loss)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 514, in compute_gradients
    colocate_gradients_with_ops=colocate_gradients_with_ops)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py", line 596, in gradients
    gate_gradients, aggregation_method, stop_gradients)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py", line 663, in _GradientsHelper
    to_ops, from_ops, colocate_gradients_with_ops, func_graphs, xs)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py", line 190, in _PendingCount
    between_op_list, between_ops, colocate_gradients_with_ops)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 1432, in MaybeCreateControlFlowState
    loop_state.AddWhileContext(op, between_op_list, between_ops)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 1244, in AddWhileContext
    grad_state = GradLoopState(forward_ctxt, outer_grad_state)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 846, in __init__
    real_cnt, outer_grad_state)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2585, in AddBackpropLoopCounter
    name="b_count")
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 248, in _Enter
    data, frame_name, is_constant, parallel_iterations, name=name)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_control_flow_ops.py", line 178, in enter
    parallel_iterations=parallel_iterations, name=name)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 454, in new_func
    return func(*args, **kwargs)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3155, in create_op
    op_def=op_def)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1746, in __init__
    self._control_flow_post_processing()
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1757, in _control_flow_post_processing
    self._control_flow_context.AddOp(self)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2438, in AddOp
    self._AddOpInternal(op)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2475, in _AddOpInternal
    for x in external_inputs if x.outputs]
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2475, in <listcomp>
    for x in external_inputs if x.outputs]
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 80, in identity
    return gen_array_ops.identity(input, name=name)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py", line 3264, in identity
    "Identity", input=input, name=name)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 454, in new_func
    return func(*args, **kwargs)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3155, in create_op
    op_def=op_def)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1746, in __init__
    self._control_flow_post_processing()
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1757, in _control_flow_post_processing
    self._control_flow_context.AddOp(self)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2438, in AddOp
    self._AddOpInternal(op)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2466, in _AddOpInternal
    self._MaybeAddControlDependency(op)
  File "/home/mtarasov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2504, in _MaybeAddControlDependency
    op._add_control_input(self.GetControlPivot().op)
AttributeError: 'NoneType' object has no attribute 'op

参考方案

加上mcstarioni的答案。如前所述,用tf.keras.layers.BatchNormalization替换批处理规范层似乎可以消除该错误。但是,这是因为keras中的BatchNormalization不会像here所示那样在UPDATE_OPS中添加批处理规范参数,因为它使用了不同的训练方式。如果检查移动平均值和方差,您会注意到在训练过程中仅通过运行train_op并不会更新它们。除了layer.update以外,还必须运行train_op,这应该可以解决问题。

或者,如果可能,请尝试删除嵌套的map_fn

TensorFlow操作,在官方API中找不到 - python

最近,我尝试重复学习Nvidia在GitHub上发布的代码-progressive_growing_of_gans。但是,我发现以下几种基于官方API找不到的操作参考。feed_dict = {} setter = tf.assign(var, tf.placeholder(var.dtype, var.shape, 'new_value'…

来自生成器的数据集,一次生成多个元素 - python

我正在测试是否需要从不推荐使用的基于队列的API迁移到TensorFlow中的Dataset API的领域。我似乎找不到与之等效的一个用例是enqueue_many的tf.train.batch参数。特别是,我想创建一个Python生成器,它可以产生“批处理”数组,其中“批处理大小”不必与用于SGD训练更新的数组相同,然后将批处理应用于该数据流(即与tf.t…

重命名TensorFlow估算器中的功能 - python

我正在使用固定的估算器,并从无法控制的来源读取数据。源代码使用snake_case存储功能,而我提供的预测功能始终在camelCase中,这也是我无法控制的。粗略地讲,我训练模型并将其导出,因此稍后可以阅读:features = ... # snake_case estimator = tf.estimator(DNNClassifier(feature_c…

Tensorflow到ONNX的转换 - python

我目前正在尝试将通过本教程(https://github.com/thtrieu/darkflow)创建的已保存(正在工作)的.pb文件转换为onnx文件。我目前正在使用winML工具,但是转换的结果根本不起作用(输入参数错误+整个体系结构不正确)。我的输入参数(在自述文件的最底部指定):input:0输出节点:输出:0我想在HoloLens上运行的UWP应…

有没有一种方法可以有效地矢量化图像上的Tensorflow操作? - python

Tensorflow有大量的变换,可以应用于表示图像([高度,宽度,深度])(例如tf.image.rot90()或tf.image.random_flip_left_right())的3D张量。我知道它们应与队列一起使用,因此它们只能在一个图像上运行。但是,是否有一种方法可以对操作进行矢量化处理,以将4D张量([batch_size,height,widt…