【TF-3-2】Tensorflow-mnist的手写识别

一、代码

# Author:yifan
import matplotlib as mpl
from tensorflow.examples.tutorials.mnist import input_data   #从tensorflow中导入数据
import  tensorflow as tf
## 设置属性防止中文乱码及拦截异常信息
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

#加载数据,从tensorflow中导入到本地
mnist = input_data.read_data_sets("data/",one_hot=True)
# print(mnist.train.num_examples)   #55000
# print(mnist.train.labels.shape)   #(55000, 10)

#构建神经网络(4层,1 input,2 hidden 1 output)
n_unit_hidden_1 = 256  #第一层的神经元数目
n_unit_hidden_2 = 128  #第二层的神经元数目
n_input = 784  #输入是28*28像素的。
n_classes = 10

#定义占位符
x = tf.placeholder(tf.float32,shape=[None,n_input],name='x')  #None 表示输入不限制
y = tf.placeholder(tf.float32,shape=[None,n_classes],name='y')

#构建初始化
weights = {
    "w1" : tf.Variable(tf.random.normal(shape=[n_input,n_unit_hidden_1],stddev=0.1)),
    "w2" : tf.Variable(tf.random.normal(shape=[n_unit_hidden_1,n_unit_hidden_2],stddev=0.1)),
    "out" : tf.Variable(tf.random.normal(shape=[n_unit_hidden_2,n_classes],stddev=0.1))
}

biases = {
    "b1" : tf.Variable(tf.random.normal(shape=[n_unit_hidden_1],stddev=0.1)),#注意,这里shape只有一个参数
    "b2" : tf.Variable(tf.random.normal(shape=[n_unit_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-- hidden2
    layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1,_weights['w2']),_biases['b2']))
    return tf.matmul(layer2,_weights['out'])+ _biases['out']

# 获取预测值
pred = multiplayer_perceotron(x,weights,biases)
#构建损失函数,计算softmax中的每个样本交叉熵,logits指定预测值,lables指定实际值
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred,labels=y))
#使用梯度下降,最小化误差损失
train = tf.train.GradientDescentOptimizer(learning_rate= 0.01).minimize(cost)
#得到预测类别是哪一个
predict = tf.equal(tf.argmax(pred ,axis=1),tf.argmax(y,axis=1))
#正确率
acc = tf.reduce_mean(tf.cast(predict,tf.float32))
#初始化
init = tf.global_variables_initializer()
#执行模型
batch_size = 100
display_step = 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.8 and test_acc > 0.8:
                saver.save(sess,"./mn/model")
                break
        epoch += 1
    #模型可视化输出
    writer = tf.summary.FileWriter("./mn/graph",tf.get_default_graph())
    writer.close()

  

二、结果

三、图形中展示

3.1 Copy 图形的路径

3.2 打开命令行,tensorboard --logdir 3.1的路径

3.3 在浏览器中输入:

3.4 结果:

我在代码中加入这些:(最早的代码中没有,显示的为上图)

上图将变成这样:

posted @ 2020-03-29 19:56  忆凡人生  阅读(232)  评论(0编辑  收藏  举报