【python】三层BP神经网络推导&MNIST&优化效果对比&损失函数对比

一、概述

本文的推导参见西瓜书P102~P103,代码参见该网址。主要实现了利用三层神经网络进行手写数字的识别。

二、理论推导

1、参数定义

三层神经网络只有一层隐藏层。参数如下:

x 输入层输入
v 输入层与隐藏层间的权值
α 隐藏层输入
b

                           隐藏层输出

                      w

隐藏层与输出层间的权值
\beta 输出层输入
\hat y 输出层输出

参数关系如下:

\alpha_h= \sum_{i=1}^{d}{v_{ih}x_i}

b_h=f(\alpha_h)

\beta_j=\sum^{q}_{h=1}{w_{hj}b_h}

\hat y=f(\beta_j)

上述等式中fx为激活函数。西瓜书默认激活函数为sigmoid,损失函数为均方根,本文以此为前提进行推导。

2、推导

设损失函数为E,则其公式如下:

E=\frac{1}{2}\sum^{l}_{j=1}({y_j-\hat y_j})^2

w_{hj}求偏导如下,这愚蠢的CSDN不支持多行公式编辑,所以只好手写了:

于是我们就得到了w_{hj}的更新公式:

\Delta w_{hj}=\eta(y_j-\hat y_j)\hat y_j(1-\hat y_j)b_h

同样的,对v_{ih}求偏导如下:

于是我们就得到了v_{ih}的更新公式:

\Delta v_{ih}=\eta x_i b_h(1-b_h)\sum^l_{j=1}((y_j-\hat y_j)\hat y_j(1-\hat y_j)w_{hj})

三、代码实现

优化方法选择SGD。

1、数据集初始化

MNIST数据集可以在TensorFlow中下载到:

import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("./MNIST_data/", one_hot=True)

mnist对象中就存储着所有的数据,其中,mnist.train.images为50000*784的二维array;储存着训练集的输入,每一行储存着784个像素;mnist.train.labels为50000*10的二维array;储存着训练集的标记,每一行中为1的列对应着该行的label。

2、初始化神经网络类

class NeuralNet:
    def __init__(self,InputNum,HiddenNum,OutputNum,LearnRate):
        self.InNum=InputNum#输入层节点数
        self.HiNum=HiddenNum#隐藏层节点数
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值