parent
26e9c4e26f
commit
5f9cd8c9ae
@ -0,0 +1,109 @@
|
||||
#include "parameter_optimizer.h"
|
||||
#include <cmath>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
#include "adadelta_optimizer.h"
|
||||
#include "adagrad_optimizer.h"
|
||||
#include "adam_optimizer.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "sgd_optimizer.h"
|
||||
using namespace paddle;
|
||||
using namespace paddle::optimizer;
|
||||
|
||||
Tensor* fill_n_Tensor(size_t size) {
|
||||
real* ptr = new real[size];
|
||||
Tensor* param = new Tensor(ptr, size);
|
||||
Tensor& p = *param;
|
||||
for (auto i = 0; i < p.size(); ++i) {
|
||||
p[i] = (float)rand() / (float)RAND_MAX;
|
||||
}
|
||||
return param;
|
||||
}
|
||||
|
||||
Tensor* fix_n_Tensor(size_t size) {
|
||||
real* ptr = new real[size];
|
||||
Tensor* param = new Tensor(ptr, size);
|
||||
Tensor& p = *param;
|
||||
for (auto i = 0; i < p.size(); ++i) {
|
||||
p[i] = i;
|
||||
}
|
||||
return param;
|
||||
}
|
||||
|
||||
class OptimizerTest : public testing::Test {
|
||||
public:
|
||||
// init tensor shape
|
||||
const size_t size = 5;
|
||||
|
||||
virtual void SetUp() {
|
||||
create_sgd();
|
||||
create_adam();
|
||||
}
|
||||
virtual void TearDown() {}
|
||||
|
||||
void create_sgd() {
|
||||
config.set_optimizer_name("SGD");
|
||||
config.mutable_sgd()->set_momentum(0.0);
|
||||
config.mutable_sgd()->set_decay(0.0);
|
||||
config.mutable_sgd()->set_nesterov(false);
|
||||
config.set_lr_policy("ConstLr");
|
||||
config.mutable_const_lr()->set_learning_rate(0.1);
|
||||
|
||||
ParameterOptimizer* opt =
|
||||
ParameterOptimizer::create(config.SerializeAsString());
|
||||
opts.push_back(opt);
|
||||
}
|
||||
|
||||
void create_adam() {
|
||||
config.set_optimizer_name("Adam");
|
||||
config.mutable_adam()->set_beta_1(0.9);
|
||||
config.mutable_adam()->set_beta_2(0.1);
|
||||
config.mutable_adam()->set_epsilon(1e-3);
|
||||
config.mutable_adam()->set_decay(0.0);
|
||||
config.set_lr_policy("ConstLr");
|
||||
config.mutable_const_lr()->set_learning_rate(0.1);
|
||||
ParameterOptimizer* opt =
|
||||
ParameterOptimizer::create(config.SerializeAsString());
|
||||
opts.push_back(opt);
|
||||
}
|
||||
void test_set_weight() {
|
||||
Tensor* p = fill_n_Tensor(size);
|
||||
for (size_t i = 0; i < opts.size(); ++i) {
|
||||
opts[i]->set_weight(p);
|
||||
}
|
||||
}
|
||||
|
||||
void test_get_weight() {
|
||||
Tensor* p = fix_n_Tensor(size);
|
||||
for (size_t i = 0; i < opts.size(); ++i) {
|
||||
opts[i]->set_weight(p);
|
||||
}
|
||||
for (size_t i = 0; i < opts.size(); ++i) {
|
||||
real* newp = (real*)opts[i]->get_weight();
|
||||
for (size_t j = 0; j < size; ++j) {
|
||||
EXPECT_EQ(newp[j], (*p)[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void test_update() {
|
||||
Tensor* g = fix_n_Tensor(size);
|
||||
for (size_t i = 0; i < opts.size(); ++i) {
|
||||
opts[i]->update(g);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<ParameterOptimizer*> opts;
|
||||
OptimizerConfig config;
|
||||
};
|
||||
|
||||
TEST_F(OptimizerTest, test_set_get_weight) {
|
||||
test_set_weight();
|
||||
test_get_weight();
|
||||
}
|
||||
TEST_F(OptimizerTest, test_update) { test_update(); }
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
#include "regularizer.h"
|
||||
|
||||
namespace paddle {
|
||||
namespace optimizer {
|
||||
|
||||
template <class T>
|
||||
Regularizer<T>* Regularizer<T>::create(const std::string& config) {
|
||||
paddle::OptimizerConfig config;
|
||||
Regularizer<T>* r;
|
||||
if (config.regularizer_type() == paddle::OptimizerConfig_RegularizerType_L1) {
|
||||
r = new L1Regularizer<T>(config);
|
||||
} else if (config.regularizer_type() ==
|
||||
paddle::OptimizerConfig_RegularizerType_L2) {
|
||||
r = new L2Regularizer<T>(config);
|
||||
break;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
template class L1Regularizer<float>;
|
||||
template class L1Regularizer<double>;
|
||||
template class L2Regularizer<float>;
|
||||
template class L2Regularizer<double>;
|
||||
|
||||
} // namespace optimizer
|
||||
} // namespace paddle
|
@ -1,45 +0,0 @@
|
||||
#ifndef PADDLE_OPITMIZER_REGULARIZER_H_
|
||||
#define PADDLE_OPTIMIZER_REGULARIZER_H_
|
||||
|
||||
#include "OptimizerConfig.pb.h"
|
||||
#include "Tensor.h"
|
||||
|
||||
namespace paddle {
|
||||
namespace optimizer {
|
||||
|
||||
/**
|
||||
* @brief regularizer in L1, L2
|
||||
*/
|
||||
|
||||
template <class T>
|
||||
class Regularizer {
|
||||
public:
|
||||
/**
|
||||
* @brief regularizer update interface
|
||||
* @param param need to update
|
||||
* @return void
|
||||
*/
|
||||
static Regularizer *create(const std::string &config);
|
||||
virtual void update(Tensor<T> ¶meter) = 0;
|
||||
|
||||
private:
|
||||
std::string regularizer_name;
|
||||
OptimizerConfig config_;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class L1Regularizer {
|
||||
public:
|
||||
void update(Tensor<T> ¶meter);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class L2Regularizer {
|
||||
public:
|
||||
void update(Tensor<T> ¶meter);
|
||||
};
|
||||
|
||||
} // namespace optimizer
|
||||
} // namespace paddle
|
||||
|
||||
#endif
|
Loading…
Reference in new issue