神经网络学习入门干货(二) 识别mnist数据集

神经网络学习入门干货(二) 识别mnist数据集

  • 神经网络结构设计(输入层784点,隐藏层500点,输出层10点)
  • 训练数据量Batch、轮数steps、学习率及衰减Learning—Rate、正则项系数lambda、滑动平均衰减率ema
  • 辅助函数计算前向传播结果tf.nn.relu(tf.matmul())
  • 网络权重和偏置变量取随机值tf.truncated_normal
  • 交叉熵损失函数和正则化损失项tf.nn.sparse_softmax_cross_entropy_with_logits()
  • 梯度下降优化算法(最小化损失函数)tf.train.GradientDescentOptimizer()
  • 验证数据每1000轮准确率validate-acc、测试数据模型最终准确率
  • 定义main主函数和app.run调用

代码

# 加载Tensorflow框架和数据分析常用库
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

INPUT_NODE = 784  #输入层节点数,mnist数据集中图片的像素,向量化后的维度
OUTPUT_NODE = 10  #输出层节点数,即数字识别的类别
LAYER1_NODE = 500 #一层隐藏层,节点数为500
BATCH_SIZE = 100  #一个训练批次的数据量,batch量越小,越接近随机梯度下降,batch量越大,越接近梯度下降
LEARNING_RATE_BASE = 0.8  #基础学习率
LEARNING_RATE_DECAY = 0.99   #学习率的衰减率
REGULARIZATION_RATE = 0.0001  #正则项系数lambda的取值
TRAINING_STEPS = 30000  #训练轮数
MOVING_AVERAGE_DECAY = 0.99  #变量滑动平均衰减率的取值

# 定义辅助函数,来计算前向传播结果,参数包括输入张量,变量求平均的类,权重和偏置参数
def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):
    # 参数无平均处理,激活函数选用relu,矩阵乘法matmul
    if avg_class == None:
        layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)
        return tf.matmul(layer1, weights2) + biases2
    # 变量进行滑动平均
    else:
        layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))
        return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)

def train(mnist):

    # 输入向量和标签值
    x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input')
    y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name='y-input')

    #随机生成权重和偏置
    weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1))
    biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))
    weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))
    biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))

    # 辅助函数对数据的处理,前向传播结果计算
    y = inference(x, None, weights1, biases1, weights2, biases2)

    # 训练轮数为不可训练参数
    global_step = tf.Variable(0, trainable=False)
    # 变量指数滑动平均类的定义,参数为滑动平均衰减率,训练轮数
    variables_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
    # 对所有可训练参数执行训练操作
    variables_averages_op = variable_averages.apply(tf.trainable_variables())
    # 预测值进行指数滑动平均处理,
    average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)

    # 计算交叉熵用来刻画预测值和真实值之间差距的损失函数
    # y为不包含softmax层处理的预测值,后面为训练数据的正确答案。y——是长度为10个一维数组,需要tf.argmax得到正确分类编号。
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(y, tf.argmax(y_, 1))

    # 所有样例的交叉熵平均值
    cross_entropy_mean = tf.reduce_mean(cross_entropy)

    # L2正则化项损失函数,参数为lambd系数
    regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
    # 模型的正则化损失,即为权重的正则化损失之和
    regularization = regularizer(weights1) + regularizer(weights2)
    # 总损失函数等于交叉熵损失加正则化损失
    loss = cross_entropy_mean + regularization

    # 模型训练的学习率,指数衰减学习率,参数包括:基准学习率,训练轮数,训练总数据/样本数据,学习率衰减率
    learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE-DECY)

    # 训练执行为 梯度下降优化算法,学习率,最小化损失函数
    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
    train_op = tf.group(train_step, variables_averages_op)
    # with tf.control_dependence([train_step, variables_averages_op]): train_op = tf.no_op(name='train')

# 准确率计算,correct——prdiect为中间值预测
# tf.argmax(average_y, 1)是取大值计算,第二个数值为1,表明对第一个维度进行下标取大值计算,average_y为预测值的滑动平均值
# 维度为 batch_size*10的二维数组,每一行为一个预测样本的结果,对应10个类别,选取样本的正确分类值,转为为batch_size的一维数组。
# tf.equal 判断两个张量的每一维是否相等,如果相等返回True,否则返回False。
# tf.cast 进行数值类型转换,将布尔型转换为实数
# tf.reduce_mean 进行累加求和取平均,求出准确率
correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
    sess.run(init_op)
    # 验证数据,通过验证数据判断停止的条件和判断训练的结果
    # x,输入向量,y—,正确标签值。
    validate_feed = {x: mnist.validation.images, y_:mnist.validation.labels}
    # 测试数据,验证模型优劣的评价标准
    test_feed = {x: mnist.test.images, y_: mnist.test.labels}
    for i in range(TRAINING_STEPS):
        if i % 1000 == 0:
            #验证数据集的准确率,每过1000轮,输出验证数据集的准确率
            validate_acc = sess.run(accuracy, feed_dict=validate_feed)

            # 产生每一轮的训练batch
            xs, ys = mnist.train.next_batch(BATCH_SIZE)

            # 执行训练操作,更新神经网络参数,输入数据为batch数据
            sess.run(train_op, feed_dict={x: xs, y_: ys})

    # 训练结束之后,在测试数据上检测神经网络模型的最终正确率
    test_acc = sess.run(accuracy, feed_dict=test_feed)

# 主程序入口
def main(argv=None):

    # 声明处理mnist数据集的类,这个类在初始化时会自动下载数据,独热编码,one—hot
    mnist = input_data.read_data_sets("/tmp/data", one-hot=True)
    # 处理训练数据集
    train(mnist)

    # tenserflow定义的主程序入口,tf.app.run 会调用上面的main函数
if __name__ == '__main__':
    tf.app.run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值