基于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()