[英]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 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,正如Olivier在他的评论中建议的那样 ,并且您正在尝试将优化optimizer = tf.train.PSGLDOptimizer(...)
构建为optimizer = tf.train.PSGLDOptimizer(...)
。)
要将符号添加到tf.train
命名空间,您必须执行以下操作:
将显式导入添加到文件tensorflow/python/training/training.py
。 在该文件中,您可以看到例如tf.train.RMSPropOptimizer
类的tf.train.RMSPropOptimizer
。
要么:
对于大多数TensorFlow模块*,规则是如果(i)公开记录或(ii)明确列入白名单的符号可以出现在__all__
。 如果两个条件都不成立,则无法通过tf.*
名称访问该条件。 这是为了使API界面小巧,并避免暴露可能在版本之间改变的私有实现细节。
*但是请注意,这是一项正在进行的工作。 目前,只有在公共API文档中对其进行了说明,该方法才被认为是稳定的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.