《深度学习与逻辑回归模型的融合&&TensorFlow多元分类的高级应用》(下)

简介: 《深度学习与逻辑回归模型的融合&&TensorFlow多元分类的高级应用》(下)

《深度学习与逻辑回归模型的融合&&TensorFlow多元分类的高级应用》(上)+https://developer.aliyun.com/article/1625000

训练超参数

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

梯度函数

#计算样本数据在[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])#返回梯度向量

Adam优化器

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

常用的优化器有:

  • SGD
  • Adagrad
  • RMSprop
  • Adam

准确率

#定义准确率
def accuary(x,y,w,b):
    pred=model(x,w,b)#计算模型预测和标签值的差异
    # 检查预测类别tf.argmax(pred,1)与实际类别tf.argmax(pred,1)的匹配情况
    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]))#优化器根据梯度自动调整变量w和b
        
    loss_train=loss(train_x,train_y,W,B).numpy() #计算当前轮训练损失
    loss_valid=loss(valid_x,valid_y,W,B).numpy() #计算当前轮损失验证
    acc_train=accuary(train_x,train_y,W,B).numpy()
    acc_valid=accuary(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))

显示训练过程数据

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("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通过参数loc指定图例位置

在测试集完成评估模型

acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_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)
pred_test[0]

定义可视化函数

def plot_images_labels_prediction(images,# 图象列表
                                 labels,# 标签列表
                                 preds,#预测值列表
                                 index=0,#从第index个开始显示
                                 num=10):#缺省一次显示10幅
    fig=plt.gcf() #获取当前图表
    fig.set_size_inches(10,4) # 1英寸=2.54cm
    if num > 10:
        num = 10 #最多显示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_labels_prediction(test_images,test_labels,pred_test,10,10)

可以调整训练迭代次数来提高迭代的准确度。

5、完整代码demo

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("TensorFlow2.0版本是:",tf.__version__)
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
print("Train images_shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test images shape:",test_images.shape,"Test label shape:",test_labels.shape)
print("image data:",train_images[1])
def plot_image(image):
    plt.imshow(image.reshape(28,28),cmap='binary')
    plt.show()
plot_image(train_images[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
# 把(28,28)的结构拉成一行 784
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_x[1]
# 对标签数据进行独热编码
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
#构建模型
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))
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 #学习率
#计算样本数据在[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])#返回梯度向量
#Adam优化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)
#定义准确率
def accuary(x,y,w,b):
    pred=model(x,w,b)#计算模型预测和标签值的差异
    # 检查预测类别tf.argmax(pred,1)与实际类别tf.argmax(pred,1)的匹配情况
    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]))#优化器根据梯度自动调整变量w和b
        
    loss_train=loss(train_x,train_y,W,B).numpy() #计算当前轮训练损失
    loss_valid=loss(valid_x,valid_y,W,B).numpy() #计算当前轮损失验证
    acc_train=accuary(train_x,train_y,W,B).numpy()
    acc_valid=accuary(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))
    
    
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("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通过参数loc指定图例位置
acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_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)
pred_test[0]
def plot_images_labels_prediction(images,# 图象列表
                                 labels,# 标签列表
                                 preds,#预测值列表
                                 index=0,#从第index个开始显示
                                 num=10):#缺省一次显示10幅
    fig=plt.gcf() #获取当前图表
    fig.set_size_inches(10,4) # 1英寸=2.54cm
    if num > 10:
        num = 10 #最多显示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_labels_prediction(test_images,test_labels,pred_test,10,10)

目录
相关文章
|
人工智能 数据安全/隐私保护
利用D-ID让你的照片能说话,制作口播视频
利用D-ID让你的照片能说话,制作口播视频
1004 0
利用D-ID让你的照片能说话,制作口播视频
|
8月前
|
弹性计算 运维 监控
云产品评测|阿里云服务诊断
云服务诊断是阿里云提供的运维工具,帮助用户快速定位和解决云资源问题。通过“健康状态”和“诊断”两大功能,用户可实时查看云资源状态,排查如网站无法访问、ECS故障、配置错误等常见问题,并根据修复建议迅速恢复业务。该工具显著提升了问题解决效率,降低了使用门槛。建议增加自定义告警、多维度数据展示、自动化修复等功能,进一步优化用户体验。
224 0
云产品评测|阿里云服务诊断
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
探索人工智能在医疗健康领域的应用
【10月更文挑战第25天】 本文深入探讨了人工智能(AI)技术在医疗健康领域的现状与未来趋势。通过对AI技术在疾病诊断、治疗方案优化、患者管理等方面的应用案例分析,揭示了AI如何助力提高医疗服务效率和质量。文章还讨论了AI技术面临的挑战,包括数据安全、伦理问题以及技术普及的障碍,并提出了相应的解决策略。通过本文,读者将对AI在医疗健康领域的潜力和挑战有一个全面的认识。
357 2
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的税务管理与优化
【7月更文挑战第25天】 ERP系统中的税务管理与优化
936 2
|
11月前
|
Linux 网络安全
Linux虚拟机与主机和Xshell的连接问题解决
Linux虚拟机与主机和Xshell的连接问题解决
387 1
|
Web App开发 Linux Windows
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
565 3
|
人工智能 开发工具 git
一看就会的智能换颜项目教程!5分钟速通明星大模型开源项目一键部署
有了通义灵码的帮助,很多明星大模型项目实操过程中遇到的问题:查找错误、解释代码、优化代码、查找文档、代码补全等等都可以用通义灵码一键解决,而且准确率很高,加上灵活的实操环境,项目跑起来会非常高效。关键是通义灵码个人版还免费!
|
前端开发 JavaScript 开发者
前端实现导出
前端实现导出
531 0
|
算法
MATLAB | 插值算法 | 一维interpn插值法 | 附数据和出图代码 | 直接上手
MATLAB | 插值算法 | 一维interpn插值法 | 附数据和出图代码 | 直接上手
709 0
|
存储 安全 Java
IDEA插件:FindBugs-- 在Java程序中查找错误
IDEA插件:FindBugs-- 在Java程序中查找错误
IDEA插件:FindBugs-- 在Java程序中查找错误