void SGDSolver<Dtype>::ApplyUpdate() { Dtype rate = GetLearningRate(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG_IF(INFO, Caffe::root_solver()) << "Iteration " << this->iter_ << ", lr = " << rate; } ClipGradients(); for (int param_id = 0; param_id < this->net_->learnable_params().size(); ++param_id) { Normalize(param_id); Regularize(param_id); ComputeUpdateValue(param_id, rate); } this->net_->Update(); }
void SGDSolver<Dtype>::ApplyUpdate() { Dtype rate = GetLearningRate(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG_IF(INFO, Caffe::root_solver()) << "Iteration " << this->iter_ << ", lr = " << rate; } ClipGradients(); for (int param_id = 0; param_id < this->net_->learnable_params().size(); ++param_id) { Normalize(param_id); Regularize(param_id); ComputeUpdateValue(param_id, rate); } this->net_->Update(); // Increment the internal iter_ counter -- its value should always indicate // the number of times the weights have been updated. ++this->iter_; }
void anlm(float* ima, int v, int f, int rician, const int* dims) { float *means, *variances, *Estimate, *average, *bias; unsigned char *Label; int ndim = 3; double SNR,h,mean,var,estimate,d; int vol,slice,label,Ndims,i,j,k,ii,jj,kk,ni,nj,nk,indice,Nthreads,ini,fin,r; myargument *ThreadArgs; Ndims = (int)floor(pow((2.0*f+1.0),ndim)); slice = dims[0]*dims[1]; vol = dims[0]*dims[1]*dims[2]; /*Allocate memory */ average = (float*)malloc(Ndims*sizeof(float)); means = (float*)malloc(vol*sizeof(float)); variances = (float*)malloc(vol*sizeof(float)); Estimate = (float*)malloc(vol*sizeof(float)); Label = (unsigned char*)malloc(vol*sizeof(unsigned char)); if (rician) bias = (float*)malloc(vol*sizeof(float)); for (i = 0; i < vol; i++) { Estimate[i] = 0.0; Label[i] = 0; if (rician) bias[i] = 0.0; } max = 0.0; for (k = 0;k<dims[2];k++) { for (j = 0;j<dims[1];j++) { for (i = 0;i<dims[0];i++) { if (ima[k*(slice)+(j*dims[0])+i]>max) max = (double)ima[k*(slice)+(j*dims[0])+i]; mean = 0.0; indice = 0; for (ii = -1;ii<= 1;ii++) { for (jj = -1;jj<= 1;jj++) { for (kk = -1;kk<= 1;kk++) { ni = i+ii; nj = j+jj; nk = k+kk; if (ni<0) ni = -ni; if (nj<0) nj = -nj; if (nk<0) nk = -nk; if (ni>= dims[0]) ni = 2*dims[0]-ni-1; if (nj>= dims[1]) nj = 2*dims[1]-nj-1; if (nk>= dims[2]) nk = 2*dims[2]-nk-1; mean += (double)ima[nk*(slice)+(nj*dims[0])+ni]; indice++; } } } mean /= (double)indice; means[k*(slice)+(j*dims[0])+i] = (float)mean; } } } for (k = 0;k<dims[2];k++) { for (j = 0;j<dims[1];j++) { for (i = 0;i<dims[0];i++) { var = 0; indice = 0; for (ii = -1;ii<= 1;ii++) { for (jj = -1;jj<= 1;jj++) { for (kk = -1;kk<= 1;kk++) { ni = i+ii; nj = j+jj; nk = k+kk; if (ni>= 0 && nj>= 0 && nk>0 && ni<dims[0] && nj<dims[1] && nk<dims[2]) { d = (double)ima[nk*(slice)+(nj*dims[0])+ni]-(double)means[k*(slice)+(j*dims[0])+i]; var += d*d; indice++; } } } } var /= (indice-1); variances[k*(slice)+(j*dims[0])+i] = (float)var; } } } Nthreads = 1; #ifdef _OPENMP Nthreads = omp_get_num_procs(); printf("Using %d processors\n",Nthreads);fflush(stdout); #endif /* Reserve room for handles of threads in ThreadList */ ThreadArgs = (myargument*) malloc( Nthreads*sizeof(myargument)); #ifdef _OPENMP # pragma omp parallel for default(shared) private(i, ini, fin) #endif for (i = 0; i<Nthreads; i++) { /* Make Thread Structure */ ini = (i*dims[2])/Nthreads; fin = ((i+1)*dims[2])/Nthreads; ThreadArgs[i].cols = dims[0]; ThreadArgs[i].rows = dims[1]; ThreadArgs[i].slices = dims[2]; ThreadArgs[i].in_image = ima; ThreadArgs[i].var_image = variances; ThreadArgs[i].means_image = means; ThreadArgs[i].estimate = Estimate; ThreadArgs[i].bias = bias; ThreadArgs[i].label = Label; ThreadArgs[i].ini = ini; ThreadArgs[i].fin = fin; ThreadArgs[i].radioB = v; ThreadArgs[i].radioS = f; (void)ThreadFunc(ThreadArgs[i]); } if (rician) { r = 5; Regularize(bias,variances,r,dims[0],dims[1],dims[2]); for (i = 0;i<vol;i++) { if (variances[i]>0.0) { SNR = (double)means[i]/sqrt((double)variances[i]); bias[i] = 2*(variances[i]/(float)Epsi(SNR)); #if defined(_WIN32) if (_isnan(bias[i])) bias[i] = 0.0; #else if (isnan(bias[i])) bias[i] = 0.0; #endif } } } /* Aggregation of the estimators (i.e. means computation) */ label = 0; estimate = 0.0; for (i = 0;i<vol;i++) { label = Label[i]; if (label > 0) { estimate = (double)Estimate[i]; estimate /= (double)label; if (rician) { estimate = (estimate-(double)bias[i])<0?0:(estimate-(double)bias[i]); ima[i] = (float)sqrt(estimate); } else ima[i] = (float)estimate; } } free(ThreadArgs); free(average); free(means); free(variances); free(Estimate); free(Label); if (rician) free(bias); return; }