我尝试在processing IDE中对神经网络进行编程。 我设法做得很好,直到尝试使用MNIST手写数字数据集。我尝试了iris data set和UCI 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;
}
我看不到代码有什么问题。
答案 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)没有多大意义。但是我可能错了。