机器学习——mnist手写数据集模型构建

tensorflow的tf—1版本下的mnist模型构建

import tensorflow.compat.v1 as tf
import matplotlib.pyplot as plt
import numpy as np
tf.disable_v2_behavior()
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("D:\\log\\MNIST_data", one_hot=True)
#模型构建
#定义待输入数据的占位符
#定义x和y的占位符
x=tf.placeholder(tf.float32,[None,784],name='X')
y=tf.placeholder(tf.float32,[None,10],name='Y')
#定义模型变量
#正态分布
W=tf.Variable(tf.random_normal([784,10]),name='W')#权值
b=tf.Variable(tf.zeros([10]),name='b')#偏置项
#定义前向计算,用单个神经元构建神经网络
forward=tf.matmul(x,W)+b
#结果分类
pred=tf.nn.softmax(forward)#softmax分类
#训练模型
train_epochs=50#训练轮数
batch_size=100#单次训练样本数
total_batch=int(mnist.train.num_examples/batch_size)#一轮训练有多少批次
display_step=1#显示粒度
learning_rate=0.1#学习率
#定义损失函数
loss_function=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
#选择优化器
#梯度下降优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
#定义准确率
#检查预测类别与实际类别的匹配情况
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#准确率,将布尔值转化为浮点数,并计算平均值
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
#声明对话
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(optimizer,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))
print('train Finished')
#评估模型
accu_test=sess.run(accuracy,
                   feed_dict={x:mnist.test.images,y:mnist.test.labels})
print('Test Accuracy:',accu_test)
prediction_result=sess.run(tf.argmax(pred,1),feed_dict={x:mnist.test.images})
print(prediction_result[0:10])
#定义可视化函数
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(0,num):
        ax=plt.subplot(5,5,i+1)#获取当前要处理的子图
        ax.imshow(np.reshape(images[index],(28,28)),#显示第index个图像
                  cmap='binary')
        title='label='+str(np.argmax(labels[index]))#构建该图上要显示的title
        if len(prediction)>0:
            title+=',predict='+str(prediction[index])
        ax.set_title(title,fontsize=10)#显示图上的title信息
        ax.set_xticks([]);#不显示坐标轴
        ax.set_yticks([])
        index+=1
    plt.show()

plot_images_labels_prediction(mnist.test.images,mnist.test.labels,prediction_result,10,25)

tensorflow的tf—2.0版本下的mnist模型构建
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
#划分验证集
total_num=len(train_images)
valid_split=0.2 #验证集比例为0.2
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

print(valid_x.shape)
#数据塑性
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)#对结果进行softmax分类
#创建模型变量——正太分布
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)#偏置项

#定义交叉熵损失函数
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_)#求均值,得出方差

#训练模型

#设置训练参数
training_epochs=20#训练次数
batch_size=50#单次训练样本数
learning_rate=0.001#学习率

#定义梯度计算函数
def grad(x,y,w,b):
    with tf.GradientTape() as tape:
        loss_=loss(x,y,w,b)
    return tape.gradient(loss_,[w,b])#返回梯度向量

#选择优化器
#Adam优化器
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))

#模型训练
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]))#优化器根据梯度自动调节
    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},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}'.format(epoch+1,loss_train,acc_train,loss_valid,acc_valid))
#评估模型
accu_test=accuracy(test_x,test_y,W,B).numpy()
print('Test Accuracy:',accu_test)

#对模型进行预测
#定义预测函数
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)
#可视化函数
def plot_images_labels_prediction(images,labels,preds,index=0,num=10):
    fig=plt.gcf()#获取当前图表
    fig.set_size_inches(10,4)
    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)),#显示第index个图像
                  cmap='binary')
        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+=1
    plt.show()
plot_images_labels_prediction(test_images,test_labels,pred_test,10,10)
点赞
  1. sorry说道:
    Google Chrome Windows 10

    :zhenbang:

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像