深度学习二:自己写java代码,识别手写数字
2017-06-27 15:21
483 查看
上一节我们自己写代码训练了只有一个神经元的反相器,它虽然只有一点点代码,但却让我们加深了梯度下降算法和反向传播算法的理解。只要勇敢的迈出这一步后,我们就可以勇敢的尝试它:深度学习中的hello wold–识别手写数字。
只有自己写过的代码,才能完全的理解它的用意,不管它多烂,多糟糕,它确是完全属于你的东西。在训练处反相器以后,我开始大胆的尝试自己写一个全连接的神经网络,来训练手写数字。这并不难,也不需要多少代码,我大概花了半天的时间就写完了所有的代码,你也不妨来试试…
你也可以到这里下载源码:
mnist-java
代码结构如下:
可以看到,我的思路是这样的:
神经网络(NerualNetwork)由层(Layer)构成,层(Layer)由神经元构成(Nerve)。这种思路非常直观,但它似乎并不是很好的设计,因为代码显得比较繁琐。希望你能设计出更好的结构,或许取消Nerve对象,所有逻辑都放在Layer中更好,这样会大量用到二维数组…
代码的思路非常简单:
1、load mnist
装在mnist的代码我是从网上找到的,我不知道怎么写,非常感谢牛人的分享。
2、构建神经网络
这里构建了一个四层的神经网络
第一层有784个神经元,对应784个像素,中间有两个隐藏层,输出层有10个神经元,对应0~9 共10个数字。
2、训练
2-1 设置输入
2-1 计算输出
2-2 反向传播计算误差
2-3 跟新权重和偏置
反复重复2中的四步,实现对神经网络的训练。训练完成后,进行测试:
测试只需要计算输出,然后比对输出是否正确即可。
经过训练以后,这个神经网络的能正确识别6945个数字,总共是10000个,因此准确率接近70%。对深度学习而言,这并不是值得兴奋的结果,但是,也有值得兴奋的地方。想想,如果不经过训练,我们的神经网络识别的准确率应该是随机的,应该在10%左右,这意味着,我们的神经网络会学习了,虽然它还不够聪明,考试的成绩还不够好,但他似乎已经找到了方向,他变得可以教育了,这让我对他的未来充满期待…
我最近重写的卷积神经网络CupCnn准确率已经能达到97.79%了,CupCnn也是用java写的,但是代码更规范,更加模块化,以下是CupCnn在github上的地址,欢迎大家下载:
CupCnn
更多详情请参考我的博文:
java写卷积神经网络—CupCnn简介
只有自己写过的代码,才能完全的理解它的用意,不管它多烂,多糟糕,它确是完全属于你的东西。在训练处反相器以后,我开始大胆的尝试自己写一个全连接的神经网络,来训练手写数字。这并不难,也不需要多少代码,我大概花了半天的时间就写完了所有的代码,你也不妨来试试…
你也可以到这里下载源码:
mnist-java
代码结构如下:
可以看到,我的思路是这样的:
神经网络(NerualNetwork)由层(Layer)构成,层(Layer)由神经元构成(Nerve)。这种思路非常直观,但它似乎并不是很好的设计,因为代码显得比较繁琐。希望你能设计出更好的结构,或许取消Nerve对象,所有逻辑都放在Layer中更好,这样会大量用到二维数组…
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class DeepLearn3Test { static List<DigitImage> trains = null ; static List<DigitImage> tests = null; public static void main(String[] args) { //load mnist ReadFile rf1=new ReadFile("train-labels.idx1-ubyte","train-images.idx3-ubyte"); ReadFile rf2=new ReadFile("t10k-labels.idx1-ubyte","t10k-images.idx3-ubyte"); try { tests = rf2.loadDigitImages(); trains =rf1.loadDigitImages(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } int size[]={784,40,20,10}; NeuralNetwork network = new NeuralNetwork(size); network.radomInitWandB(); double image[] = new double[784]; for(int kk=0;kk<10;kk++){ //first: set input for(int count=0;count<trains.size();count++){ for(int i=0;i<784;i++){ image[i] = (int)(trains.get(count).imageData[i]&0xff); } network.setInput(image); //second: forward cal output double[] output = network.forwardProc(); //third: backward cal delta double[] y = new double[10]; for(int i=0;i<y.length;i++){ if(i==trains.get(count).label){ y[i] = 1; }else{ y[i] = 0; } } network.backwarkProc(y); //fouth: update w and b network.updateWAndB(0.5); } System.out.println("finished train count: "+kk); } boolean isTest = true; //test if(isTest){ int countCorrect=0; for(int count=0;count<tests.size();count++){ for(int i=0;i<784;i++){ image[i] = (int)(tests.get(count).imageData[i]&0xff); } network.setInput(image); //second: forward cal output int number = network.testDigitalImage(); if(number==tests.get(count).label)countCorrect++; //System.out.println("count is : "+count+" number is: "+number+" label is: "+tests.get(count).label); } System.out.println("countCorrect: "+countCorrect); } } }
代码的思路非常简单:
1、load mnist
装在mnist的代码我是从网上找到的,我不知道怎么写,非常感谢牛人的分享。
2、构建神经网络
这里构建了一个四层的神经网络
int size[]={784,40,20,10};
第一层有784个神经元,对应784个像素,中间有两个隐藏层,输出层有10个神经元,对应0~9 共10个数字。
2、训练
2-1 设置输入
network.setInput(image);
2-1 计算输出
double[] output = network.forwardProc();
2-2 反向传播计算误差
network.backwarkProc(y);
2-3 跟新权重和偏置
network.updateWAndB(0.5);
反复重复2中的四步,实现对神经网络的训练。训练完成后,进行测试:
测试只需要计算输出,然后比对输出是否正确即可。
经过训练以后,这个神经网络的能正确识别6945个数字,总共是10000个,因此准确率接近70%。对深度学习而言,这并不是值得兴奋的结果,但是,也有值得兴奋的地方。想想,如果不经过训练,我们的神经网络识别的准确率应该是随机的,应该在10%左右,这意味着,我们的神经网络会学习了,虽然它还不够聪明,考试的成绩还不够好,但他似乎已经找到了方向,他变得可以教育了,这让我对他的未来充满期待…
我最近重写的卷积神经网络CupCnn准确率已经能达到97.79%了,CupCnn也是用java写的,但是代码更规范,更加模块化,以下是CupCnn在github上的地址,欢迎大家下载:
CupCnn
更多详情请参考我的博文:
java写卷积神经网络—CupCnn简介
相关文章推荐
- 【深度学习】笔记2_caffe自带的第一个例子,Mnist手写数字识别代码,过程,网络详解
- 深度学习- 用Torch实现MNIST手写数字识别
- 深度学习框架Caffe学习笔记(2)-MNIST手写数字识别例程
- 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 02:一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 (zz)
- 【深度学习】笔记3_caffe自带的第一个例子,Mnist手写数字识别所使用的LeNet网络模型的详细解释
- 深度学习框架Caffe学习笔记(6)-测试自己的手写数字图片
- 深度学习笔记5torch实现mnist手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别