import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import numpy as np
import matplotlib.pyplot as plt
mnist =  input_data.read_data_sets("data/",one_hot = True)
#导入Tensorflwo和mnist数据集

#构建输入层
x = tf.placeholder(tf.float32,[None,784],name='X')
y = tf.placeholder(tf.float32,[None,10],name='Y')

#隐藏层神经元数量
H1_NN = 256 #第一层神经元数量
W1 = tf.Variable(tf.random_normal([784,H1_NN])) #权重
b1 = tf.Variable(tf.zeros([H1_NN])) #偏置项
Y1 = tf.nn.relu(tf.matmul(x,W1)+b1) #第一层输出
W2 = tf.Variable(tf.random_normal([H1_NN,10]))#权重
b2 = tf.Variable(tf.zeros(10))#偏置项

forward = tf.matmul(Y1,W2)+b2 #定义前向传播
pred = tf.nn.softmax(forward) #激活函数输出

#损失函数
#loss_function = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),
#                                            reduction_indices=1))
#(log(0))超出范围报错

loss_function  = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(logits=forward,labels=y))

#训练参数
train_epochs = 50 #训练次数
batch_size = 50 #每次训练多少个样本
total_batch = int(mnist.train.num_examples/batch_size) #随机抽取样本
display_step = 1 #训练情况输出
learning_rate = 0.01 #学习率

#优化器
opimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function)

#准确率函数
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

#记录开始训练时间
from time import time
startTime = time()
#初始化变量
sess =tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
#训练
for epoch in range(train_epochs):
    for batch in range(total_batch):
        xs,ys = mnist.train.next_batch(batch_size)#读取批次数据
        sess.run(opimizer,feed_dict={x:xs,y:ys})#执行批次数据训练
    
    #total_batch个批次训练完成后,使用验证数据计算误差与准确率
    loss,acc=sess.run([loss_function,accuracy],
                     feed_dict={x:mnist.validation.images,
                                y:mnist.validation.labels})
    #输出训练情况
    if(epoch+1) % display_step == 0:
        print("Train Epoch:",'%02d' % (epoch + 1),
               "Loss=","{:.9f}".format(loss),"Accuracy=","{:.4f}".format(acc))
duration = time()-startTime
print("Trian Finshed takes:","{:.2f}".format(duration))#显示预测耗时

#由于pred预测结果是one_hot编码格式,所以需要转换0~9数字
prediction_resul =  sess.run(tf.argmax(pred,1),feed_dict={x:mnist.test.images})

prediction_resul[0:10]

#模型评估
accu_test = sess.run(accuracy,
                    feed_dict={x:mnist.test.images,y:mnist.test.labels})
print("Accuray:",accu_test)



compare_lists = prediction_resul == np.argmax(mnist.test.labels,1)
print(compare_lists)
err_lists = [i for i in range(len(mnist.test.labels)) if compare_lists[i] == False]
print(err_lists,len(err_lists))

index_list = []
def print_predct_errs(labels,#标签列表
                        perdiction):#预测值列表
    count = 0
    compare_lists = (perdiction == np.argmax(labels,1))
    err_lists = [i for i in range(len(labels)) if compare_lists[i] == False]
    for x in err_lists:
        index_list.append(x)
        print("index="+str(x)+
        "标签值=",np.argmax(labels[x]),
        "预测值=",perdiction[x])
        count = count+1
    print("总计:",count)
    return index_list

print_predct_errs(mnist.test.labels,prediction_resul) 

def plot_images_labels_prediction(images,labels,prediction,index,num=25):
    fig = plt.gcf() # 获取当前图片
    fig.set_size_inches(10,12)
    if num>=25:
        num=25 #最多显示25张图片
    for i in range(0,num):
        ax = plt.subplot(5,5, i+1) #获取当前要处理的子图
        
        ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')#显示第index个图像
        title = 'label=' + str(np.argmax(labels[index]))#构建该图上要显示的title
        if len(prediction)>0:
            title += 'predict= '+str(prediction[index])
        
        ax.set_title(title,fontsize=10)
        ax.set_xticks([])
        ax.set_yticks([])
        index += 1
    plt.show()

plot_images_labels_prediction(mnist.test.images,mnist.test.labels,prediction_resul,index=index_list[100])

单纯记录一下个人代码,很基础的一个MNIST手写识别使用Tensorflwo实现,算是入门的Hello world 了,有些奇怪的问题暂时没有解决 训练次数调成40 在训练到第35次左右发生了梯度爆炸,原因未知,损失函数要使用带softmax那个,不然也会发生梯度爆炸

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。