简单的神经网络算法-手写数字识别

本文通过BP神经网络实现一个简单的手写识别系统。

一、基础知识

1环境

python2.7

需要numpy等库

可利用sudo apt-get install python-安装

2神经网络原理

http://www.hankcs.com/ml/back-propagation-neural-network.html

讲的特别清楚,本实验过程中涉及矩阵运算都用numpy库的函数

3.js的基础知识

http://www.w3school.com.cn/tags/html_ref_canvas.asp

canvas的基础知识

http://blog.csdn.net/iamduoluo/article/details/7215639

xmlhttp的介绍

4.BaseHTTPServer库和numpy的使用

二、重要过程

1、如何将手写的图像转化为数据?

将画布分成网格,计算鼠标按下移动的路线经过的方格,例如将画布分为20*20格,则可以构建data[400]的数组,鼠标经过的data[i]=1,可以得到数据输入

drawGrid: function(ctx) {
        for (var x = this.PIXEL_WIDTH, y = this.PIXEL_WIDTH; x < this.CANVAS_WIDTH; x += this.PIXEL_WIDTH, y += this.PIXEL_WIDTH) {
            ctx.strokeStyle = this.BLUE;  //设置颜色
            ctx.beginPath();    
            ctx.moveTo(x, 0);   //把焦点移到(x,0)
            ctx.lineTo(x, this.CANVAS_WIDTH);   //画线(x,0)到(x,canvas_width)
            ctx.stroke();    //提交画线

ctx.beginPath();
            ctx.moveTo(0, y);
            ctx.lineTo(this.CANVAS_WIDTH, y);
            ctx.stroke();
        }
    },

onMouseMove: function(e, ctx, canvas) {
        if (!canvas.isDrawing) {
            return;
        }
        this.fillSquare(ctx, e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);   //e.clientX是浏览器边缘与鼠标点的x距离,offsetleft是画布边与左侧浏览器边缘的距离
    },

