前面两节,讲述了梯度下降和方向传播的原理,这里我通过mnist训练来讲述下python的实现方法

头文件

numpy用于矩阵运算,random用于数据集的shuffle,mnist_loader 用于加载数据集

import numpy as np
import random
import mnist_loader

初始化网络

其中参数是sizes 格式是[784,30,10] 代表每层神经元的个数,self.weights 格式[34*784],[10*34],self.biases格式是[34*1]和[10*1] 前者代表每两层神经元之间连线的权重,后者代表每个神经元上的偏向值。

    def __init__(self,sizes):self.layers = len(sizes)self.weights = [np.random.randn(x,y) for (x,y) in zip(sizes[1:],sizes[:-1])]self.biases = [np.random.randn(x,1) for x in sizes[1:]]

SGD

原理部分第二节已经说过了,我们来解读一下参数

train_data:我们输入的训练集可以抽象成[(x,y),(x1,y1)....(xn,yn)]

epoches:训练的轮数由我们自己指定

mini_size:每次随机抽样训练的训练样本数量

eta():表示learning rate 学习率,可以理解为步长

test_data:格式与train_data相同,用于测试(注意本实例中没有介绍验证集)

程序中先对数据全集进行shuffle打乱操作,之后按mini_size 进行分堆,下面分别对每个mini_batch 进行训练,也就是随机抽样的过程,这样做极大的加快了学习效率。

  def SGD(self,train_data,epoches,mini_size,eta,test_data):if test_data: n_test = len(test_data)n = len(train_data) #表示 训练样本数量for epoch in range(epoches):random.shuffle(train_data)mini_batches = [train_data[k:k+mini_size] for k in xrange(0,n,mini_size)] #xrange 返回的是生成器for mini_batch in mini_batches:self.update_minibatch(mini_batch,eta)if test_data:print "epoches {0} acc {1}/{2} ".format(epoch,self.cal_acc(test_data),n_test)else:print "no test data"

update_minibatch 主要完成的操作是,求出样本集中每个实例的偏导数累加求和,在根据下面的公式进行公式对weights和biases进行更新

    def update_minibatch(self,mini_batch,eta):nabla_b = [np.zeros(b.shape) for b in self.biases] #随机梯度下降算法,用于存储我们指定的minibatch中的数据的bias的总和nabla_w = [np.zeros(w.shape) for w in self.weights]for x,y in mini_batch:new_nabla_b ,new_nabla_w = self.back(x,y)nabla_w = [nw+w for nw,w in zip(new_nabla_w,nabla_w)]nabla_b = [nb+b for nb,b in zip(new_nabla_b,nabla_b)]self.weights = [w-((eta/len(mini_batch))*nabla_w) for w,nabla_w in zip(self.weights,nabla_w)]self.biases = [b-((eta/len(mini_batch))*nabla_b) for b,nabla_b in zip(self.biases,nabla_b)]

反向传播

梯度下降和反向传播的核心就是在于学习参数的偏导数计算,下图是反向传播求偏导数的过程。

1,首先初始化各层的参数为zero 和Pytorch 中optimizer.zero_grad() 操作大体相似,避免之前梯度的累加,用于存储各个层偏导数结果

        nabla_b = [np.zeros(b.shape) for b in self.biases] #随机梯度下降算法,用于存储我们指定的minibatch中的数据的bias的总和nabla_w = [np.zeros(w.shape) for w in self.weights]

2,z 在原始的公式中相当于 多个 的累加和,待激活的值, 第一层默认等于原始输入的图片数据的tensor值

            z = np.dot(w,activation)+b

activation=,都是和神经元的个数一致。

3,进行前向传播,计算所有的z和activation的值

 for w,b in zip(self.weights,self.biases):# print w.shape,b.shapez = np.dot(w,activation)+bzs.append(z)activation = sigmoid(z)activations.append(activation)

4,根据公式计算最后一层的error    

        delta = cost(activations[-1],y)*sigmoid_prime(zs[-1])

5,更新最后一层的bias和weight   ,其中,bias等于最后一层的error值,weight是最后一层的error值与前一层激活值的转置乘积

        nabla_b[-1] = delta#delta 目前可能是10*1 的向量,而activation[-2]可能是784*1 无法直接点乘 需要转置后者 最终是10个784维向量 内部相加输出 10*1nabla_w[-1] = np.dot(delta,activations[-2].transpose())

6,根据链式求导法则 ,反向更新各层的weight值与bias值 ,并最终以(nabla_w,nable_w)形式返回给随机梯度下降算法(update_mini_batch)的进行,全局weights和biases的更新

 for l in range(2,self.layers):delta = np.dot(self.weights[-l+1].transpose(),delta)*sigmoid_prime(zs[-l])nabla_b[-l] =deltanabla_w[-l] = np.dot(delta,activations[-l-1].transpose())return (nabla_b,nabla_w)

准确率计算

测试集是10000个(x,y),首先进行前向传播和softmax,获取最终预测的label值,并计算预测值与真实值的数量来计算准确率。

    def cal_acc(self,test_data):test_set = [(self.feedforward(x),y) for x,y in test_data]return np.sum(int(np.argmax(x))==y for (x,y) in test_set)def feedforward(self,x):for w,b in zip(self.weights,self.biases):x = np.dot(w,x)+bx = sigmoid(x)  #一定不能忘记激活

