Python-TensorFlow学习—鸢尾花模型代码

下面列出鸢尾花模型代码,作为机器学习的“Hello World!”程序。

Python版本为3.7,TensorFlow版本为2.0

import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn import datasets
import numpy as np

# 读入数据集
x_data=datasets.load_iris().data
y_data=datasets.load_iris().target

# 数据集乱序
np.random.seed(116)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)

# 数据集分出永不相见的训练集和测试集
x_train=x_data[:-30] # 前120个作为训练集
y_train=y_data[:-30]
x_test=x_data[-30:] # 后120个作为测试集
y_test=y_data[-30:]

# 转换x的数据类型,否则后面矩阵相乘时会因数据类型不一致报错
x_train=tf.cast(x_train,tf.float32)
x_test=tf.cast(x_test,tf.float32)

# 配成[输入特征,标签]对,每次喂入一个batch
train_db=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32) # 每32组输入特征对打包成一个batch
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)

# 定义神经网络中所有可训练参数
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))

# 定义超参数和画图用的两个存数据的空列表
lr=0.1 # 学习率为 0.1
train_loss_results=[] # 将每轮的loss记录在此刻列表中,为后续画loss曲线提供数据
test_acc=[] # 将每轮的acc记录在此刻列表中,为后续画acc曲线提供数据
epoch=500 # 循环 500 轮
loss_all=0 # 每轮分 4 个step,loss_all 记录四个step生成的4个loss的和

# 训练部分:嵌套循环迭代,with结构更新参数,显示当前loss
for epoch in range(epoch): # 数据集级别迭代
    for step,(x_train,y_train) in enumerate(train_db): # batch级别迭代
        with tf.GradientTape() as tape:
            # 前向传播过程计算y
            y=tf.matmul(x_train,w1) + b1 # 神经网络乘加运算
            y=tf.nn.softmax(y) # 使输出y符合概率分布
            y_=tf.one_hot(y_train,depth=3) # 将标签值转换为独热码
            # 计算总loss
            loss=tf.reduce_mean(tf.square(y_-y)) # 采用均方误差损失函数
            loss_all+=loss.numpy() # 将每个step计算出来的loss累加
        # 计算loss对各个参数的梯度
        grads=tape.gradient(loss,[w1,b1])
        # 更新参数
        w1.assign_sub(lr*grads[0])
        b1.assign_sub(lr*grads[1])
    print("Epoch {},loss:{}".format(epoch,loss_all/4))# 每个epoch打印loss信息
    train_loss_results.append(loss_all/4)
    loss_all=0

# 计算当前参数向前传播后的准确率,显示当前acc
    # 测试部分
    total_correct,total_number=0,0
    for x_test,y_test in test_db:
        y=tf.matmul(x_test,w1)+b1
        y=tf.nn.softmax(y)
        pred=tf.argmax(y,axis=1) # 返回y中最大索引,作为预测的分类
        pred=tf.cast(pred,dtype=y_test.dtype)
        correct=tf.cast(tf.equal(pred,y_test),dtype=tf.int32) # 将布尔结果转换为int类型
        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('------------------------------')

# acc/loss可视化
# loss曲线
plt.title('Loss function Curve')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.plot(train_loss_results,label="$Loss$") # 逐点画出train_loss_results并连线,连线图标为label参数
plt.legend() # 画出曲线图标
plt.show() # 画出图像

# Accuracy曲线
plt.title('Acc Curve')
plt.xlabel('Epoch')
plt.ylabel('Acc')
plt.plot(test_acc,label="$Accuracy$") # 逐点画出test_acc并连线,连线图标为label参数
plt.legend() # 画出曲线图标
plt.show() # 画出图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值