ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python手写体数字识别,数学公式和程序对应详解

2020-02-29 12:06:25  阅读:458  来源: 互联网

标签:数学公式 layer deltas Python self np bias weights 手写体


Python手写体数字识别,数学公式和程序对应详解

一、数学推导过程

特别详细的数学推导过程,简单易懂。

二程序代码

特别好的程序结构,值得学习

三、代码和公式对应
大家一定要先自己看看数学推导过程,代码都可以不看。但是推导过程一定得看。
1.BP算法四个核心公式
BP神经网络核心公式

参数列表

x = np.array(x)
y = np.array(y)
weights = []	# 权重列表
bias = []	# 偏置列表

其中x为输入变量,y为输出变量
xy
x为33555个样本值,一个x有784个变量相当于[x1,x2,x3,…,x784]
y也为33555个样本值,一个y有一个输出对应于0-9中的一个数字
weights为权重,bias为偏置
类似于 y = ax+b ,a相当于weight,bias相当于b。
weights
bias
weights为权重,从上面的图片中看出有2 elements,分别对应第一层(输入层)->第二层(隐藏层),第二层(隐藏层)->第三层(输出层),由此可知这是一个具有三层感知层的神经网络。
注:weight,bias,都是随机初始化的。例如

layers = [784,784,10]
for i in range(1, len(layers)):	# 正态分布初始化
     self.weights.append(np.random.randn(layers[i-1], layers[i]))
     self.bias.append(np.random.randn(layers[i]))

三层感知层神经网络
激活函数

def sigmoid(x): # 激活函数采用Sigmoid
    return 1 / (1 + np.exp(-x))


def sigmoid_derivative(x):	# Sigmoid的导数
    return sigmoid(x) * (1 - sigmoid(x))

一、反向传播算法

a = [x[k % n]]	# 保存各层激活值的列表

a代表神经元的输出,对于第一层输入层对应的就是神经元输出就是x样本值
先将输入值赋予第一个
正向传播开始

for lay in range(len(self.weights)):
    a.append(self.activation(np.dot(a[lay], self.weights[lay]) + self.bias[lay]))

其中activation是激活函数,上述代码循环意思是将每一层的神经元的输出乘以对应的权重加上偏置。通过激活函数得到的值
在这里插入图片描述
反向传播开始

label = np.zeros(a[-1].shape)#shape得到a[-1]的维度
label[y[k % n]] = 1	# 根据类号生成标签
error = label - a[-1]	# 误差值
#a[-1]从后往前第一组数据
deltas = [error * self.activation_deriv(a[-1])]	# 保存各层误差值的列表

在这里插入图片描述

layer_num = len(a) - 2	# 导数第二层开始
for j in range(layer_num, 0, -1):
        deltas.append(deltas[-1].dot(self.weights[j].T) * self.activation_deriv(a[j]))	# 误差的反向传播
deltas.reverse()

for迭代里的-1意思是逆序向回推导deltas,这个正是反向推导的重点所在。
正向更新权值

for i in range(len(self.weights)):	# 正向更新权值
     layer = np.atleast_2d(a[i])
     delta = np.atleast_2d(deltas[i])
     self.weights[i] += learning_rate * layer.T.dot(delta)
      self.bias[i] += learning_rate * deltas[i]

在这里插入图片描述
代码中

     self.weights[i] += learning_rate * layer.T.dot(delta)
     self.bias[i] += learning_rate * deltas[i]

对应了参数求解,其中layer.T指的是layer的矩阵转至

结束

到此为止基本就介绍完程序和公式的对应方面,如果有理解错的地方请大佬指点一二。
最后感谢提供公式推导和写代码的大佬们。

qq_40531588 发布了3 篇原创文章 · 获赞 1 · 访问量 1985 私信 关注

标签:数学公式,layer,deltas,Python,self,np,bias,weights,手写体
来源: https://blog.csdn.net/qq_40531588/article/details/104570259

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有