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 2015/09/29 05:23:53 UTC
[2/5] incubator-singa git commit: SINGA-41 Support single node single
GPU training
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/cb30eadc/src/utils/updater.cc
----------------------------------------------------------------------
diff --git a/src/utils/updater.cc b/src/utils/updater.cc
index a1742c4..229d1d2 100644
--- a/src/utils/updater.cc
+++ b/src/utils/updater.cc
@@ -28,15 +28,21 @@
namespace singa {
-using mshadow::cpu;
using mshadow::expr::F;
using mshadow::op::sqrtop;
using mshadow::op::square;
-using mshadow::Shape;
-using mshadow::Shape1;
using mshadow::Tensor;
using mshadow::TensorContainer;
+using mshadow::cpu;
+using mshadow::Shape1;
+
+inline Tensor<cpu, 1> UTensor1(Blob<float>* blob){
+ Tensor<cpu, 1> tensor(blob->mutable_cpu_data(), Shape1(blob->count()));
+ return tensor;
+}
+
+/*******************************************************/
LRGenerator* LRGenerator::Create(const LRGenProto& proto) {
auto factory = Singleton<Factory<LRGenerator>>::Instance();
LRGenerator* gen = nullptr;
@@ -101,9 +107,8 @@ void Updater::Init(const UpdaterProto& proto) {
}
void SGDUpdater::Update(int step, Param* param, float grad_scale) {
- Shape<1> s = Shape1(param->size());
- Tensor<cpu, 1> data(param->mutable_cpu_data(), s);
- Tensor<cpu, 1> grad(param->mutable_cpu_grad(), s);
+ auto data = UTensor1(param->mutable_data());
+ auto grad = UTensor1(param->mutable_grad());
float lr = lr_gen_->Get(step) * param->lr_scale();
float wd = weight_decay_ * param->wd_scale();
if (grad_scale != 1.f)
@@ -111,7 +116,7 @@ void SGDUpdater::Update(int step, Param* param, float grad_scale) {
if (wd > 0) // L2 regularization, should be done after timing grad_scale
grad += data * wd;
if (momentum_ > 0) {
- Tensor<cpu, 1> history(param->mutable_cpu_history(), s);
+ auto history = UTensor1(param->mutable_history());
history = history * momentum_ - lr * grad;
data += history;
} else {
@@ -120,13 +125,14 @@ void SGDUpdater::Update(int step, Param* param, float grad_scale) {
}
}
+
+
/***********************Nesterov******************************/
void NesterovUpdater::Update(int step, Param* param, float grad_scale) {
- Shape<1> s = Shape1(param->size());
- Tensor<cpu, 1> data(param->mutable_cpu_data(), s);
- Tensor<cpu, 1> grad(param->mutable_cpu_grad(), s);
- Tensor<cpu, 1> history(param->mutable_cpu_history(), s);
- TensorContainer<cpu, 1> tmp(s);
+ auto data = UTensor1(param->mutable_data());
+ auto grad = UTensor1(param->mutable_grad());
+ auto history = UTensor1(param->mutable_history());
+ TensorContainer<cpu, 1> tmp(data.shape);
float lr = lr_gen_->Get(step)*param->lr_scale();
float wd = weight_decay_*param->wd_scale();
if (grad_scale != 1.f)
@@ -140,10 +146,10 @@ void NesterovUpdater::Update(int step, Param* param, float grad_scale) {
}
/***********************AdaGrad******************************/
void AdaGradUpdater::Update(int step, Param* param, float grad_scale) {
- Shape<1> s = Shape1(param->size());
- Tensor<cpu, 1> data(param->mutable_cpu_data(), s);
- Tensor<cpu, 1> grad(param->mutable_cpu_grad(), s);
- Tensor<cpu, 1> history(param->mutable_cpu_history(), s);
+ auto data = UTensor1(param->mutable_data());
+ auto grad = UTensor1(param->mutable_grad());
+ auto history = UTensor1(param->mutable_history());
+
float lr = lr_gen_->Get(step)*param->lr_scale();
float wd = weight_decay_*param->wd_scale();
if (grad_scale != 1.f)