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

 

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值