You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@singa.apache.org by wa...@apache.org on 2016/01/06 15:56:18 UTC
[5/5] incubator-singa git commit: SINGA-120 - Implemented GRU and BPTT
SINGA-120 - Implemented GRU and BPTT
check with cpplint
Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/24a1be9a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/24a1be9a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/24a1be9a
Branch: refs/heads/master
Commit: 24a1be9aa19064491710895a36fd93617c2a57da
Parents: 9705f39
Author: WANG Sheng <wa...@gmail.com>
Authored: Wed Jan 6 22:54:24 2016 +0800
Committer: WANG Sheng <wa...@gmail.com>
Committed: Wed Jan 6 22:54:24 2016 +0800
----------------------------------------------------------------------
include/singa/neuralnet/neuron_layer.h | 19 +-
src/neuralnet/neuron_layer/gru.cc | 6 +-
src/test/test_gru_layer.cc | 460 ++++++++++++++--------------
3 files changed, 241 insertions(+), 244 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/24a1be9a/include/singa/neuralnet/neuron_layer.h
----------------------------------------------------------------------
diff --git a/include/singa/neuralnet/neuron_layer.h b/include/singa/neuralnet/neuron_layer.h
index 3fe08f4..f03e91b 100644
--- a/include/singa/neuralnet/neuron_layer.h
+++ b/include/singa/neuralnet/neuron_layer.h
@@ -170,7 +170,7 @@ class GRULayer : public NeuronLayer {
void Setup(const LayerProto& proto, const vector<Layer*>& srclayers) override;
void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
- ConnectionType dst_layer_connection() const override{
+ ConnectionType dst_layer_connection() const override {
return kOneToMany;
}
Blob<float>* mutable_grad(const Layer* from) override {
@@ -179,15 +179,14 @@ class GRULayer : public NeuronLayer {
else
return gradvec_[0];
}
- const Blob<float>& grad(const Layer* from) override{
+ const Blob<float>& grad(const Layer* from) override {
if (typeid(*from) == typeid(GRULayer))
return *gradvec_[1];
else
return *gradvec_[0];
}
-
const std::vector<Param*> GetParams() const override {
- std::vector<Param*> params{weight_z_hx_, weight_r_hx_,weight_c_hx_,
+ std::vector<Param*> params{weight_z_hx_, weight_r_hx_, weight_c_hx_,
weight_z_hh_, weight_r_hh_, weight_c_hh_};
if (bias_z_ != nullptr && bias_r_ != nullptr && bias_c_ != nullptr) {
@@ -199,14 +198,12 @@ class GRULayer : public NeuronLayer {
}
private:
- int batchsize_; // batch size
- int vdim_, hdim_; // dimensions
-
+ int batchsize_; // batch size
+ int vdim_, hdim_; // dimensions
Blob<float> *update_gate_, *reset_gate_, *new_memory_;
-
- Param *weight_z_hx_, *weight_z_hh_, *bias_z_; // update gate
- Param *weight_r_hx_, *weight_r_hh_, *bias_r_; // reset gate
- Param *weight_c_hx_, *weight_c_hh_, *bias_c_; // new memory
+ Param *weight_z_hx_, *weight_z_hh_, *bias_z_; // update gate
+ Param *weight_r_hx_, *weight_r_hh_, *bias_r_; // reset gate
+ Param *weight_c_hx_, *weight_c_hh_, *bias_c_; // new memory
};
/**
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/24a1be9a/src/neuralnet/neuron_layer/gru.cc
----------------------------------------------------------------------
diff --git a/src/neuralnet/neuron_layer/gru.cc b/src/neuralnet/neuron_layer/gru.cc
index d04c11b..440da91 100644
--- a/src/neuralnet/neuron_layer/gru.cc
+++ b/src/neuralnet/neuron_layer/gru.cc
@@ -47,7 +47,7 @@ GRULayer::~GRULayer() {
delete update_gate_;
delete reset_gate_;
delete new_memory_;
- //delete reset_context_;
+ // delete reset_context_;
}
void GRULayer::Setup(const LayerProto& conf,
@@ -127,14 +127,14 @@ void GRULayer::ComputeFeature(int flag,
MVAddRow(1.0f, 1.0f, bias_z_->data(), update_gate_);
GEMM(1.0f, 1.0f, *context, *w_z_hh_t, update_gate_);
Map<op::Sigmoid<float>, float>(*update_gate_, update_gate_);
- //LOG(ERROR) << "Update Gate: " << update_gate_->cpu_data()[0];
+ // LOG(ERROR) << "Update Gate: " << update_gate_->cpu_data()[0];
// Compute the reset gate
GEMM(1.0f, 0.0f, src, *w_r_hx_t, reset_gate_);
if (bias_r_ != nullptr)
MVAddRow(1.0f, 1.0f, bias_r_->data(), reset_gate_);
GEMM(1.0f, 1.0f, *context, *w_r_hh_t, reset_gate_);
Map<op::Sigmoid<float>, float>(*reset_gate_, reset_gate_);
- //LOG(ERROR) << "Reset Gate: " << reset_gate_->cpu_data()[0];
+ // LOG(ERROR) << "Reset Gate: " << reset_gate_->cpu_data()[0];
// Compute the new memory
GEMM(1.0f, 0.0f, *context, *w_c_hh_t, new_memory_);
Mult<float>(*reset_gate_, *new_memory_, new_memory_);
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/24a1be9a/src/test/test_gru_layer.cc
----------------------------------------------------------------------
diff --git a/src/test/test_gru_layer.cc b/src/test/test_gru_layer.cc
index 955cc8a..d7c8fe8 100644
--- a/src/test/test_gru_layer.cc
+++ b/src/test/test_gru_layer.cc
@@ -34,254 +34,254 @@ using namespace std;
using namespace singa;
class GRULayerTest: public ::testing::Test {
-protected:
- virtual void SetUp() {
- // Initialize the settings for the first input-layer
- std::string path1 = "src/test/gru-in-1.csv"; // path of a csv file
- std::ofstream ofs1(path1, std::ofstream::out);
- ASSERT_TRUE(ofs1.is_open());
- ofs1 << "0,0,0,1\n";
- ofs1 << "0,0,1,0\n";
- ofs1.close();
- auto conf1 = in1_conf.mutable_store_conf();
- conf1->set_path(path1);
- conf1->set_batchsize(2);
- conf1->add_shape(4);
- conf1->set_backend("textfile");
- conf1->set_has_label(false);
-
-
- // Initialize the settings for the second input-layer
- std::string path2 = "src/test/gru-in-2.csv"; // path of a csv file
- std::ofstream ofs2(path2, std::ofstream::out);
- ASSERT_TRUE(ofs2.is_open());
- ofs2 << "0,1,0,0\n";
- ofs2 << "1,0,0,0\n";
- ofs2.close();
- auto conf2 = in2_conf.mutable_store_conf();
- conf2->set_path(path2);
-
- conf2->set_batchsize(2);
- conf2->add_shape(4);
- conf2->set_backend("textfile");
- conf2->set_has_label(false);
-
-
- gru1_conf.mutable_gru_conf() -> set_dim_hidden(2);
- gru1_conf.mutable_gru_conf() -> set_bias_term(true);
- for (int i = 0; i < 9; i ++) {
- gru1_conf.add_param();
- }
-
-
- gru1_conf.mutable_param(0)->set_name("wzhx1");
- gru1_conf.mutable_param(0)->set_type(kParam);
- gru1_conf.mutable_param(0)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(0)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(1)->set_name("wrhx1");
- gru1_conf.mutable_param(1)->set_type(kParam);
- gru1_conf.mutable_param(1)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(1)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(2)->set_name("wchx1");
- gru1_conf.mutable_param(2)->set_type(kParam);
- gru1_conf.mutable_param(2)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(2)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(3)->set_name("wzhh1");
- gru1_conf.mutable_param(3)->set_type(kParam);
- gru1_conf.mutable_param(3)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(3)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(4)->set_name("wrhh1");
- gru1_conf.mutable_param(4)->set_type(kParam);
- gru1_conf.mutable_param(4)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(4)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(5)->set_name("wchh1");
- gru1_conf.mutable_param(5)->set_type(kParam);
- gru1_conf.mutable_param(5)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(5)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(6)->set_name("bz1");
- gru1_conf.mutable_param(6)->set_type(kParam);
- gru1_conf.mutable_param(6)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(6)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(7)->set_name("br1");
- gru1_conf.mutable_param(7)->set_type(kParam);
- gru1_conf.mutable_param(7)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(7)->mutable_init()->set_value(0.5f);
-
- gru1_conf.mutable_param(8)->set_name("bc1");
- gru1_conf.mutable_param(8)->set_type(kParam);
- gru1_conf.mutable_param(8)->mutable_init()->set_type(kConstant);
- gru1_conf.mutable_param(8)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_gru_conf() -> set_dim_hidden(2);
- gru2_conf.mutable_gru_conf() -> set_bias_term(true);
- for (int i = 0; i < 9; i ++) {
- gru2_conf.add_param();
- }
-
- gru2_conf.mutable_param(0)->set_name("wzhx2");
- gru2_conf.mutable_param(0)->set_type(kParam);
- gru2_conf.mutable_param(0)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(0)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(1)->set_name("wrhx2");
- gru2_conf.mutable_param(1)->set_type(kParam);
- gru2_conf.mutable_param(1)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(1)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(2)->set_name("wchx2");
- gru2_conf.mutable_param(2)->set_type(kParam);
- gru2_conf.mutable_param(2)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(2)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(3)->set_name("wzhh2");
- gru2_conf.mutable_param(3)->set_type(kParam);
- gru2_conf.mutable_param(3)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(3)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(4)->set_name("wrhh2");
- gru2_conf.mutable_param(4)->set_type(kParam);
- gru2_conf.mutable_param(4)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(4)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(5)->set_name("wchh2");
- gru2_conf.mutable_param(5)->set_type(kParam);
- gru2_conf.mutable_param(5)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(5)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(6)->set_name("bz2");
- gru2_conf.mutable_param(6)->set_type(kParam);
- gru2_conf.mutable_param(6)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(6)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(7)->set_name("br2");
- gru2_conf.mutable_param(7)->set_type(kParam);
- gru2_conf.mutable_param(7)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(7)->mutable_init()->set_value(0.5f);
-
- gru2_conf.mutable_param(8)->set_name("bc2");
- gru2_conf.mutable_param(8)->set_type(kParam);
- gru2_conf.mutable_param(8)->mutable_init()->set_type(kConstant);
- gru2_conf.mutable_param(8)->mutable_init()->set_value(0.5f);
-
- }
- singa::LayerProto in1_conf;
- singa::LayerProto in2_conf;
- singa::LayerProto gru1_conf;
- singa::LayerProto gru2_conf;
+ protected:
+ virtual void SetUp() {
+ // Initialize the settings for the first input-layer
+ std::string path1 = "src/test/gru-in-1.csv"; // path of a csv file
+ std::ofstream ofs1(path1, std::ofstream::out);
+ ASSERT_TRUE(ofs1.is_open());
+ ofs1 << "0,0,0,1\n";
+ ofs1 << "0,0,1,0\n";
+ ofs1.close();
+ auto conf1 = in1_conf.mutable_store_conf();
+ conf1->set_path(path1);
+ conf1->set_batchsize(2);
+ conf1->add_shape(4);
+ conf1->set_backend("textfile");
+ conf1->set_has_label(false);
+
+
+ // Initialize the settings for the second input-layer
+ std::string path2 = "src/test/gru-in-2.csv"; // path of a csv file
+ std::ofstream ofs2(path2, std::ofstream::out);
+ ASSERT_TRUE(ofs2.is_open());
+ ofs2 << "0,1,0,0\n";
+ ofs2 << "1,0,0,0\n";
+ ofs2.close();
+ auto conf2 = in2_conf.mutable_store_conf();
+ conf2->set_path(path2);
+
+ conf2->set_batchsize(2);
+ conf2->add_shape(4);
+ conf2->set_backend("textfile");
+ conf2->set_has_label(false);
+
+
+ gru1_conf.mutable_gru_conf() -> set_dim_hidden(2);
+ gru1_conf.mutable_gru_conf() -> set_bias_term(true);
+ for (int i = 0; i < 9; i ++) {
+ gru1_conf.add_param();
+ }
+
+
+ gru1_conf.mutable_param(0)->set_name("wzhx1");
+ gru1_conf.mutable_param(0)->set_type(kParam);
+ gru1_conf.mutable_param(0)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(0)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(1)->set_name("wrhx1");
+ gru1_conf.mutable_param(1)->set_type(kParam);
+ gru1_conf.mutable_param(1)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(1)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(2)->set_name("wchx1");
+ gru1_conf.mutable_param(2)->set_type(kParam);
+ gru1_conf.mutable_param(2)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(2)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(3)->set_name("wzhh1");
+ gru1_conf.mutable_param(3)->set_type(kParam);
+ gru1_conf.mutable_param(3)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(3)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(4)->set_name("wrhh1");
+ gru1_conf.mutable_param(4)->set_type(kParam);
+ gru1_conf.mutable_param(4)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(4)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(5)->set_name("wchh1");
+ gru1_conf.mutable_param(5)->set_type(kParam);
+ gru1_conf.mutable_param(5)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(5)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(6)->set_name("bz1");
+ gru1_conf.mutable_param(6)->set_type(kParam);
+ gru1_conf.mutable_param(6)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(6)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(7)->set_name("br1");
+ gru1_conf.mutable_param(7)->set_type(kParam);
+ gru1_conf.mutable_param(7)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(7)->mutable_init()->set_value(0.5f);
+
+ gru1_conf.mutable_param(8)->set_name("bc1");
+ gru1_conf.mutable_param(8)->set_type(kParam);
+ gru1_conf.mutable_param(8)->mutable_init()->set_type(kConstant);
+ gru1_conf.mutable_param(8)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_gru_conf() -> set_dim_hidden(2);
+ gru2_conf.mutable_gru_conf() -> set_bias_term(true);
+ for (int i = 0; i < 9; i ++) {
+ gru2_conf.add_param();
+ }
+
+ gru2_conf.mutable_param(0)->set_name("wzhx2");
+ gru2_conf.mutable_param(0)->set_type(kParam);
+ gru2_conf.mutable_param(0)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(0)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(1)->set_name("wrhx2");
+ gru2_conf.mutable_param(1)->set_type(kParam);
+ gru2_conf.mutable_param(1)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(1)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(2)->set_name("wchx2");
+ gru2_conf.mutable_param(2)->set_type(kParam);
+ gru2_conf.mutable_param(2)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(2)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(3)->set_name("wzhh2");
+ gru2_conf.mutable_param(3)->set_type(kParam);
+ gru2_conf.mutable_param(3)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(3)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(4)->set_name("wrhh2");
+ gru2_conf.mutable_param(4)->set_type(kParam);
+ gru2_conf.mutable_param(4)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(4)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(5)->set_name("wchh2");
+ gru2_conf.mutable_param(5)->set_type(kParam);
+ gru2_conf.mutable_param(5)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(5)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(6)->set_name("bz2");
+ gru2_conf.mutable_param(6)->set_type(kParam);
+ gru2_conf.mutable_param(6)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(6)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(7)->set_name("br2");
+ gru2_conf.mutable_param(7)->set_type(kParam);
+ gru2_conf.mutable_param(7)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(7)->mutable_init()->set_value(0.5f);
+
+ gru2_conf.mutable_param(8)->set_name("bc2");
+ gru2_conf.mutable_param(8)->set_type(kParam);
+ gru2_conf.mutable_param(8)->mutable_init()->set_type(kConstant);
+ gru2_conf.mutable_param(8)->mutable_init()->set_value(0.5f);
+ }
+ singa::LayerProto in1_conf;
+ singa::LayerProto in2_conf;
+ singa::LayerProto gru1_conf;
+ singa::LayerProto gru2_conf;
};
TEST_F(GRULayerTest, Setup) {
- singa::Driver driver;
- //driver.RegisterLayer<GRULayer, int> (kGRU);
- driver.RegisterParam<Param>(0);
- driver.RegisterParamGenerator<UniformGen>(kUniform);
- driver.RegisterParamGenerator<ParamGenerator>(kConstant);
-
- singa::CSVInputLayer in_layer_1;
- singa::CSVInputLayer in_layer_2;
-
- in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
- EXPECT_EQ(2, static_cast<int>(in_layer_1.aux_data().size()));
- EXPECT_EQ(8, in_layer_1.data(nullptr).count());
-
- in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
- EXPECT_EQ(2, static_cast<int>(in_layer_2.aux_data().size()));
- EXPECT_EQ(8, in_layer_2.data(nullptr).count());
-
- singa::GRULayer gru_layer_1;
- gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
- //EXPECT_EQ(2, gru_layer_1.hdim());
- //EXPECT_EQ(4, gru_layer_1.vdim());
-
- for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
- gru_layer_1.GetParams()[i]->InitValues();
- }
- EXPECT_EQ (0.5, gru_layer_1.GetParams()[0]->data().cpu_data()[0]);
- //cout << "gru_layer_1: " << gru_layer_1.GetParams()[0]->data().cpu_data()[0] << endl;
-
- singa::GRULayer gru_layer_2;
- gru_layer_2.Setup(gru2_conf, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- //EXPECT_EQ(2, gru_layer_2.hdim());
- //EXPECT_EQ(4, gru_layer_2.vdim());
- for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
- gru_layer_2.GetParams()[i]->InitValues();
- }
- EXPECT_EQ (0.5, gru_layer_2.GetParams()[0]->data().cpu_data()[0]);
+ singa::Driver driver;
+ // driver.RegisterLayer<GRULayer, int> (kGRU);
+ driver.RegisterParam<Param>(0);
+ driver.RegisterParamGenerator<UniformGen>(kUniform);
+ driver.RegisterParamGenerator<ParamGenerator>(kConstant);
+
+ singa::CSVInputLayer in_layer_1;
+ singa::CSVInputLayer in_layer_2;
+
+ in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
+ EXPECT_EQ(2, static_cast<int>(in_layer_1.aux_data().size()));
+ EXPECT_EQ(8, in_layer_1.data(nullptr).count());
+
+ in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
+ EXPECT_EQ(2, static_cast<int>(in_layer_2.aux_data().size()));
+ EXPECT_EQ(8, in_layer_2.data(nullptr).count());
+
+ singa::GRULayer gru_layer_1;
+ gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
+ // EXPECT_EQ(2, gru_layer_1.hdim());
+ // EXPECT_EQ(4, gru_layer_1.vdim());
+
+ for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
+ gru_layer_1.GetParams()[i]->InitValues();
+ }
+ EXPECT_EQ (0.5, gru_layer_1.GetParams()[0]->data().cpu_data()[0]);
+ // cout << "gru_layer_1: " << gru_layer_1.GetParams()[0]->data().cpu_data()[0]
+ // << endl;
+
+ singa::GRULayer gru_layer_2;
+ gru_layer_2.Setup(gru2_conf,
+ std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ // EXPECT_EQ(2, gru_layer_2.hdim());
+ // EXPECT_EQ(4, gru_layer_2.vdim());
+ for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
+ gru_layer_2.GetParams()[i]->InitValues();
+ }
+ EXPECT_EQ (0.5, gru_layer_2.GetParams()[0]->data().cpu_data()[0]);
}
/*
TEST_F(GRULayerTest, ComputeFeature) {
- singa::CSVInputLayer in_layer_1;
- singa::CSVInputLayer in_layer_2;
-
- in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
- in_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
- in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
- in_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
-
-
- singa::GRULayer gru_layer_1;
- gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
- for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
- gru_layer_1.GetParams()[i]->InitValues();
- }
- gru_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
- for (int i = 0; i < gru_layer_1.data(nullptr).count(); i ++) {
- EXPECT_GT(0.000001,abs(0.204824-gru_layer_1.data(nullptr).cpu_data()[i]));
- }
-
- singa::GRULayer gru_layer_2;
- gru_layer_2.Setup(gru2_conf, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
- gru_layer_2.GetParams()[i]->InitValues();
- }
- gru_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- for (int i = 0; i < gru_layer_2.data(nullptr).count(); i ++) {
- EXPECT_GT(0.000001,abs(0.346753-gru_layer_2.data(nullptr).cpu_data()[i]));
- }
+ singa::CSVInputLayer in_layer_1;
+ singa::CSVInputLayer in_layer_2;
+
+ in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
+ in_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
+ in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
+ in_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
+
+
+ singa::GRULayer gru_layer_1;
+ gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
+ for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
+ gru_layer_1.GetParams()[i]->InitValues();
+ }
+ gru_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
+ for (int i = 0; i < gru_layer_1.data(nullptr).count(); i ++) {
+ EXPECT_GT(0.000001,abs(0.204824-gru_layer_1.data(nullptr).cpu_data()[i]));
+ }
+
+ singa::GRULayer gru_layer_2;
+ gru_layer_2.Setup(gru2_conf, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
+ gru_layer_2.GetParams()[i]->InitValues();
+ }
+ gru_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ for (int i = 0; i < gru_layer_2.data(nullptr).count(); i ++) {
+ EXPECT_GT(0.000001,abs(0.346753-gru_layer_2.data(nullptr).cpu_data()[i]));
+ }
}
-/*
TEST_F(GRULayerTest, ComputeGradient) {
- singa::CSVInputLayer in_layer_1;
- singa::CSVInputLayer in_layer_2;
+ singa::CSVInputLayer in_layer_1;
+ singa::CSVInputLayer in_layer_2;
- in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
- in_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
- in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
- in_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
+ in_layer_1.Setup(in1_conf, std::vector<singa::Layer*> { });
+ in_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
+ in_layer_2.Setup(in2_conf, std::vector<singa::Layer*>{ });
+ in_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*> { });
- singa::GRULayer gru_layer_1;
- gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
- for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
- gru_layer_1.GetParams()[i]->InitValues();
- }
- gru_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
+ singa::GRULayer gru_layer_1;
+ gru_layer_1.Setup(gru1_conf, std::vector<singa::Layer*>{&in_layer_1});
+ for (unsigned int i = 0; i < gru_layer_1.GetParams().size(); i ++) {
+ gru_layer_1.GetParams()[i]->InitValues();
+ }
+ gru_layer_1.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
- singa::GRULayer gru_layer_2;
- gru_layer_2.Setup(gru2_conf, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
- gru_layer_2.GetParams()[i]->InitValues();
- }
- gru_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ singa::GRULayer gru_layer_2;
+ gru_layer_2.Setup(gru2_conf, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ for (unsigned int i = 0; i < gru_layer_2.GetParams().size(); i ++) {
+ gru_layer_2.GetParams()[i]->InitValues();
+ }
+ gru_layer_2.ComputeFeature(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- // For test purpose, we set dummy values for gru_layer_2.grad_
- for (int i = 0; i < gru_layer_2.grad(nullptr).count(); i ++) {
- gru_layer_2.mutable_grad(nullptr)->mutable_cpu_data()[i] = 1.0f;
- }
- gru_layer_2.ComputeGradient(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
+ // For test purpose, we set dummy values for gru_layer_2.grad_
+ for (int i = 0; i < gru_layer_2.grad(nullptr).count(); i ++) {
+ gru_layer_2.mutable_grad(nullptr)->mutable_cpu_data()[i] = 1.0f;
+ }
+ gru_layer_2.ComputeGradient(singa::kTrain, std::vector<singa::Layer*>{&in_layer_2, &gru_layer_1});
- gru_layer_1.ComputeGradient(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
+ gru_layer_1.ComputeGradient(singa::kTrain, std::vector<singa::Layer*>{&in_layer_1});
}
*/