tensorflow入门:利用全连接神经网络实现手写数字识别(二)

本文详细介绍使用TensorFlow构建全连接神经网络的过程,包括定义神经网络结构、实现前向传播算法及在线推理。通过实例讲解如何设置输入输出层、隐藏层,并使用ReLU激活函数进行线性化处理。

在上篇我们介绍了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

 

前向传播的算法到此为止,我们将会在后面训练的代码调用该程序中的函数。

利用tensorflow实现的卷积神经网络来进行MNIST手写数字图像的分类。 #导入numpy模块 import numpy as np #导入tensorflow模块,程序使用tensorflow实现卷积神经网络 import tensorflow as tf #下载mnist数据集,并从mnist_data目录中读取数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('mnist_data',one_hot=True) #(1)这里的“mnist_data” 是和当前文件相同目录下的一个文件夹。自己先手工建立这个文件夹,然后从https://yann.lecun.com/exdb/mnist/ 下载所需的4个文件(即该网址中第三段“Four files are available on this site:”后面的四个文件),并放到目录MNIST_data下即可。 #(2)MNIST数据集是手写数字字符的数据集。每个样本都是一张28*28像素的灰度手写数字图片。 #(3)one_hot表示独热编码,其值被设为true。在分类问题的数据集标注时,如何不采用独热编码的方式, 类别通常就是一个符号而已,比如说是9。但如果采用独热编码的方式,则每个类表示为一个列表list,共计有10个数值,但只有一个为1,其余均为0。例如,“9”的独热编码可以为[00000 00001]. #定义输入数据x和输出y的形状。函数tf.placeholder的目的是定义输入,可以理解为采用占位符进行占位。 #None这个位置的参数在这里被用于表示样本的个数,而由于样本个数此时具体是多少还无法确定,所以这设为None。而每个输入样本的特征数目是确定的,即为28*28。 input_x = tf.placeholder(tf.float32,[None,28*28])/255 #因为每个像素的取值范围是 0~255 output_y = tf.placeholder(tf.int32,[None,10]) #10表示10个类别 #输入层的输入数据input_x被reshape成四维数据,其中第一维的数据代表了图片数量 input_x_images = tf.reshape(input_x,[-1,28,28,1]) test_x = mnist.test.images[:3000] #读取测试集图片的特征,读取3000个图片 test_y = mnist.test.labels[:3000] #读取测试集图片的标签。就是这3000个图片所对应的标签
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值