【发布时间】:2016-12-06 06:21:37
【问题描述】:
我尝试将自行设计的优化算法 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")的输入、输出和属性: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的头文件中定义ApplyPSGLDtemplate <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? (您需要先从源代码构建)
-
@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