C реализация тестового режима нормализации партии (прямое направление) от Tensorflow - PullRequest
0 голосов
/ 11 апреля 2019

Я попытался реализовать пакетную нормализацию тензорного потока в C-коде. Полный код ниже.

void batch_normalization(float arr[512][1][16], int ndim_0, int ndim_1, int ndim_2)
{
  int i,j,k,l;
  float mean[16]={0,0,};
  for (i=0;i<ndim_2;i++)
  {
    for(j=0;j<ndim_0;j++)
    {
      for(k=0;k<ndim_1;k++)
      {
        mean[i]+=arr[j][k][l];  //calculate mean
      }
    }
    mean[i] /= (ndim_0 * ndim_1);
  }
  float var[16] = { 0.0, };
  float momentum = 0.99;
  float epsilon = 0.001;
  for (i = 0; i < ndim_2; i++)
  {
    for (j = 0; j < ndim_0; j++)
    {
      for (k = 0; k < ndim_1; k++)
      {
        var[i]+= pow(arr[j][k][i] - mean[i],2); //calculate variance
      }
    }
    var[i]/= (ndim_0 * ndim_1);
  }

  for (i = 0; i < ndim_2; i++)
  {
    for (j = 0; j < ndim_0; j++)
    {
      for (k = 0; k < ndim_1; k++)
      {
        arr[j][k][i] = (arr[j][k][i] - mean[i]) / (sqrt(var[i] + epsilon));  //normalization
      }
    }

  }

  for (i = 0; i < ndim_2; i++)
  {
    for (j = 0; j < ndim_0; j++)
    {
      for (k = 0; k < ndim_1; k++)
      {
        arr[j][k][i] = batnorm_gamma_0[i]* arr[j][k][i] +batnorm_beta_0[i];  
      }
    }

  }
}

соответствующий код тензорного потока

#X.shape=(1,512,1,16)
tf.layers.batch_normalization(X,axis=-1)

Размер гаммы и бета равен 16.

Результаты кода С и результаты тензорного потока были разными.
Что-то не так с кодом C?

...