在Tensorflow中创建优化器时,如何处理AttributeError?

时间:2016-08-01 08:34:27

标签: optimization tensorflow deep-learning attributeerror

我尝试将自行设计的优化算法PSGLD合并到TensorFlow中。该算法类似于RMSProp的概念。所以我没有创建新的Op,而是在RMSProp之后补充PSGLD。我的合并程序如下:

  1. 在Python方面,在psgld.py的文件夹下创建一个tensorflow\python\training,它代表Python包装器。在psgld.py中,定义PSGLDOptimizer

    的类

    class PSGLDOptimizer(optimizer.Optimizer)

  2. 然后,在tensorflow\python\training\training_ops.py中,分别针对密集和稀疏情况定义_ApplyPSGLDShape_SparseApplyPSGLD的形状函数。

  3. 对于C ++方面,在tensorflow\core\ops\training_ops.cc中,定义ApplyPSGLD操作的输入,输出和属性:
    REGISTER_OP("ApplyPSGLD") .Input("var: Ref(T)") .Input("ms: Ref(T)") .Input("mom: Ref(T)") .Input("lr: T") .Input("decay: T") .Input("epsilon: T") .Input("grad: T") .Output("out: Ref(T)") .Attr("T: numbertype") .Attr("use_locking: bool = false")

  4. 同时,还在ApplyPSGLD

    的标头文件中定义tensorflow\core\kernels\training_ops.h

    template <typename Device, typename T> struct ApplyPSGLD { ... };

  5. 要在C ++端实现算法的计算,请补充tensorflow\core\kernels\training_ops.cc内核中的相应代码。

  6. 毕竟,当我运行tensorflow/models/image/mnist/convolutional.py并调整优化器时,

    optimizer = tf.train.PSGLDOptimizer(learning_rate).minimize(loss, global_step=batch)

    发生AttributeError: AttributeError: 'module' object has no attribute 'PSGLDOptimizer'

    环境是TF-0.9,cudnn5。所以我问是否有人可以就此问题或添加优化程序的整个过程给出任何建议。

1 个答案:

答案 0 :(得分:0)

(我假设您已从源代码重建了TensorFlow,Olivier suggested in his comment,并且您正在尝试将优化程序构建为optimizer = tf.train.PSGLDOptimizer(...)。)

要向tf.train命名空间添加符号,您必须执行以下操作:

  1. 向文件tensorflow/python/training/training.py添加显式导入。在该文件中,您可以查看导入,例如tf.train.RMSPropOptimizer类。

  2. 或者:

    1. 为新课程添加文档,并将@@PSGLDOptimizer添加到模块docstring。 tf.train.RMSPropOptimizer的相应行是here。这将该类标记为公开记录的API符号。

    2. 为添加到该文件中的whitelist__all__符号添加例外。例如,this line将符号tf.train.LooperThread列入白名单。

  3. 对于大多数TensorFlow模块*,规则是如果(i)公开记录或(ii)明确列入白名单,则符号可以出现在__all__中。如果两种情况都不成立,则无法通过tf.*名称访问。这旨在使API表面保持较小,并避免暴露可能在版本之间更改的私有实现细节。

    *请注意,这是一项正在进行中的工作。目前,只有在public API docs中记录了一种方法,才认为该方法是稳定的。