我正在尝试使用 Java 中的 MNIST 数据库,使用单层感知器进行手写识别。每个感知器被分配识别一个数字(所以 10 个感知器)。他们每个人都在 50,000 个样本中的每个样本上随机训练多个 epoch。测试时,选择率最高的感知器(即最有把握它是正确的感知器)。
使用这种方法,我始终获得 93.5% 的准确率。但是,我认为要改进,我需要添加隐藏层,并实施反向传播。当使用 Sigmoid(挤压)函数计算我的单层网络的前向传递时,它工作得非常好。但是,当我更改反向传递(学习)函数以匹配反向传播时,我得到了约 70% 的准确度。有人可以检查我的算法以确保这是正确的吗?
我从几个地方得到了算法,我认为它是一样的。例如这个:http ://www.webpages.ttu.edu/dleverin/neural_network/neural_networks.html
请注意,我将最后一个重量视为偏差。输入到学习函数中的“错误”只是期望结果减去实际结果。示例是与输入相同的数组 - 数字中每个像素的灰度。
Forward pass:
public final double apply( double[] input ) {
double ret = 0;
for (int i=0; i<wei.length-1; i++){
ret = ret + input[i]*wei[i];
}
ret+=wei[wei.length-1];
//apply squashing function
ret = 1/(1+Math.exp(-ret));
return ret;
}
Learning Function (backwards Pass)
public final void learn( double error, double result, double[] example, double alpha ) {
for (int i=0; i<wei.length-1; i++){
//wei[i] = wei[i] + alpha*error*example[i]; //This was original learning function - it gives 93.5% accuracy
wei[i]=wei[i]+ alpha* error * example[i]*result*(1-result); //This line gives ~70% accuracy
}
//wei[wei.length-1] += alpha*error; //this line works for bias
wei[wei.length-1]=wei[wei.length-1]+ alpha* error * 1*result*(1-result); //again, this makes results inaccurate
}