https://stackoverflow.com/questions/38369565/how-to-get-learning-rate-or-iteration-times-when-define-new-layer-in-caffe
参考上述网址上的方法,需要修改
class Caffe { public: static Caffe& Get(); ...//Some other public members //Returns the current iteration times inline static int current_iter() { return Get().cur_iter_; } //Sets the current iteration times inline static void set_cur_iter(int iter) { Get().cur_iter_ = iter; } protected: //The variable to save the current itertion times int cur_iter_; ...//Some other protected members }
template <typename Dtype> void Solver<Dtype>::Step(int iters) { ... while (iter_ < stop_iter) { Caffe::set_cur_iter(iter_ ); ...//Left Operations } }
以及需要获取迭代次数的layer.cpp
template <typename Dtype> void SomeLayer<Dtype>::some_func() { int current_iter = Caffe::current_iter(); ...//Operations you want }
再具体的实现过程中出现了获得的迭代次数都是0的问题,后来请教同事发现是因为多线程造成的。
需要修改定义int cur_iter_; 为static int cur_iter_;并且在common.cpp中进行声明:int Caffe::cur_iter_ = 0;
这样获取到的迭代次数就是正确的了。
因为layer是多线程的时候,int current_iter = Caffe::current_iter();这句话会重新初始化一个caffe实例,而不是与solver中共用一个caffe实例,但是将其定义为static类型之后,就是所有实例共享的了,
具体参见:http://blog.csdn.net/morewindows/article/details/6721430
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。
一。静态成员函数中不能调用非静态成员。
二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
三。静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错。
在调试过程中发现使用to_string函数的时候会报错,'to_string' is not a member of 'std',查找资料之后,在CMakeLists.txt中添加如下一行即可:
set (CMAKE_CXX_STANDARD 11)