在上篇我们介绍了tensorflow搭建全连接神经网络的基本原理,接下来开始用python实现在线推理、训练模型、在UI界面上实现预测识别。代码清单为:
mnist_inference.py、mnist_train.py、NumReco.py、simpleUi.py
本节介绍mnist_inference.py。实现前向传播相关函数(即在线推断)
(一)定义神经网络节点数
本次只用了一个500个节点的隐藏层、一个784节点的输入层、一个10节点(代表10个数字)的输出层
#定义数据集相关常数
INPUT_NODE = 784 #输入层的节点数,一个手写字符对应的像素矩阵大小
OUTPUT_NODE = 10 #输出层的节点数。因为是分类问题,所以是十个数字输出节点
#配置神经网络的参数
LAYER1_NODE = 500 #隐藏层的节点数,只用一个有500个节点的隐藏层。
(二)定义函数返回权重参数
get_variable()函数:第一个参数为变量名;第二个参数为变量大小,如[784,500];第三个参数为初始化变量方式,这里tf.truncated_normal_initializer(stddev=0.1))代表标准差为0.1的正态分布随机数。
regularizer传入的是正则化方式,如果有值的话,就把正则化后的变量加入集合“losses”。
正则化能去掉网络中无关紧要的值,防止过拟合。详细正则化的解释可以参照这篇博文:
https://blog.youkuaiyun.com/jinping_shi/article/details/52433975?utm_source=blogxgwz1
def get_weights_variable(shape,regularizer):
weights = tf.get_variable("weights",shape,
initializer=tf.truncated_normal_initializer(stddev=0.1))
if regularizer != None :
tf.add_to_collection('losses',regularizer(weights))
return weights
(三)前向传播
函数输入:input_sensor(输入量),regularizer(正则化方式)
tf.variable_scope(),是作用域,在调用get_variable初始化变量时,如果重新调用,则又会重新初始化该变量。所以利用限制作用域的方式来隔离每一层的参数。
实现的运算公式为:
layer1 = relu(input_sensor*weights1 + biases1 )
layer2 = layer1*weights2 + baises2
这里使用的激励函数为relu,具有去线性化的作用
其中layer2为输出量,注意layer2即输出层运算时没有加激励函数
def inference(input_sensor,regularizer):
with tf.variable_scope('layer1'):
weights = get_weights_variable([INPUT_NODE,LAYER1_NODE],regularizer)
biases = tf.get_variable("biases",[LAYER1_NODE],
initializer=tf.constant_initializer(0.0))
layer1 = tf.nn.relu(tf.matmul(input_sensor,weights)+biases)
with tf.variable_scope('layer2'):
weights = get_weights_variable([LAYER1_NODE,OUTPUT_NODE],regularizer)
biases = tf.get_variable("biases",[OUTPUT_NODE],
initializer=tf.constant_initializer(0.0))
layer2 = tf.matmul(layer1,weights)+biases
return layer2
前向传播的算法到此为止,我们将会在后面训练的代码调用该程序中的函数。