Artificial intelligence sigmoid感知器手写识别的学习算法
我正在尝试使用Java中的MNIST数据库,使用单层感知器进行手写识别。每个感知器被分配识别一个数字(因此10个感知器)。他们每个人都随机接受了50000个样本中的每个样本的训练,每个样本都有几个时代。测试时,选择速率最高的感知器(即最有信心正确的感知器) 使用此方法,我始终获得93.5%的准确率。然而,我认为为了改进,我需要添加隐藏层,并实现反向传播。当使用Sigmoid(squashing)函数计算单层网络的前向传递时,它工作得非常好。然而,当我改变我的向后传球(学习)功能以匹配向后传球时,我获得了约70%的准确率。有人能检查一下我的算法以确保这是正确的吗 我从几个地方得到了算法,我认为是一样的。例如,这个: 注意,我将最后一个重量视为偏差。输入学习函数的“错误”只是期望结果减去实际结果。示例是与输入相同的数组-数字中每个像素的灰度Artificial intelligence sigmoid感知器手写识别的学习算法,artificial-intelligence,perceptron,handwriting,Artificial Intelligence,Perceptron,Handwriting,我正在尝试使用Java中的MNIST数据库,使用单层感知器进行手写识别。每个感知器被分配识别一个数字(因此10个感知器)。他们每个人都随机接受了50000个样本中的每个样本的训练,每个样本都有几个时代。测试时,选择速率最高的感知器(即最有信心正确的感知器) 使用此方法,我始终获得93.5%的准确率。然而,我认为为了改进,我需要添加隐藏层,并实现反向传播。当使用Sigmoid(squashing)函数计算单层网络的前向传递时,它工作得非常好。然而,当我改变我的向后传球(学习)功能以匹配向后传球时,
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
}
向前传球:
公共最终双应用(双[]输入){
双ret=0;
对于(int i=0;i我今天上午在这里得到了关于算法和实现的最好解释。它用C#解释了用于字符识别的感知器源代码