BP网络实现手写数字识别

纵然是瞬间 提交于 2019-12-05 04:24:45
import matplotlib as mplimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 设置字符集,防止中文乱码mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# 数据加载mnist = input_data.read_data_sets('data/',one_hot=True)#print(mnist.train.num_examples)#样本数目# 构建神经网络(4层、1 input,2hidden,ioutput)n_uint_hidden_1 = 256n_uint_hidden_2 = 128n_input = 784#输入的一个样本是28*28像素的n_classes = 10#输出类别数目# 定义输入占位符x = tf.placeholder(tf.float32,shape = [None,n_input],name = 'x')y = tf.placeholder(tf.float32,shape = [None,n_classes],name = 'y')# 初始化的w和bweights = {    "w1":tf.Variable(tf.random_normal(shape=[n_input,n_uint_hidden_1],stddev = 0.1)),    "w2":tf.Variable(tf.random_normal(shape=[n_uint_hidden_1,n_uint_hidden_2],stddev = 0.1)),    "w3":tf.Variable(tf.random_normal(shape=[n_uint_hidden_2,n_classes],stddev = 0.1))}biases = {    "b1":tf.Variable(tf.random_normal(shape=[n_uint_hidden_1],stddev=0.1)),    "b2":tf.Variable(tf.random_normal(shape=[n_uint_hidden_2],stddev=0.1)),    "out":tf.Variable(tf.random_normal(shape=[n_classes],stddev=0.1))}# 构建网络def multiplayer_perceotron(_X,_weights,_biases):#  第一层到第二层  input --> hidden1    layer1 = tf.nn.sigmoid(tf.add(tf.matmul(_X,_weights['w1']),_biases['b1']))#  第二层到第三层  hidden1 --> hidden    layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1,_weights['w2']),_biases['b2']))    return tf.add(tf.matmul(layer2,_weights['w3']),_biases['out'])# 获取预测值act= multiplayer_perceotron(x,weights,biases)# tf.nn.softmax_cross_entropy_with_logits(logits=pred,labels=y)cost = tf.reduce_mean(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=act,labels=y)))# 使用梯度下降法求解# 使用梯度下降最小化误差# learning_rate:要注意,不要过大,过大可能不收敛,也不要过小,过小收敛速度比较慢train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)# 得到预测的类别是哪一个# tf.argmax:对矩阵按行或列计算最大值对应的下标,和numpy中的一样# tf.equal:是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回Truepred = tf.equal(tf.argmax(act,axis=1),tf.argmax(y,axis=1))# 正确率(True转换为1,False转换为0)acc = tf.reduce_mean(tf.cast(pred,tf.float32))#计算pred的平均值# 初始化init = tf.global_variables_initializer()# 执行模型的训练batch_size = 100  #每次处理的图片数display_step = 4  #每4次迭代打印一次with tf.Session() as sess:    sess.run(init)#     模型的保存、持久化    saver = tf.train.Saver()    epoch = 0    while True:        avg_cost = 0        # 计算出总的批次        total_batch = int(mnist.train.num_examples/batch_size)        # 迭代更新        for i in range(total_batch):            batch_xs,batch_ys = mnist.train.next_batch(batch_size)            feeds = {x:batch_xs,y:batch_ys}#           #模型训练            sess.run(train,feed_dict=feeds)            avg_cost+=sess.run(cost,feed_dict=feeds)        avg_cost = avg_cost/total_batch#       显示误差率和训练集的正确率以此测试集的正确率        if (epoch+1)%display_step == 0:            print("批次:%03d  损失函数值:%.9f"%(epoch,avg_cost))            feeds = {x:mnist.train.images,y:mnist.train.labels}            train_acc = sess.run(acc,feed_dict=feeds)            print("训练集准确率:%.3f"%train_acc)            feeds = {x: mnist.test.images, y: mnist.test.labels}            test_acc = sess.run(acc, feed_dict=feeds)            print("测试集准确率:%.3f" % test_acc)            if train_acc>0.9 and test_acc>0.9:                saver.save(sess,'./mn/model')                break        epoch += 1#   模型可视化输出    writer = tf.summary.FileWriter('./mn/graph',tf.get_default_graph())    writer.close()
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!