TensorFlow使用--MNIST分类学习(BP神经网络)

测试结果:根据测试集和验证集的验证,训练好的模型识别率可以达到96%

代码块

# -*- coding:utf-8 -*-
#!/usr/bin/env python
import tensorflow as tf
from  tensorflow.examples.tutorials.mnist  import  input_data
import numpy as np
def Bp():
    #加载数据
    mnist_data = input_data.read_data_sets("./MNIST_data/",one_hot=True)
    #获取训练数据
    train_data = mnist_data.train
    #获取验证数据
    validation_data = mnist_data.validation
    #获取测试数据
    test_data = mnist_data.test
    #神经网络结构及参数:784-30-10
        # 各层节点个数
    input_n=784
    output_n=10
    hidden_n=30
        #输入,输出占位
    x=tf.placeholder(tf.float32,shape=[None,input_n])
    y_=tf.placeholder(tf.float32,shape=[None,output_n])
        # 权值矩阵,阈值
    w1=tf.Variable(tf.random_normal([input_n,hidden_n], stddev = 0.1))
    b1=tf.Variable(tf.random_normal([1,hidden_n], stddev = 0.1))
    w2=tf.Variable(tf.random_normal([hidden_n,output_n], stddev = 0.1))
    b2=tf.Variable(tf.random_normal([1,output_n], stddev = 0.1))
    # w1 = tf.Variable(tf.random_normal ([input_n,hidden_n], stddev = 0.1))
    # b1 = tf.Variable(tf.constant (0.1), [hidden_n])
    # w2 = tf.Variable(tf.random_normal ([hidden_n, output_n], stddev = 0.1))
    # b2 = tf.Variable(tf.constant (0.1), [output_n])
    
    # 构建图:前向传播
    hidden_op=tf.nn.relu(tf.matmul(x,w1)+b1)
    final_opt=tf.nn.relu(tf.matmul(hidden_op,w2)+b2)
    # 对输出层计算交叉熵损失
    loss_fun = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=final_opt))
    opt = tf.train.GradientDescentOptimizer(0.3).minimize(loss_fun)
    #计算准确率
    correct_pred = tf.equal(tf.argmax(final_opt,1),tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
    # 初始化变量
    init = tf.global_variables_initializer() 

    #初始化TensorFlow持久化类
    saver = tf.train.Saver(max_to_keep=1)
    train_is_no=False
    with tf.Session() as sess:
        sess.run(init)
        if train_is_no :
            for i in range(5000):
                #每次随机选择100个样本进行训练
                batch_xs,batch_ys = train_data.next_batch(100)
                opt.run({x:batch_xs,y_:batch_ys})
                if i % 100 == 0 :
                    train_accuracy = accuracy.eval (session = sess, feed_dict = {x: batch_xs,y_: batch_ys})
                    print ("step : %d, training accuracy = %g " % (i, train_accuracy))
            
            saver.save(sess,'bp_model/save_net.ckpt',global_step=None)        
            #计算模型在训练集上的准确率
            print("train accray:%.4f" % accuracy.eval({x:train_data.images,y_:train_data.labels}))
            #计算模型在测试集上的准确率
            print("test accuracy:%.4f" % accuracy.eval({x:test_data.images,y_:test_data.labels}))
            '''
            train accray:0.9766
            test accuracy:0.9634 '''
        else:
            #验证
            saver.restore(sess,tf.train.latest_checkpoint('bp_model'))
            print("test accuracy:%.4f" % accuracy.eval({x:test_data.images,y_:test_data.labels}))
            print("validation accuracy:%.4f" % accuracy.eval({x:validation_data.images,y_:validation_data.labels}))            
            '''
            test accuracy:0.9634
            validation accuracy:0.9664 '''
    # #初始化TensorFlow持久化类
    # # saver = tf.train.Saver()
    # saver = tf.train.Saver()
    # with tf.Session() as sess:
    #     step=0        
    #     sess.run(init)      
    #     while False:
    #         batch_xs,batch_ys = train_data.next_batch(100)
    #         opt.run({x:batch_xs,y_:batch_ys})
    #         train_accuracy = accuracy.eval (session = sess, feed_dict = {x: batch_xs,y_: batch_ys})
    #         step+=1
    #         if train_accuracy >= 1:
    #             print(step,train_accuracy)
    #             save_path = saver.save(sess, "model/save_net.ckpt",global_step=step)
    #             break
    #         if step % 1000 == 0 :
    #             print ("step : %d, training accuracy = %g " % (step, train_accuracy))
def main():
    Bp()
if __name__ == '__main__':
    main()

代码分块解析

	#加载数据
    mnist_data = input_data.read_data_sets("./MNIST_data/",one_hot=True)
    #获取训练数据
    train_data = mnist_data.train
    #获取验证数据
    validation_data = mnist_data.validation
    #获取测试数据
    test_data = mnist_data.test

先从MNIST数据集中获取:训练集,测试集,验证集

	#神经网络结构及参数:784-30-10
        # 各层节点个数
    input_n=784
    output_n=10
    hidden_n=30
        #输入,输出占位
    x=tf.placeholder(tf.float32,shape=[None,input_n])
    y_=tf.placeholder(tf.float32,shape=[None,output_n])
        # 权值矩阵,阈值
    w1=tf.Variable(tf.random_normal([input_n,hidden_n], stddev = 0.1))
    b1=tf.Variable(tf.random_normal([1,hidden_n], stddev = 0.1))
    w2=tf.Variable(tf.random_normal([hidden_n,output_n], stddev = 0.1))
    b2=tf.Variable(tf.random_normal([1,output_n], stddev = 0.1))

设计BP神经网络的各层节点数以及各层之间的权值矩阵w和偏置(阈值)矩阵b
random_normal():从正态分布中输出随机值.stddev:设置方差为0.1,默认值为1

	# 构建图:前向传播
    hidden_op=tf.nn.relu(tf.matmul(x,w1)+b1)
    final_opt=tf.nn.relu(tf.matmul(hidden_op,w2)+b2)

定义输入层与隐藏层,隐藏层与输出层之间的数据传输关系;
隐藏层和输出层的激活函数采用ReLU函数,tf.nn.relu()函数是将大于0的数保持不变,小于0的数置为0

	# 对输出层计算交叉熵损失
    loss_fun = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=final_opt))
    opt = tf.train.GradientDescentOptimizer(0.3).minimize(loss_fun)

