在Tensorflow中创建优化器时,如何处理发生的AttributeError?
When create an optimizer in Tensorflow, how to deal with AttributeError happens?
我尝试将自己设计的优化算法PSGLD融入到TensorFlow中。该算法类似于 RMSProp 的概念。所以我没有创建新的Op,而是在RMSProp之后补充PSGLD。我的合并过程如下:
在Python端,在tensorflow\python\training
的文件夹下创建一个psgld.py
,代表Python包装器。并在psgld.py
中,定义PSGLDOptimizer
.
的class
class PSGLDOptimizer(optimizer.Optimizer)
然后,在tensorflow\python\training\training_ops.py
中,定义_ApplyPSGLDShape
和_SparseApplyPSGLD
的形函数,分别针对密集和稀疏情况。
对于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")
同时,在tensorflow\core\kernels\training_ops.h
的头文件中也定义了ApplyPSGLD
template <typename Device, typename T>
struct ApplyPSGLD {
...
};
为了在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,如 ,并且您正在尝试将优化器构建为 optimizer = tf.train.PSGLDOptimizer(...)
。)
要将符号添加到 tf.train
命名空间,您必须执行以下操作:
向文件添加显式导入 tensorflow/python/training/training.py
. In that file, you can see imports for, e.g., the tf.train.RMSPropOptimizer
class.
或者:
对于大多数 TensorFlow 模块*,规则是符号可以出现在 __all__
中,前提是它 (i) 公开记录,或 (ii) 明确列入白名单。如果这两个条件都不成立,则无法通过 tf.*
名称访问它。这是为了保持 API 表面较小,并避免暴露可能在版本之间更改的私有实现细节。
* 但请注意,这是一项正在进行的工作。目前,只有在 public API docs.
中记录的方法才被认为是稳定的
我尝试将自己设计的优化算法PSGLD融入到TensorFlow中。该算法类似于 RMSProp 的概念。所以我没有创建新的Op,而是在RMSProp之后补充PSGLD。我的合并过程如下:
在Python端,在
的classtensorflow\python\training
的文件夹下创建一个psgld.py
,代表Python包装器。并在psgld.py
中,定义PSGLDOptimizer
.class PSGLDOptimizer(optimizer.Optimizer)
然后,在
tensorflow\python\training\training_ops.py
中,定义_ApplyPSGLDShape
和_SparseApplyPSGLD
的形函数,分别针对密集和稀疏情况。对于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")
同时,在
的头文件中也定义了tensorflow\core\kernels\training_ops.h
ApplyPSGLD
template <typename Device, typename T> struct ApplyPSGLD { ... };
为了在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,如 optimizer = tf.train.PSGLDOptimizer(...)
。)
要将符号添加到 tf.train
命名空间,您必须执行以下操作:
向文件添加显式导入
tensorflow/python/training/training.py
. In that file, you can see imports for, e.g., thetf.train.RMSPropOptimizer
class.或者:
对于大多数 TensorFlow 模块*,规则是符号可以出现在 __all__
中,前提是它 (i) 公开记录,或 (ii) 明确列入白名单。如果这两个条件都不成立,则无法通过 tf.*
名称访问它。这是为了保持 API 表面较小,并避免暴露可能在版本之间更改的私有实现细节。
* 但请注意,这是一项正在进行的工作。目前,只有在 public API docs.
中记录的方法才被认为是稳定的