首页 > 分享 > python 使用Tensorflow训练BP神经网络实现鸢尾花分类

python 使用Tensorflow训练BP神经网络实现鸢尾花分类

Python客栈送红包、纸质书

Hello,兄弟们,开始搞深度学习了,今天出第一篇博客,小白一枚,如果发现错误请及时指正,万分感谢。

使用软件

Python 3.8,Tensorflow2.0

问题描述

鸢尾花主要分为狗尾草鸢尾(0)、杂色鸢尾(1)、弗吉尼亚鸢尾(2)。
人们发现通过计算鸢尾花的花萼长、花萼宽、花瓣长、花瓣宽可以将鸢尾花分类。
所以只要给出足够多的鸢尾花花萼、花瓣数据,以及对应种类,使用合适的神经网络训练,就可以实现鸢尾花分类。

搭建神经网络

输入数据是花萼长、花萼宽、花瓣长、花瓣宽,是n行四列的矩阵。
而输出的是每个种类的概率,是n行三列的矩阵。
我们采用BP神经网络,设X为输入数据,Y为输出数据,W为权重,B偏置。有

y=x∗w+b

因为x为n行四列的矩阵,y为n行三列的矩阵,所以w必须为四行三列的矩阵,每个神经元对应一个b,所以b为一行三列的的矩阵。
神经网络如下图。

所以,只要找到合适的w和b,就能准确判断鸢尾花的种类。
下面就开始对这两个参数进行训练。

训练参数

损失函数

损失函数表达的是预测值(y*)和真实值(y)的差距,我们采用均方误差公式作为损失函数。

损失函数值越小,说明预测值和真实值越接近,w和b就越合适。
如果人来一组一组试,那肯定是不行的。所以我们采用梯度下降算法来找到损失函数最小值。
梯度:对函数求偏导的向量。梯度下降的方向就是函数减少的方向。

其中a为学习率,即梯度下降的步长,如果a太大,就可能错过最优值,如果a太小,则就需要更多步才能找到最优值。所以选择合适的学习率很关键。

参数优化

通过反向传播来优化参数。
反向传播:从后向前,逐层求损失函数对每层神经元参数的偏导数,迭代更新所有参数。
比如

可以看到w会逐渐趋向于loss的最小值0。
以上就是我们训练的全部关键点。

代码

数据集

我们使用sklearn包提供的鸢尾花数据集。共150组数据。
打乱保证数据的随机性,取前120个为训练集,后30个为测试集。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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)

参数

1

2

3

4

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1))

训练

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

a = 0.1 

epoch = 500 

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)) 

        grads = tape.gradient(loss, [w1, b1])

        w1.assign_sub(a * grads[0]) 

        b1.assign_sub(a * grads[1]) 

测试

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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)

    predict = tf.argmax(y, axis=1) 

    predict = tf.cast(predict, dtype=y_test.dtype)

    correct = tf.cast(tf.equal(predict, 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

print("测试准确率 = %.2f %%" % (acc * 100.0))

my_test = np.array([[5.9, 3.0, 5.1, 1.8]])

print("输入 5.9  3.0  5.1  1.8")

my_test = tf.convert_to_tensor(my_test)

my_test = tf.cast(my_test, tf.float32)

y = tf.matmul(my_test, w1) + b1

y = tf.nn.softmax(y)

species = {0: "狗尾鸢尾", 1: "杂色鸢尾", 2: "弗吉尼亚鸢尾"}

predict = np.array(tf.argmax(y, axis=1))[0] 

print("该鸢尾花为:" + species.get(predict))

结果:

结语

以上就是全部内容,鸢尾花分类作为经典案例,应该重点掌握理解。有一起学习的伙伴可以把想法打在评论区,大家多多交流,我也会及时回复的!

以上就是python 使用Tensorflow训练BP神经网络实现鸢尾花分类的详细内容,更多关于python 训练BP神经网络实现鸢尾花分类的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

Python机器学习利用鸢尾花数据绘制ROC和AUC曲线Python sklearn库实现PCA教程(以鸢尾花分类为例)python KNN算法实现鸢尾花数据集分类python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)Python机器学习性能度量利用鸢尾花数据绘制P-R曲线

相关知识

基于BP神经网络对鸢尾花的分类的研究
Python 基于BP神经网络的鸢尾花分类
TensorFlow学习记录(八)
卷积神经网络实现鸢尾花数据分类python代码实现
搭建简单的神经网络——使用pytorch实现鸢尾花的分类
深度学习入门——基于TensorFlow的鸢尾花分类实现(TensorFlow
TensorFlow 2建立神经网络分类模型——以iris数据为例
使用神经网络模型进行鸢尾花分类 matlab神经网络分类鸢尾花
神经网络与深度学习
Tensorflow鸢尾花分类(数据加载与特征处理)

网址: python 使用Tensorflow训练BP神经网络实现鸢尾花分类 https://m.huajiangbk.com/newsview550792.html

所属分类:花卉
上一篇: 第一个深度学习入门项目——使用A
下一篇: 易得花网络贷款不当催收