案例 | Tensorflow实现鸢尾花分类

参考:b站的课程,北京大学的Tensorflow 2 课程


鸢尾花数据集:

150组数据,特征数量为4,分别为:花萼长、花萼宽、花瓣长、花瓣宽

标签为3:,分别为0,1,2,代表:狗尾鸢尾、杂色鸢尾、弗吉尼亚鸢尾

该数据集存在sklearn中,可以直接导入使用


程序步骤:

1 准备数据。包括:数据读入、数据乱序、将数据配成特征和标签对,生成train和test永不相见的测试集和训练集

2 搭建网络:定义神经网络中所有可训练参数。(用tf.Variable函数,可参考tensorflow笔记1)

3 优化参数:利用嵌套循环,在with结构中求得损失函数loss;对每个参数求偏导,更改这些可训练参数,同时求算每一次迭代的loss值和acc值,存于两个列表中,并绘制loss和acc曲线。

代码为:

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

#读取数据
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]
y_train=y_data[:-30]
x_test=x_data[-30:]
y_test=y_data[-30:]

#转换数据类型
x_train=tf.cast(x_train,tf.float32)
x_test=tf.cast(x_test,tf.float32)

#特征数据与标签配对
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=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#定义学习率
epoch=500
loss_all=0
train_loss_results=[]
test_acc=[]

#循环迭代,更新参数,显示loss
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)  # 进行one_hot编码
            # 反向传播
            loss=tf.reduce_mean(tf.square(y_-y))
            loss_all+=loss.numpy()
        grads=tape.gradient(loss,[w1,b1])
        w1.assign_sub(lr*grads[0])
        b1.assign_sub(lr*grads[1])
    print("第{}轮,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=tf.matmul(x_test,w1)+b1
        y=tf.nn.softmax(y)
        pred=tf.argmax(y,axis=1)
        pred=tf.cast(pred,dtype=y_test.dtype)
        correct=tf.cast(tf.equal(pred,y_test),tf.int32)
        correct=tf.reduce_sum(correct)
        total_correct+=int(correct)
        total_number+=x_test.shape[0]
    acc=total_correct/total_number
    print("准确率为:{}".format(acc))
    print("---------------")
    test_acc.append(acc)

#绘制曲线
#loss曲线
plt.figure(figsize=(5,4))
plt.plot(train_loss_results)
plt.xlabel("epoch")
plt.ylabel("Loss")
plt.title("Loss")

#准确率曲线
plt.figure(figsize=(5,4))
plt.plot(test_acc)
plt.xlabel("epoch")
plt.ylabel("acc")
plt.title("acc")
plt.show()

整体效果如下:

迭代过程中的数据显示:

 Loss曲线:

acc曲线

再将学习率调大,看看会有什么效果?

 

说明,参数配置的不合理会使模型变得极其不准确

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow尾花分类是使用TensorFlow框架进行尾花分类的过程。在这个过程中,我们使用了TensorFlow封装的高级API,即Estimator。Estimator已经对训练过程进行了封装,因此我们只需要进行一些配置就可以使用它来进行尾花分类。 首先,我们需要定义特征列(feature columns),这些特征列描述了我们用来区分尾花的特征。在尾花分类中,我们通常使用四个特征值来进行区分,包括sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)和petal width(花瓣宽度)。我们可以使用load_iris函数从sklearn.datasets库中读取尾花数据集,并将特征值和目标值分别存储在x_data和y_data中\[3\]。 接下来,我们可以使用Estimator来创建一个线性分类器(classifier),并将特征列、类别数和模型保存路径等参数传递给它。例如,我们可以使用tf.estimator.LinearClassifier来创建一个线性分类器,其中feature_columns参数为特征列,n_classes参数为类别数,model_dir参数为模型保存路径\[1\]。 最后,我们可以使用创建好的分类器来进行训练和预测。通过调用分类器的train方法,我们可以传入训练数据和训练步数来进行模型训练。然后,我们可以使用分类器的predict方法来对新的尾花样本进行分类预测。 总结起来,TensorFlow尾花分类是使用TensorFlow框架和Estimator来进行尾花分类的过程,其中我们使用特征列来描述尾花的特征,创建一个线性分类器,并使用训练数据进行模型训练和预测。 #### 引用[.reference_title] - *1* *2* [TensorFlow入门 - 使用TensorFlow尾花分类(线性模型)](https://blog.csdn.net/Solo95/article/details/80003012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [机器学习 | 使用TensorFlow搭建神经网络实现尾花分类](https://blog.csdn.net/qq_42688495/article/details/105415083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值