手写数字识别示例四(tensorflow2.0+图示)

import os
import time
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import tensorflow.examples.tutorials.mnist.input_data as input_data
plt.rcParams["font.sans-serif"] = ["simhei"]

### 程序执行开始时间
begintime=time.time()
### 读取数据
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
valid_split=0.2   # 验证集占比
total_num=len(train_images)   # 数据集长度
train_num=int((1-valid_split)*total_num)   # 训练数据集长度
### 分配数据
train_x=train_images[:train_num]
train_y=train_labels[:train_num]
valid_x=train_images[train_num:]
valid_y=train_labels[train_num:]
test_x =test_images
test_y =test_labels
### 数据拉直
train_x=train_x.reshape(-1,784)
valid_x=valid_x.reshape(-1,784)
test_x = test_x.reshape(-1,784)
### 特征数据归一化
train_x=tf.cast(train_x/255.0,tf.float32)
valid_x=tf.cast(valid_x/255.0,tf.float32)
test_x =tf.cast( test_x/255.0,tf.float32)
### 对标签进行独热编码
train_y=tf.one_hot(train_y,depth=10)
valid_y=tf.one_hot(valid_y,depth=10)
test_y =tf.one_hot( test_y,depth=10)
### 定义模型
def model(x,w,b):
    pred=tf.matmul(x,w)+b
    return tf.nn.softmax(pred)
### 定义变量
W=tf.Variable(tf.random.normal([784,10],mean=0.0,stddev=1.0,dtype=tf.float32),name="W")
B=tf.Variable(tf.zeros([10]),dtype=tf.float32,name="B")
### 定义交叉熵损失函数
def loss(x,y,w,b):
    pred=model(x,w,b)
    myloss=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)
    return tf.reduce_mean(myloss)
### 定义参数
epochs_number=1   # 训练了几次
batch_size=200   # 批数据大小
train_epochs=100   # 迭代轮次
learning_rate=0.001   # 学习率
display_step=10   # 显示粒度
total_batch=int(len(train_x)/batch_size)
### 计算梯度
def grad(x,y,w,b):
    with tf.GradientTape() as tape:
        myloss=loss(x,y,w,b)
    return tape.gradient(myloss,[w,b])
### 定义优化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)
### 定义准确率
def accuracy(x,y,w,b):
    pred=model(x,w,b)
    correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
    return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
def plot_images_labels_prediction(images,labels,prediction,index,num=10):
    fig=plt.gcf()
    fig.set_size_inches(10,12)
    if num>25:
        num=25
    for i in range(num):
        ax=plt.subplot(5,5,i+1)
        ax.imshow(np.reshape(images[index],(28,28)),cmap="binary")
        title=u"标签="+str(np.argmax(labels[index]))
        if len(prediction)>0:
            title+=",预测值="+str(prediction[index].numpy())
        ax.set_title(title,fontsize=10)
        ax.set_xticks([])
        ax.set_yticks([])
        index+=1
    plt.show()
