基于Tensorflow2的“鸢尾花分类”问题,含默写模版 北京大学人工智能实践课程笔记

    科技2022-08-10  100

     

    基于Tensorflow2的“鸢尾花分类”问题

    默写模版,只看模版来背写代码

    #import部分 #数据导入 x_data= y_target= #随机 #切片 x_train= y_train= x_test= y_test= #格式转换为tf.float32(指x_train和x_test) #利用tf.data.Dataset.from_tensor_slice将特征与标签对应,并且batch成32为数据块(Data Block),元组对为输入格式 train_db= test_db= #w1和b1,用Variable,正态分布初始化,std=0.1,输入为4个特征,输出为3个分类,则w为4x3 w1= b1= #学习率、用于画图的每轮loss、用于画图的每轮test_acc、epoch、loss_all每轮损失和 lr=0.1 train_loss_results=[] test_acc=[] epoch=500 loss_all=0 #最外层是epoch # 训练部分 # 次层是step和enumerate # 梯度下降 with GradienTape() as tape: # 其中求出y为预测值、softmax归一化预测值y、将1x1的y_train训练集标签转换为1x3的y_ # 求均方误差MSE,公式为 mse=mean(sum(y-out)^2)、求和loss_all记录每轮的损失和 # 计算梯度,即求出偏导 # w1=w1-lr*grad[w1],b1=b1-lr*grad[b1] # 打印信息epoch、loss、添加记录到train_loss_results、归零loss_all # 测试部分,检验一个epoch后的test集上准确率 # total_correct、total_number 准确率为total_correct/total_number # for x_test,y_test in test_db: # 矩阵乘x_test,softmax,argmax求出y_pred # equal则为1,将1加到total_correct上 # 计算acc,将acc输出到test_acc上用于绘图 # 绘制 loss 曲线 # 图片标题 # x轴变量名称 # y轴变量名称 # 逐点画出trian_loss_results值并连线,连线图标是Loss # 画出曲线图标 # 画出图像 #绘制 Accuracy 曲线 # 图片标题 # x轴变量名称 # y轴变量名称 # 逐点画出test_acc值并连线,连线图标是Accuracy # 画出曲线图标 # 画出图像

    答案

    import tensorflow as tf import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris #数据导入 x_data=load_iris().data y_target=load_iris().target #随机 np.random.seed(116) np.random.shuffle(x_data) np.random.seed(116) np.random.shuffle(y_target) tf.random.set_seed(116) #切片 x_train=x_data[:-30] #从0切到倒数第30的位置 y_train=y_target[:-30] x_test=x_data[-30:] #从倒数第30的位置切到最后一个 y_test=y_target[-30:] #格式转换为float32 x_train = tf.cast(x_train, tf.float32) x_test = tf.cast(x_test, tf.float32) #利用tf.data.Dataset.from_tensor_slice将特征与标签对应,并且batch成32,元组对为格式 train_db=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32) test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32) #w1和b1,用Variable,正态分布初始化,std=0.1,输入为4个特征,输出为3个分类,则w为4x3 w1=tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1)) b1=tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1)) #学习率、用于画图的每轮loss、用于画图的每轮test_acc、epoch、loss_all每轮损失和 lr=0.1 train_loss_results=[] test_acc=[] epoch=500 loss_all=0 #最外层是epoch # 训练部分 # 次层是step和enumerate # 梯度下降 with GradienTape() as tape: # 其中求出y为预测值、softmax归一化预测值y、将1x1的y_train训练集标签转换为1x3的y_ # 求均方误差MSE,公式为 mse=mean(sum(y-out)^2)、求和loss_all记录每轮的损失和 # 计算梯度,即求出偏导 # w1=w1-lr*grad[w1],b1=b1-lr*grad[b1] # 打印信息epoch、loss、添加记录到train_loss_results、归零loss_all # 测试部分,检验一个epoch后的test集上准确率 # total_correct、total_number 准确率为total_correct/total_number # for x_test,y_test in test_db: # 矩阵乘x_test,softmax,argmax求出y_pred # equal则为1,将1加到total_correct上 # 计算acc,将acc输出到test_acc上用于绘图 for epoch in range(epoch): for step,(x_train,y_train) in enumerate(train_db): with tf.GradientTape() as tape: y=tf.matmul(x_train,w1)+b1 y=tf.nn.softmax(y) y_=tf.one_hot(y_train,depth=3) loss=tf.reduce_mean(tf.square(y_-y)) loss_all+=loss.numpy() grad=tape.gradient(loss,[w1,b1]) w1.assign_sub(lr*grad[0]) b1.assign_sub(lr*grad[1]) print("Epoch{},loss:{}".format(epoch,loss_all/4)) train_loss_results.append(loss_all/4) loss_all=0 total_correct,total_number=0,0 for x_test,y_test in test_db: y_pred_temp=tf.matmul(x_test,w1)+b1 y_pred_temp=tf.nn.softmax(y_pred_temp) y_pred=tf.argmax(y_pred_temp,axis=1) y_pred=tf.cast(y_pred,dtype=y_test.dtype) correct=tf.cast(tf.equal(y_pred,y_test),dtype=tf.int32) correct=tf.reduce_sum(correct) total_correct+=int(correct) total_number+=x_test.shape[0] acc=total_correct/total_number test_acc.append(acc) print("Test_acc:",acc) print("-----------------------------------") # 绘制 loss 曲线 plt.title('Loss Function Curve') # 图片标题 plt.xlabel('Epoch') # x轴变量名称 plt.ylabel('Loss') # y轴变量名称 plt.plot(train_loss_results, label="$Loss$") # 逐点画出trian_loss_results值并连线,连线图标是Loss plt.legend() # 画出曲线图标 plt.show() # 画出图像 # 绘制 Accuracy 曲线 plt.title('Acc Curve') # 图片标题 plt.xlabel('Epoch') # x轴变量名称 plt.ylabel('Acc') # y轴变量名称 plt.plot(test_acc, label="$Accuracy$") # 逐点画出test_acc值并连线,连线图标是Accuracy plt.legend() plt.show()

     

    Processed: 0.016, SQL: 8