Recebendo NaN de uma multiplicação de double

 

Olá a todos, espero que estejam todos bem!

Antes de tudo, obrigado pelo tempo lendo o meu tópico, espero que possa ajudar!


O bug é muito o simples, estou recebendo:

-(nan)

após uma série de multiplicação de double. Segue alguns detalhes que percebi:

  • No backtest, o bug nunca acontece, apenas em conta live (real ou demo)
  • No modo debug da conta live, o bug também não acontece
  • Dependendo do PC que uso, o bug acontece ou não acontece


Agora, vamos ao código, é um algorítimo simples de propagação de uma rede neural:

const ushort layersArrayRef[] = { 120,32,2 };
   //'layersArrayRef' é um pequeno const array que mantem os valores do tamanho da última dimensão do array 'layers' para a primeira dimensão
const ushort numLayers = 2;
   //'numLayers' mantém o valor de ArraySize(layersArrayRef)-1
const ushort maxWeights = 120;
   //'maxWeights' representa o maior número de elementos da última camada de 'layers'

//+------------------------------------------------------------------+
void feedFoward(const double &inputs[], double &result[], const double &layers[][120][121])
  {
      //'layers' é uma array de 3 dimension array que contem todos valores do input a serem multiplicados, se você está familiarizado com redes neurais, esses são os pesos
      //Nenhum desses pesos tem o valor de NaN, são todos valore double, abaixo, peguei uma amostra para saberem o que esperar:
      //{-0.2777355450744791,-0.7567252900916879,0.6602865137730505,-0.2598532455377704,-0.7134906462589329,0.1609123375956665,0.3382764091756482,0.1060638487098541,0.1298993085141322}
      //'layers' é um grande array definido no escopo global, para mostrar todos os valores de pesos, levaria muitas linhas para mostrar aqui, então, aqui está a declaração que lhe dá uma boa idéia do que esperar
      //const double layers[2][120][121] ={{{...}}}
   
   if((ushort)ArraySize(inputs)!=layersArrayRef[0])
     {
      Print("Not enough inputs.");
      return;
     }
   if((ushort)ArraySize(result)!=layersArrayRef[numLayers])
     {
      Print("Result size wrong.");
      return;
     }

   double inLayer[];
   ArrayResize(inLayer,maxWeights);

   for(int i=0; i<layersArrayRef[0]; i++)
     {
      inLayer[i]=inputs[i];
     }

   for(ushort l=0; l<numLayers; l++)
     {
      double outLayer[];
      ArrayResize(outLayer,layersArrayRef[l+1]);

      for(ushort n=0; n<layersArrayRef[l+1]; n++)
        {
         outLayer[n]=layers[l][n][0];//esse é o bias, para que saber como redes neurais funcionam
         for(ushort w=0; w<layersArrayRef[l]; w++)
           {
            outLayer[n]+= inLayer[w]*layers[l][n][w+1];//essa é a multiplicação dos pesos que em algum momento resulta em NaN
           }
        }

      for(ushort n=0; n<layersArrayRef[l+1]; n++)
        {
         if(MathClassify(MathAbs(outLayer[n]))==FP_NAN)
           {
            Print("Exception instable calculations!");//Aqui, é onde identifico o bug
            ExpertRemove();
           }

         inLayer[n] = 1/(1+MathExp(outLayer[n])); //função de aticação
        }
     }

   for(ushort n=0; n<layersArrayRef[numLayers]; n++)
     {
      result[n]=inLayer[n];
     }
  }


Obrigado a todos pelo seu tempo!

Se você tiver dúvidas ou alguma ideia do que possa ser, terei o prazer de  verificar qualquer coisa que possa me ajudar a resolver esse bug :-)

 
bhjks_:

Olá a todos, espero que estejam todos bem!

Antes de tudo, obrigado pelo tempo lendo o meu tópico, espero que possa ajudar!


O bug é muito o simples, estou recebendo:

após uma série de multiplicação de double. Segue alguns detalhes que percebi:

  • No backtest, o bug nunca acontece, apenas em conta live (real ou demo)
  • No modo debug da conta live, o bug também não acontece
  • Dependendo do PC que uso, o bug acontece ou não acontece


Agora, vamos ao código, é um algorítimo simples de propagação de uma rede neural:


Obrigado a todos pelo seu tempo!

Se você tiver dúvidas ou alguma ideia do que possa ser, terei o prazer de  verificar qualquer coisa que possa me ajudar a resolver esse bug :-)

já experimentou usar ArrayPrint() no vetor?

 
Flavio Jarabeck:

já experimentou usar ArrayPrint() no vetor?

vou faze-lo de modo que para cada 'l' em

for(ushort l=0; l<numLayers; l++)
     

ele grave os valores do 'inLayer' em um .txt, após isso, vou verificar a partir de que momento surge os NaN e mostrar os resultados aqui

 
Flavio Jarabeck:

já experimentou usar ArrayPrint() no vetor?

Muito obrigado, Flávio, com uma análise dos dados gerados no ArrayPrint(), cheguei a conclusão que estava enviando -nan como entradas da rede.

Razão: