【问题标题】:When create an optimizer in Tensorflow, how to deal with AttributeError happens?在TensorFlow中创建优化器时,出现AttributeError怎么办?
【发布时间】:2016-12-06 06:21:37
【问题描述】:

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

  1. 在Python端,在tensorflow\python\training文件夹下创建一个psgld.py,代表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 Op:
    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")的输入、输出和属性:
    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. 同时,还要在tensorflow\core\kernels\training_ops.h的头文件中定义ApplyPSGLD

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

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

毕竟,当我运行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。所以我问是否有人可以就这个问题或添加优化器的整个过程给我任何建议。

【问题讨论】:

  • 您是否使用更改重新编译了 TensorFlow? (您需要先从源代码构建)
  • @OlivierMoindrot 我只在原来的tensorflow\python\training\training.py 中添加了一个导入PSGLDOptimizer,定义了ApplyPSGLD,并在tensorflow\core\kernels\training_ops.cc 中实现了它的C++ 端算法。我不确定这是否足够。您能否更具体地了解“重新编译”?
  • 当您修改 TensorFlow 代码时,您需要重新编译它,才能使用它。检查the installation guide 从源代码安装,然后修改源代码,最后用您的修改重新编译代码。重新编译就是用bazel创建pip包并安装。
  • @OlivierMoindrot 非常感谢!

标签: optimization tensorflow deep-learning attributeerror


【解决方案1】:

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

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

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

  2. 要么:

    1. 为您的新类添加文档,并将@@PSGLDOptimizer 添加到模块文档字符串中。 tf.train.RMSPropOptimizer 的对应行是 here。这会将类标记为公开记录的 API 符号。

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

对于大多数 TensorFlow 模块*,规则是符号可以出现在 __all__ 中,前提是 (i) 公开记录,或 (ii) 明确列入白名单。如果两个条件都不成立,则无法通过 tf.* 名称访问它。这是为了保持 API 表面较小,并避免暴露可能在版本之间发生变化的私有实现细节。

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

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 2016-11-20
    • 1970-01-01
    • 2017-04-01
    • 2017-12-22
    • 2012-09-06
    • 2016-08-19
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多