本文使用一个最简单的单隐层前馈网络实现手写数字识别,借助TensorFlow可以很容易地实现。
一、数据集
数据集使用MNIST,由数万张28像素×28像素的手写数字组成,这些图片只包含灰度值信息。其中包含训练集55000个样本,测试集10000个样本,以及验证集5000个样本。MNIST数据集可以在THE MNIST DATABASE下载,也可以使用下面的代码直接在python中导入:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
二、神经网络设计
将28×28的图片转换成向量,长度为784,因此神经网络的输入层有784个神经元;输出层显然需要10个神经元,因为输出的是0~9这10个数字;隐含层采用15个神经元。网络结构如下:
隐层的激活函数采用 sigmoid 函数,输出层的激活函数采用 softmax 函数。常用的激活函数及其选择方法见参考文献2和3。
损失函数为实际的label与概率归一化预测输出的交叉熵,具体采用 “tf.nn.softmax_cross_entropy_with_logits” 进行计算,其原理见参考文献4。</