tf.nn.softmax_cross_entropy_with_logits_v2(_sentinel, labels, logits, dim, name)
计算 softmax(logits) 和 labels 之间的交叉熵。
labels:真实数据的类别标签;logits:神经网络最后一层的类别预测输出值

保存训练好的神经网络并调用

	#初始化TensorFlow持久化类
    saver = tf.train.Saver(max_to_keep=1)
    # 判断是训练还是测试
    train_is_no=False
    with tf.Session() as sess:
        sess.run(init)
        if train_is_no :
            #********
			#训练代码
			#*******  
			# 通过Saver类的save方法保存模型         
            saver.save(sess,'bp_model/save_net.ckpt',global_step=None)        
        else:
            #使用saver的restore方法导入模型参数           
            saver.restore(sess,tf.train.latest_checkpoint('bp_model'))
            #******
            # 测试代码
            #******          

小测试:将MNIST数据集中的图片显示出来

import  numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

i=54999 #第几张图,随便写

mnist=input_data.read_data_sets("./MNIST_data/",one_hot=True)
# 获取训练集的数据图片,并将其转换为[28,28]的原始形状
image=np.reshape(mnist.train.images[i],[28,28])
# 读取对应训练集的标签从而判断其正确值是多少
# 由于读取的标签值类型为numpy.ndarray,与list存在差别,其无法读取内部元素的位置
# 所以需要调用其tolist()方法将其转化为list
label=mnist.train.labels[i].tolist()
print(type(label))	#<class 'list'>
#找到label中元素为1的下标
print(label.index(1))  #显示label
# 通过设置cmap可以改变绘图颜色,
#gray_rgray_r:翻转 gray 的显示,如果 gray 将图像显示为黑底白字,gray_r 会将其显示为白底黑字
plt.imshow(image, cmap=plt.get_cmap('gray_r'))  #画图
plt.title("%dth Training Data:%d" % (i,label.index(1)))
plt.show()

显示结果
在这里插入图片描述
在这里插入图片描述
参考链接
numpy.ndarray’ object has no attribute 'index
matplotlib 可视化 —— cmap(colormap)
matplotlib.pyplot.colormaps色彩图cmap

传送门

温度数据训练
语音信号分类
MINIST手写数字识别(可视化输出结果)
BP神经网络基于Tensorflow的实现(代码注释详细)
机器学习之BP神经网络 以及 tensorflow 实现

激活函数相关

tensorflow的tf.nn.relu()函数
常用激活函数(激励函数)理解与总结
机器学习-激活函数的使用

softmax相关

tf.nn.softmax_cross_entropy_with_logits_v2()的用法
TensorFlow 中 softmax_cross_entropy_with_logits 及其···v2 和sparse_softmax_cross_entropy_with_logits的异同
tf.nn.softmax_cross_entropy_with_logits的用法

random随机数相关

W3Cschool-TensorFlow随机值:tf.random_normal函数
tensorflow 生成随机数 tf.random_normal 和 tf.random_uniform 和 tf.truncated_normal 和 tf.random_shuffle
tf.random_normal方法中seed的作用

Saver相关

如何保存训练好的神经网络直接进行测试-TensorFlow模型持久化
在TensorFlow中保存已经训练好的神经网络模型
tensorflow 1.0 学习:模型的保存与恢复(Saver)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值