参考链接:https://www.codeproject.com/articles/16650/neural-network-for-recognition-of-handwritten-digi#Introduction

网络结构

Mnist的网络结构有5层:
(1)第一层为输入层,输入层的图片大小为29*29,也就是说,输入层的节点有841=29*29个;
(2)第二层为卷积层,卷积核的大小为5*5,每次偏移两个像素。所以第二层的特征图大小为13*13。这一层使用了6个不同的卷积核,所以有6个特征图。所以这一层的节点的个数为1014=13*13*6。权值的个数为156=(5*5+1)*6个,加1是因为有个偏移值。
(3)第三层的卷积层,卷积核大小5*5,每次偏移两个像素。所以第三层的特征图大小为5*5。这一层使用了50个不同的卷积核,所以有50个特征图。所以这一层的节点的个数为1250=5*5*50。权值的个数为7800=(5*5+1)*6*50个。
(4)第四层为全连接层,有100个节点,所以权值有125100=(1250+1)*100。
(5)第五层为全连接层,也是输出层,有10个节点,所以权值有1010=(100+1)*10。

参数更新推导

我们用n表示层数。对于某一层n,定义一些变量如下:
(1)$x_{n}$,这一层的输出;
(2)$y_{n}$,这一层的输入;
(3)$W_{n}^{ij}$,连接这一层的节点i和上一层的节点j的权值.
(4)$C_{n}$,这一层的节点数
另外
(1)定义激活函数为F。其中$y_{n}^{i}=\sum_{j=0}^{C_{n-1}}W_{n}^{ij}x_{n-1}^{j}$,j=0为偏移值,$x_{n}^{i}=F(y_{n}^{i})$。使用的激活函数为$F(y)=\frac{e^{y}-e^{-y}}{e^{y}+e^{-y}}$,其中$\frac{dF}{dy}=1-F(x)^{2}=1-x^{2}$。这里定义$G(x)=1-x^{2}$
(2)定义误差为$E$,GroundTrue为T,最后一层(我们这里就是第五层的输出)输出为$x_{n}$,$E=\frac{1}{2}\sum (x_{n}^{i}-T^{i})^{2}$。所以$\frac{\partial E}{\partial x_{n}^{i}}=x_{n}^{i}-T^{i}$。

现在假设我们知道了第n层的$\frac{\partial E}{\partial x_{n}^{i}}$.下面计算$\frac{\partial E}{\partial y_{n}^{i}}$.
$\frac{\partial E}{\partial y_{n}^{i}}=\frac{\partial E}{\partial x_{n}^{i}}\frac{\partial x_{n}^{i}}{\partial y_{n}^{i}}=\frac{\partial E}{\partial x_{n}^{i}}G(x_{n}^{i})$
接着计算$\frac{\partial E}{\partial W_{n}^{ij}}$
$\frac{\partial E}{\partial W_{n}^{ij}}=\frac{\partial E}{\partial y_{n}^{i}}\frac{\partial y_{n}^{i}}{\partial W_{n}^{ij}}=\frac{\partial E}{\partial y_{n}^{i}}x_{n-1}^{j}$
现在可以更新权值了:$(W_{n}^{ij})_{new}=(W_{n}^{ij})_{old}-LearningRate\cdot \frac{\partial E}{\partial W_{n}^{ij}}$。学习率$LearningRate$通常是一个很小的值。
现在计算$\frac{\partial E}{\partial x_{n-1}^{i}}$.
$\frac{\partial E}{\partial x_{n-1}^{i}}=\frac{\partial E}{\partial y_{n}}\frac{\partial y_{n}}{\partial x_{n-1}^{i}}=\sum_{k=1}^{C_{n}}W_{n}^{ki}\frac{\partial E}{\partial y_{n}^{k}}$
这样就能重新按照上面的式子计算$n-1$层了。

一直迭代这个过程,直到第一层。

CNN Mnist的更多相关文章

  1. Android+TensorFlow+CNN+MNIST 手写数字识别实现

    Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...

  2. keras—神经网络CNN—MNIST手写数字识别

    from keras.datasets import mnist from keras.utils import np_utils from plot_image_1 import plot_imag ...

  3. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  4. MachineLN博客目录

    MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...

  5. 【深度学习】Pytorch学习基础

    目录 pytorch学习 numpy & Torch Variable 激励函数 回归 区分类型 快速搭建法 模型的保存与提取 批训练 加速神经网络训练 Optimizer优化器 CNN MN ...

  6. 使用 Estimator 构建卷积神经网络

    来源于:https://tensorflow.google.cn/tutorials/estimators/cnn 强烈建议前往学习 tf.layers 模块提供一个可用于轻松构建神经网络的高级 AP ...

  7. Pytorch入门笔记

    import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): #nn. ...

  8. TensorFlow_action

    安装TensorFlow  包依赖 C:\Users\sas> pip3 install --upgrade tensorflow Collecting tensorflow Downloadi ...

  9. [Keras] mnist with cnn

    典型的卷积神经网络. Keras傻瓜式读取数据:自动下载,自动解压,自动加载. # X_train: array([[[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0. ...

随机推荐

  1. tfs分支操作

    1.在代码管理器中找到代码项 右击——分支与合并——分支——默认所有选项——确定. 2.可能刚打出的分支为红色,签入,修改代码,待测试后代码合并到主干中(下拉选出他的上级,一般为主干),删除分支. 3 ...

  2. [4]Windows内核情景分析---内核对象

    写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...

  3. 强化学习--DeepQnetwork 的一些改进

    Double DQN 算Q值 与选Q值是分开的,2个网络. Multi-step Dueling DQN 如果更新了,即使有的action没有被采样到,也会更新Q值 Prioritized Reply ...

  4. git分支流

    ## 新建一个iss1分支 $ git branch iss1 ## 切换到iss1分支 $ git checkout iss1 Switched to branch 'iss1' ## 查看分支,当 ...

  5. 大数据处理框架之Strom:kafka storm 整合

    storm 使用kafka做数据源,还可以使用文件.redis.jdbc.hive.HDFS.hbase.netty做数据源. 新建一个maven 工程: pom.xml <project xm ...

  6. Spring tokenizeToStringArray

    tokenizeToStringArray: StringUtils.tokenizeToStringArray(pattern, this.pathSeparator, this.trimToken ...

  7. Extjs4前端开发代码规范参考

    准则:  一致性, 隔离与统一管理, 螺旋式重构改进, 消除重复, 借鉴现有方案 1.    保证系统实现的一致性,寻求一致性方案, 相同或相似功能尽量用统一模式处理: 2.    尽可能使用隔离技术 ...

  8. Linux基础命令---ifdown、ifup

    ifup ifup指令用来启动网络接口设备,设备必须是定义在“/etc/sysconfig/network-scripts/ifcfg-ethX”或者“/etc/sysconfig/network”的 ...

  9. AURO OtoSys IM100 vs Lonsdor K518ISE: which better?

    Comparison: AURO OtoSys IM100 and Lonsdor K518ISE It’s aimed to help make a purchase of decent auto ...

  10. Linux:编译安装boost 1.69库

    Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发.维护.在C++的地位感觉可以和Spring在Java中相比. boost向来有准标准库之称,很多新特性例如智 ...