Esempio n. 1
0
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();
}
Esempio n. 2
0
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_;
}
Esempio n. 3
0
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;

}