为了完成MNIST分类,我们需要设计一个三层神经网络结构,如图所示。
三层神经网络结构28x28=784个特征值:
- 权重矩阵w1形状为784x64
- 偏移矩阵b1的形状为1x64
- 隐层1由64个神经元构成,其结果为1x64的矩阵
- 权重矩阵w2形状为64x16
- 偏移矩阵b2的形状是1x16
- 隐层2由16个神经元构成
- 权重矩阵w3的形状为16x10
- 输出层的偏移矩阵b3的形状是1x10
- 输出层有10个神经元使用Softmax函数进行分类
我们都是用大写符号的矩阵形式的公式来描述,在每个矩阵符号的右上角是其形状。
我们的约定是行为样本,列为一个样本的所有特征,这里是784个特征,因为图片高和宽是28x28,总共784个点,把每一个点的值做为特征向量。
两个隐层,分别定义64个神经元和16个神经元。第一个隐层用Sigmoid激活函数,第二个隐层用Tanh激活函数。
输出层10个神经元,再加上一个Softmax计算,最后有a1,a2,...a10十个输出,分别代表0-9的10个数字。
和以前的两层网络没有多大区别,只不过多了一层,而且用了tanh激活函数,目的是想把更多的梯度值回传,因为tanh函数比sigmoid函数稍微好一些,比如原点对称,零点梯度值大。
损失函数值和准确度值变化曲线如图。
训练过程中损失函数和准确度的变化打印输出部分:
...
epoch=38, total_iteration=16769
loss_train=0.012860, accuracy_train=1.000000
loss_valid=0.100281, accuracy_valid=0.969400
epoch=39, total_iteration=17199
loss_train=0.006867, accuracy_train=1.000000
loss_valid=0.098164, accuracy_valid=0.971000
time used: 25.697904109954834
testing...
0.9749
在测试集上得到的准确度为97.49%,比较理想。

