神经网络改变损失函数

问题描述

我有一段使用均方误差训练简单网络的代码。 我现在想使用另一个损失函数,例如我想使用平均绝对误差。 我应该如何更改 TrainNet 函数以使用平均绝对误差作为损失函数

double input[IN]; // input
double hidden[HID]; // layer hidden
double output[OUT]; // output

double weightH[HID][IN]; // weights layer hidden
double biasesH[HID]; // biases layer hidden
double weightO[OUT][HID]; // weights output
double biasesO[OUT]; // biases output

void NetworkResult(double inp1,double inp2)
{
   // load the inputs
   input[0]=inp1;
   input[1]=inp2;
   // compute hidden layer
   for (int i=0;i<HID;i++)
   {
      hidden[i]=biasesH[i];
      for (int j=0;j<IN;j++)
         hidden[i] += input[j]*weightH[i][j];
      hidden[i]=Activation(hidden[i]);
   }
   // compute output
   for (int i=0;i<OUT;i++)
   {
      output[i]=biasesO[i];
      for (int j=0;j<HID;j++)
         output[i] += hidden[j]*weightO[i][j];
      output[i]=Activation(output[i]);
   }
}

void TrainNet(double inp1,double inp2,double result)
{
   NetworkResult(inp1,inp2);
   double DeltaO[OUT];
   double DeltaH[HID];
   // layer output
   // Use MSE as loss function
   double err= result-output[0];
   DeltaO[0]=err*Derivative(output[0]);
   // layer hidden
   for (int i=0;i<HID;i++)
   {
      double err=0;
      for (int j=0;j<OUT;j++)
         err+= DeltaO[j]*weightO[j][i];
      DeltaH[i]=err*Derivative(hidden[i]);
   }
   // change weights
   // layer output
   for (int i=0;i<OUT;i++)
   {
      for (int j=0;j<HID;j++)
         weightO[i][j]+=LEARNINGRATE*DeltaO[i]*hidden[j];
      biasesO[i]+=LEARNINGRATE*DeltaO[i];
   }
   // layer hidden
   for (int i=0;i<HID;i++)
   {
      for (int j=0;j<IN;j++)
         weightH[i][j]+=LEARNINGRATE*DeltaH[i]*input[j];
      biasesH[i]+=LEARNINGRATE*DeltaH[i];
   }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)