### 训练
loss_list_train=[]
loss_list_valid=[]
acc_list_train =[]
acc_list_valid =[]
for epoch in range(train_epochs):
    for step in range(total_batch):
        xs=train_x[step*batch_size:(step+1)*batch_size]
        ys=train_y[step*batch_size:(step+1)*batch_size]
        grads=grad(xs,ys,W,B)
        optimizer.apply_gradients(zip(grads,[W,B]))
    loss_train=loss(train_x,train_y,W,B).numpy()
    loss_valid=loss(valid_x,valid_y,W,B).numpy()
    acc_train =accuracy(train_x,train_y,W,B).numpy()
    acc_valid =accuracy(valid_x,valid_y,W,B).numpy()
    loss_list_train.append(loss_train)
    loss_list_valid.append(loss_valid)
    acc_list_train.append(acc_train)
    acc_list_valid.append(acc_valid)
    if (epoch+1) % display_step == 0:
        print("训练轮次:{:0>5d},训练损失率:{:.10f},训练准确率:{:.5f},验证损失率:{:.10f},验证准确率:{:.5f}".format(epoch+1,loss_train,acc_train,loss_v
alid,acc_valid))
print("程序运行耗时:{:.10f}秒".format(time.time()-begintime))
while True:
    os.system("clear")
    print("1.........训练数据")
    print("2.........识别数字")
    print("3.........训练信息")
    menu_input=input("请输入选择(Quit/Q退出):")
    if menu_input == "1":
        epochs_number+=1
        ### 程序执行开始时间
        begintime=time.time()
        ### 训练
        loss_list_train=[]
        loss_list_valid=[]
        acc_list_train =[]
        acc_list_valid =[]
        for epoch in range(train_epochs):
            for step in range(total_batch):
                xs=train_x[step*batch_size:(step+1)*batch_size]
                ys=train_y[step*batch_size:(step+1)*batch_size]
                grads=grad(xs,ys,W,B)
                optimizer.apply_gradients(zip(grads,[W,B]))
            loss_train=loss(train_x,train_y,W,B).numpy()
            loss_valid=loss(valid_x,valid_y,W,B).numpy()
            acc_train =accuracy(train_x,train_y,W,B).numpy()
            acc_valid =accuracy(valid_x,valid_y,W,B).numpy()
            loss_list_train.append(loss_train)
            loss_list_valid.append(loss_valid)
            acc_list_train.append(acc_train)
            acc_list_valid.append(acc_valid)
            if (epoch+1) % display_step == 0:
                print("训练轮次:{:0>5d},训练损失率:{:.10f},训练准确率:{:.5f},验证损失率:{:.10f},验证准确率:{:.5f}".format(epoch+1,loss_train,acc_trai
n,loss_valid,acc_valid))
        print("程序运行耗时:{:.10f}秒".format(time.time()-begintime))
    elif menu_input == "2":
        myindex=int(input("请输入索引数字(5-9900之间):"))
        mysum=int(input("请输入显示数量(5-25之间):"))
        if myindex<=5 or myindex>=9900:
            myindex=7425
        if mysum<=5 or mysum>=25:
            mysum=25
        prediction_result=tf.argmax(model(train_x,W,B),1)
        plot_images_labels_prediction(train_x,train_y,prediction_result,myindex,mysum)
    elif menu_input == "3":
        print("训练次数:{:0>5d},训练损失率:{:.10f},训练准确率:{:.5f},验证损失率:{:.10f},验证准确率:{:.5f}".format(epochs_number,loss_train,acc_train,loss_valid,acc_valid))
        input("任意键返回")
    elif menu_input.upper() == "QUIT" or menu_input.upper() == "Q":
        break

训练轮次:00010,训练损失率:0.6595796943,训练准确率:0.85233,验证损失率:0.6406478286,验证准确率:0.85425
训练轮次:00020,训练损失率:0.4611262083,训练准确率:0.88979,验证损失率:0.4707993865,验证准确率:0.88725
训练轮次:00030,训练损失率:0.3869549036,训练准确率:0.90315,验证损失率:0.4105678797,验证准确率:0.89967
训练轮次:00040,训练损失率:0.3459119797,训练准确率:0.91098,验证损失率:0.3793669343,验证准确率:0.90533
训练轮次:00050,训练损失率:0.3192890286,训练准确率:0.91658,验证损失率:0.3597021401,验证准确率:0.91050
训练轮次:00060,训练损失率:0.3004053831,训练准确率:0.92017,验证损失率:0.3460557461,验证准确率:0.91350
训练轮次:00070,训练损失率:0.2863721251,训练准确率:0.92358,验证损失率:0.3360227942,验证准确率:0.91483
训练轮次:00080,训练损失率:0.2755896747,训练准确率:0.92596,验证损失率:0.3285307288,验证准确率:0.91592
训练轮次:00090,训练损失率:0.2669441998,训练准确率:0.92787,验证损失率:0.3226217926,验证准确率:0.91717

训练次数:00001,训练损失率:0.2599059641,训练准确率:0.92944,验证损失率:0.3179240823,验证准确率:0.91883

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值