ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MNIST手写数字识别案例TensorFlow 2.0 实践

2021-11-06 17:30:57  阅读:184  来源: 互联网

标签:acc loss test train tf TensorFlow 2.0 valid MNIST


1.导入库

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

print("Tensorflow版本是:",tf.__version__)

2、数据集获取

mnist = tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()

3、数据集划分

3.1 划分验证集

total_num = len(train_images)
valid_split = 0.2 #验证集的比例占20%
train_num = int(total_num*(1-valid_split)) #训练集的数目

train_x = train_images[:train_num] #前部分给训练集
train_y = train_labels[:train_num]

valid_x = train_images[train_num:] #后20%给验证集
valid_y = train_labels[train_num:]

test_x = test_images
test_y = test_labels
valid_x.shape

4、数据塑性

# 把(28 28)的结构 拉直为一行 784
train_x = train_x.reshape(-1,784)
valid_x = valid_x.reshape(-1,784)
test_x = test_x.reshape(-1,784)

5、特征数据归一化

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)

6、独热编码

#实例

x = [3,4]
tf.one_hot(x,depth = 10)
#对标签数据进行独热编码
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)
train_y

7、创建变量

#定义变量
W = tf.Variable(tf.random.normal([784,10],mean = 0.0,stddev = 1.0,dtype = tf.float32))
B = tf.Variable(tf.zeros([10]),dtype = tf.float32)

# 在本案例中,用正态分布的随即数初始化全中W,以常数0初始化偏执B

8、定义交叉商损失函数

def loss(x,y,w,b):
    pred = model(x,w,b) # 计算模型预测值 和 标签值的差异
    loss_ = tf.keras.losses.categorical_crossentropy(y_true = y,y_pred = pred)
    return tf.reduce_mean(loss_) #求均值,得出均方差

9、设置超参数

training_epochs = 20 #训练论数
batch_size = 50 #单次训练数样本(批次大小)
learning_rate = 0.001 #学习率

10、定义梯度函数

# 计算样本数据【x,y】在参数【w,b】点上的梯度
def grad(x,y,w,b):
    with tf.GradientTape() as tape:
        loss_ = loss(x,y,w,b)
    return tape.gradient(loss_,[w,b]) # 返回梯度向量

11、选择优化器

# Adam 优化器
optimizer = tf.keras.optimizers.Adam(learning_rate = learning_rate)

12、定义准确率

def accuracy(x,y,w,b):
    pred = model(x,w,b) # 计算模型预测值和标签值的差异
    #检查【预测类别tf.argmax(pred,1)与实际类别tf.argmax(y,1)的匹配情况
    correct_prediction = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
    
    #准确率,将布尔值转化为浮点数,并计算平均值
    return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

13、训练模型

total_step = int(train_num/batch_size)

loss_list_train = [] #用于保存训练集 loss 的列表
loss_list_valid = [] #用于保存验证集 loss 值的列表
acc_list_train = [] #用于保存 训练集Acc值的列表
acc_list_valid = [] #用于保存验证集 Acc的值 的列表

for epoch in range(training_epochs):
    for step in range(total_step):
        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]))#优化器 根据梯度自动调整变量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)
    print("epoch = {:3d},train_loss = {:.4f},val_loss,val_acc={:.4f}".format(epoch+1,loss_train,acc_train,loss_valid,acc_valid))

从上述打印结果可以看出损失值 Loss 是趋于更小的,同时,准确率Accuracy 越来越高

14、显示训练过程数据

plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.plot(loss_list_train,'blue',label = "Train Loss")
plt.plot(loss_list_valid,'red',label = "Valid Loss")
plt.legend(loc = 1) #通过参数 loc 指定图例位置

plt.xlabel("Epochs")
plt.ylabel("Accuracy")
plt.plot(acc_list_train,'blue',label = 'Train Acc')
plt.plot(acc_list_valid,'red',label = 'Valid Acc')
plt.legend(loc = 1) #通过参数 loc 指定图例位置

15、评估模型

完成训练后,在测试集上评估模型的准确率

acc_test = accuracy(test_x,test_y,W,B).numpy()
print("Test accuracy :",acc_test)

16、模型应用与可视化

16.1、应用模型

在建立模型并进行训练后,若认为准确率可以接受,则可以使用此模型进行预测

# 定义预测函数
def predict(x,w,b):
    pred = model(x,w,b)# 计算模型预测值
    result = tf.argmax(pred,1).numpy()
    return result
pred_test = predict(test_x,W,B)
pred_test[0]

16.2、定义可视化函数

import matplotlib.pyplot as plot
import numpy as np
def plot_images_label_prediction(images,#图像列表
                                 labels, #标签列表
                                 preds, #y预测值列表
                                 index=0, #从第index个开始显示
                                 num = 10 # 缺省 一次显示10幅
                                ):
    fig = plt.gcf()# 获取当前图表 ,Get Current Figure
    fig.set_size_inches(10,4) #1 英寸 等于2.54cm
    if num > 10:
        num = 10
    for i in range(0,num):
        ax = plt.subplot(2,5,i+1)
        
        ax.imshow(np.reshape(images[index],(28,28)),cmap="binary") # 显示第index 个图像
        
        title = 'label=' + str(labels[index]) #构建该图上要显示的title 信息
        if len(preds)>0:
            title += ",predict=" + str(preds[index])
            
        ax.set_title(title,fontsize = 10) #显示 图上的title 信息
        ax.set_xticks([]);
        ax.set_yticks([])
        index = index + 1
        
    plt.show()
plot_images_label_prediction(test_images,test_labels,pred_test,10,10)

17、最终结果

 

标签:acc,loss,test,train,tf,TensorFlow,2.0,valid,MNIST
来源: https://blog.csdn.net/shazi4399/article/details/121181776

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有