在处理3环境中如何为神经网络实现Softmax功能?

时间:2018-07-03 19:04:05

标签: neural-network deep-learning

我尝试在processing IDE中对神经网络进行编程。 我设法做得很好,直到尝试使用MNIST手写数字数据集。我尝试了iris data setUCI machine learning repository中的其他几个尝试,但是当我使用MNIST数据集时,它不起作用。由于某种原因,所有输出随时间趋近于零,并且导致总误差始终等于1。我几乎可以确定我的问题是激活函数。所以我尝试使用softmax进行分类,但是效果不是很好。我得到了相同的结果。我认为也许应该使用其他损失函数,所以我根据this视频尝试了负对数概率。现在,对于每个输出神经元,结果都是相同的成本值,并且输出的总和不应该为1。 这是我已更改的代码各部分的功能(我不愿共享完整的代码,因为它又长又混乱,并且没有太大帮助):

softmax:

float[] softmax(float[] inputVector){
  float[] result = new float[inputVector.length];
  float sigma = 0;
  for(int i = 0; i < inputVector.length; i++){
    sigma += exp(inputVector[i]);
  }
  for(int i = 0; i < result.length; i++){
    result[i] = exp(inputVector[i]) / sigma;
  }
  return result;
}

softmax的衍生物:

float[] derivativeSoftmax(float[] inputVector){
  float[] result = new float[inputVector.length];
  for(int i = 0; i < result.length; i++){
    result[i] = softmax(inputVector)[i] * (1 - softmax(inputVector)[i]);
  }
  return result;
}

损失函数:

for(int i = 0; i < outputNeuronsNumber; i++){
  float tempSigma = 0;
  for(int j = 0; j < outputNeuronsNumber; j++){
    tempSigma += target[diffCounter2] * log(outputLayer[j]);
  }
  cost[i] = -tempSigma;
}

我看不到代码有什么问题。

1 个答案:

答案 0 :(得分:0)

float[] derivativeSoftmax(float[] inputVector){
  float[] result = new float[inputVector.length];
  for(int i = 0; i < result.length; i++){
    result[i] = softmax(inputVector)[i] * (1 - softmax(inputVector)[i]);
  }
  return result;
}

考虑到softmax as defined on wikipedia的派生性,我认为这是错误的。

float[] derivativeSoftmax(float[] inputVector, int k){
  float[] result = new float[inputVector.length];
  for(int i = 0; i < result.length; i++){
    result[i] = softmax(inputVector)[i] * ((i==k ? 1 : 0) - softmax(inputVector)[k]);
  }
  return result;
}

您应该相对于其他某个索引采用导数。拥有的等式x *(1-x)没有多大意义。但是我可能错了。