下面是工具方法,包含了的导数:

def sigmoid_prime(z):return sigmoid(z)*(1-sigmoid(z))

激活函数 

def sigmoid(z):return 1/(1+np.exp(-z))

源代码请移步     坚持一件事或许很难,但坚持下来一定很酷!^_^

深度学习(4)--手写数字mnist实现相关推荐

  1. Android TensorFlow Lite 深度学习识别手写数字mnist demo

    一. TensorFlow Lite TensorFlow Lite介绍.jpeg TensorFlow Lite特性.jpeg TensorFlow Lite使用.jpeg TensorFlow L ...

  2. 基于深度学习的手写数字识别、python实现

    基于深度学习的手写数字识别.python实现 一.what is 深度学习 二.加深层可以减少网络的参数数量 三.深度学习的手写数字识别 一.what is 深度学习 深度学习是加深了层的深度神经网络 ...

  3. 基于深度学习的手写数字识别Matlab实现

    基于深度学习的手写数字识别Matlab实现 1.网络设计 2. 训练方法 3.实验结果 4.实验结果分析 5.结论 1.网络设计 1.1 CNN(特征提取网络+分类网络) 随着深度学习的迅猛发展,其应 ...

  4. 03_深度学习实现手写数字识别(python)

    本次项目采用了多种模型进行测试,并尝试策略来提升模型的泛化能力,最终取得了99.67%的准确率,并采用pyqt5来制作可视化GUI界面进行呈现.具体代码已经开源. 代码详情见附录 1简介 早在1998 ...

  5. 【深度学习】手写数字识别Tensorflow2实验报告

    实验一:手写数字识别 一.实验目的 利用深度学习实现手写数字识别,当输入一张手写图片后,能够准确的识别出该图片中数字是几.输出内容是0.1.2.3.4.5.6.7.8.9的其中一个. 二.实验原理 ( ...

  6. 百度飞桨PaddelePaddle-21天零基础实践深度学习-【手写数字任务】2

    百度飞桨PaddelePaddle-21天零基础实践深度学习-[手写数字任务]2 模型设计 网络结构 损失函数 训练配置 优化算法 模型设计 网络结构 全连接神经网络 经典的全连接神经网络来包含四层网 ...

  7. 基于深度学习的手写数字识别算法Python实现

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  8. Python基于深度学习的手写数字识别

    Python基于深度学习的手写数字识别 1.代码的功能和运行方法 2. 网络设计 3.训练方法 4.实验结果分析 5.结论 1.代码的功能和运行方法 代码可以实现任意数字0-9的识别,只需要将图片载入 ...

  9. 深度学习数字仪表盘识别_深度学习之手写数字识别项目(Sequential方法amp;Class方法进阶版)...

    此项目使用LeNet模型针对手写数字进行分类.项目中我们分别采用了顺序式API和子类方法两种方式构建了LeNet模型训练mnist数据集,并编写了给图识物应用程序用于手写数字识别. 一.LeNet模型 ...

最新文章

  1. 电脑里面的微软的事件跟踪收集服务器,Windows 10 加入关机原因提醒功能,就是那个关闭事件跟踪...
  2. spark sql中的窗口函数
  3. HoloLens开发手记 - Unity之Tracking loss
  4. vue - cli 脚手架安装
  5. 在VirtualBox中安装BlackArch Linux
  6. 随着台积电上调代工费,芯片及电子设备价格上涨可能持续到明年
  7. 33 计算机维修,33.计算机硬件检测维修与数据恢复竞赛规程(修改)全解.doc
  8. 桌面恶心的无法删除的图标之 淘宝购物 删除办法
  9. 间距margin、padding - bootStrap4常用CSS笔记
  10. Linux设备驱动模型-Bus
  11. 部队室内靶场有哪些硬件设备和强制性存在的系统
  12. OpenCV空间人工智能竞赛:第一部分
  13. 怎么用磁盘压缩卷新建分区
  14. vue项目打包出错:Unexpected token arrow «=>», expected punc «,» [static/js/chunk-1558f5a0.b64bfa00.js:626,2
  15. 【11】FreeRTOS的延时函数
  16. 基于javaagent-ByteBuddy监控方法执行耗时
  17. 二叉树广度和深度遍历的全部算法
  18. [TIM] 微信登录TIM生产QQ号【并独立使用】
  19. 要求实现符号函数sign(x)。
  20. Pytest fixture实现测试用例前置后置操作

热门文章

  1. pandas 读取csv : ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte
  2. 树形结构—树和二叉树
  3. 网景大家还有印象吗?反正现在我有了!
  4. mysql history list_Mysql History list length 值太大引起的问题
  5. 重庆邮电大学和重庆大学计算机学院,重庆拥有的这所实力派大学,具有很高的知名度,对此你了解多少...
  6. 每天只要做好三件事就行了 积跬步以至千里
  7. [转]词根词缀记单词1-主讲victor老师
  8. 2023 一花卡密管理系统源码
  9. 2014/12/14实验室会议
  10. 水平集图像分割序列——Order LBF模型