我尝试将自行设计的优化算法PSGLD合并到TensorFlow中。该算法类似于RMSProp的概念。所以我没有创建新的Op,而是在RMSProp之后补充PSGLD。我的合并程序如下:
在Python方面,在psgld.py
的文件夹下创建一个tensorflow\python\training
,它代表Python包装器。在psgld.py
中,定义PSGLDOptimizer
。
class PSGLDOptimizer(optimizer.Optimizer)
然后,在tensorflow\python\training\training_ops.py
中,分别针对密集和稀疏情况定义_ApplyPSGLDShape
和_SparseApplyPSGLD
的形状函数。
对于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")
同时,还在ApplyPSGLD
tensorflow\core\kernels\training_ops.h
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。所以我问是否有人可以就此问题或添加优化程序的整个过程给出任何建议。
答案 0 :(得分:0)
(我假设您已从源代码重建了TensorFlow,Olivier suggested in his comment,并且您正在尝试将优化程序构建为optimizer = tf.train.PSGLDOptimizer(...)
。)
要向tf.train
命名空间添加符号,您必须执行以下操作:
向文件tensorflow/python/training/training.py
添加显式导入。在该文件中,您可以查看导入,例如tf.train.RMSPropOptimizer
类。
或者:
对于大多数TensorFlow模块*,规则是如果(i)公开记录或(ii)明确列入白名单,则符号可以出现在__all__
中。如果两种情况都不成立,则无法通过tf.*
名称访问。这旨在使API表面保持较小,并避免暴露可能在版本之间更改的私有实现细节。
*请注意,这是一项正在进行中的工作。目前,只有在public API docs中记录了一种方法,才认为该方法是稳定的。