onMouseDown: function(e, ctx, canvas) {
        canvas.isDrawing = true;
        this.fillSquare(ctx, e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
    },

onMouseUp: function(e) {
        canvas.isDrawing = false;
    },

fillSquare: function(ctx, x, y) {
        var xPixel = Math.floor(x / this.PIXEL_WIDTH);   //就算坐标
        var yPixel = Math.floor(y / this.PIXEL_WIDTH);
        //存储手写输入数据
        this.data[((xPixel-1)  * this.TRANSLATED_WIDTH + yPixel)-1] = 1;

ctx.fillStyle = ‘#ffffff‘;
        ctx.fillRect(xPixel * this.PIXEL_WIDTH, yPixel * this.PIXEL_WIDTH, this.PIXEL_WIDTH, this.PIXEL_WIDTH); //正方形填充颜色
    },

2、浏览器与客户端的交互

主要通过json 数据交互

sendData: function(json) {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open(‘POST‘, this.HOST + ":" + this.PORT, false);
        xmlHttp.onload = function() { this.receiveResponse(xmlHttp); }.bind(this);
        xmlHttp.onerror = function() { this.onError(xmlHttp) }.bind(this);
        var msg = JSON.stringify(json);   //序列化为json
        xmlHttp.setRequestHeader(‘Content-length‘, msg.length);   //参考给的链接最上
        xmlHttp.setRequestHeader("Connection", "close");
        xmlHttp.send(msg);
    }

服务器

class JSONHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    """处理接收到的POST请求"""
    def do_POST(self):
        response_code = 200
        response = ""
        var_len = int(self.headers.get(‘Content-Length‘))
        content = self.rfile.read(var_len);
        payload = json.loads(content);

# 如果是训练请求,训练然后保存训练完的神经网络
        if payload.get(‘train‘):
            #print payload[‘trainArray‘]
            nn.train(payload[‘trainArray‘],2)
            nn.save()
        # 如果是预测请求,返回预测值
        elif payload.get(‘predict‘):
            try:
                print nn.predict(data_matrix[0])
                response = {"type":"test", "result":str(nn.predict(payload[‘image‘]))}
            except:
                response_code = 500
        else:
            response_code = 400

self.send_response(response_code)
        self.send_header("Content-type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.end_headers()
        if response:
            self.wfile.write(json.dumps(response))
        return
3、神经网络的实现

参考500 lines or less

后向传播算法步骤

  • 随机初始化参数,对输入利用前向传播计算输出。
  • 对每个输出节点按照下式计算delta:
  • 对每个隐藏节点按照下式计算delta:
  • 计算梯度,并更新权值参数和偏置参数:。这里的是学习率,影响训练速度。

# 前向传播得到结果向量
                y1 = np.dot(np.mat(self.theta1), np.mat(data.y0).T)
                sum1 =  y1 + np.mat(self.input_layer_bias)
                y1 = self.sigmoid(sum1)

y2 = np.dot(np.array(self.theta2), y1)
                y2 = np.add(y2, self.hidden_layer_bias)
                y2 = self.sigmoid(y2)

# 后向传播得到误差向量
                actual_vals = [0] * 10
                actual_vals[data.label] = 1
                output_errors = np.mat(actual_vals).T - np.mat(y2)
                hidden_errors = np.multiply(np.dot(np.mat(self.theta2).T, output_errors), self.sigmoid_prime(sum1))  //multiply函数用法,可以简单看为对应相乘

# 更新权重矩阵与偏置向量
                self.theta1 += self.LEARNING_RATE * np.dot(np.mat(hidden_errors), np.mat(data.y0))
                self.theta2 += self.LEARNING_RATE * np.dot(np.mat(output_errors), np.mat(y1).T)
                self.hidden_layer_bias += self.LEARNING_RATE * output_errors
                self.input_layer_bias += self.LEARNING_RATE * hidden_errors

先写这么多

神经网络中的实现采取了简化的方法,实验效果一般,不过也是一次有趣的实验,下次有待更新神经网络的另一种完全实现。

时间: 2024-09-27 03:21:39

简单的神经网络算法-手写数字识别的相关文章

第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器      感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695      感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1.这种算法的局限性很大: 只能将数据分为 2 类 数据必须是线性可分的 虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的. 感知器可以表示为

神经网络用于手写数字识别

一:人工神经网络 人类之所以能够思考,学习,判断,大部分都要归功于人脑中复杂的神经网络.虽然现在人脑的机理还没有完全破译,但是人脑中神经元之间的连接,信息的传递都已为人所知晓.于是人们就想能否模拟人脑的功能用于解决其他问题,这就发展出人工神经网络. 人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统

BP神经网络(手写数字识别)

1实验环境 实验环境:CPU [email protected],内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的.测试数据有10000条.另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹.这里选取.mat格式的数据

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,

基于BP神经网络的手写数字识别

一.BP神经网络原理及结构 本部分先介绍神经网络基本单元神经元的结构和作用,再主要介绍BP神经网络的结构和原理. 1.神经元 神经元作为神经网络的基本单元,对于外界输入具有简单的反应能力,在数学上表征为简单的函数映射.如下图是一个神经元的基本结构,  神经元结构 图中是神经元的输入,是神经元输入的权重,是神经元的激活函数,y是神经元的输出,其函数映射关系为 激活函数来描述层与层输出之间的关系,从而模拟各层神经元之间的交互反应.激活函数必须满足处处可导的条件.常用的神经元函数有四种,分别是线性函数

TensorFlow(九):卷积神经网络实现手写数字识别以及可视化

上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data',one_hot=True) #每个批次的大小 batch_size = 100 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #参数概要 def vari

Andrew Ng 机器学习课程笔记 ———— 通过初步的神经网络实现手写数字的识别(尽力去向量化实现)

上一篇我总结了自己在学完逻辑回归后,实现了对手写数字的初步识别 , 在学完了Andrew教授的神经网络简易教程后,趁着知识刚学完没多久,记下了自己在运用简易神经网络实现手写数字识别过程中的总结和问题 ^_^  菜鸡QP的第二篇学习笔记 ~ 错误在所难免 ,希望自己可以通过一篇篇菜鸡的笔记心得 ,取得一点点的进步 ~\(≧▽≦)/~    ) 依旧是给定 5000个20 * 20像素点的手写数字图片 ,与前几天自己完成的逻辑回归完成任务不同 ,这次自己终于要用到极富魅力的神经网络啦(虽然只是最基础

C#中调用Matlab人工神经网络算法实现手写数字识别

手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写阿拉伯数字识别是图像内容识别中较为简单的一个应用领域,原因有被识别的模式数较少(只有0到9,10个阿拉伯数字).阿拉伯数字笔画少并且简单等.手写阿拉伯数字的识别采用的方法相对于人脸识别.汉字识别等应用领域来说可以采用更为灵活的方法,例如基于规则的方法.基于有限状态自动机的方法.基于统计的方法和基于神

使用AI算法进行手写数字识别

人工智能 ??人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展.由于人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广 . 人工智能的核心问题包括建构能够跟人类似甚至超越人类的推理.知识.学习.交流.感知.使用工具和操控机械的能力等,当前人工智能已经有了初步成果,甚至在一些影像识别.语言分析.棋类游戏等等单方面的能力达到了超越