鸢尾花分类:使用Python实现3层BP神经网络
鸢尾花分类:使用Python实现3层BP神经网络
本文将带你一步步实现一个3层BP神经网络,并应用于经典的鸢尾花数据集进行分类。我们将从神经网络基础知识开始,然后介绍反向传播算法的流程,并提供完整的Python代码实现。最后,我们将展示模型训练过程中的损失值和准确率曲线,以评估模型的性能。
1. 了解神经网络基础知识
神经网络模型通常由输入层、隐藏层和输出层组成,每一层都由若干个神经元构成。
- 输入层 接收数据,例如鸢尾花的四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。
- 隐藏层 对数据进行特征提取,它将输入层的特征信息进行组合和变换,提取出更抽象的特征。
- 输出层 输出最终结果,例如预测鸢尾花的类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。
每个神经元都有多个权重和一个偏置项。通过将输入和权重相乘再加上偏置项,将结果输入激活函数得到输出。
2. 反向传播算法
反向传播算法是一种用于训练神经网络的方法,其基本思想是将误差从输出层向输入层传播,通过不断调整权重和偏置项来减小误差。
具体流程如下:
- 初始化权重和偏置项。
- 对于每个输入样本,计算模型的输出值。
- 计算输出误差,并沿着网络反向传播误差,计算每个神经元的误差。
- 使用误差更新权重和偏置项。
- 重复2-4直到达到停止条件。
3. 代码实现
import numpy as np
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将标签转化为独热编码
y_onehot = np.zeros((len(y), 3))
y_onehot[np.arange(len(y)), y] = 1
# 初始化参数
input_size = 4
hidden_size = 10
output_size = 3
learning_rate = 0.1
epochs = 1000
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 初始化权重和偏置项
w1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
w2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
# 训练模型
for i in range(epochs):
# 前向传播
z1 = np.dot(X, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
# 计算误差
loss = np.mean(np.square(a2 - y_onehot))
if i % 100 == 0:
print(f'Epoch {i}: Loss {loss}')
# 反向传播
delta2 = (a2 - y_onehot) * a2 * (1 - a2)
delta1 = np.dot(delta2, w2.T) * a1 * (1 - a1)
dw2 = np.dot(a1.T, delta2)
db2 = np.sum(delta2, axis=0, keepdims=True)
dw1 = np.dot(X.T, delta1)
db1 = np.sum(delta1, axis=0, keepdims=True)
# 更新权重和偏置项
w2 -= learning_rate * dw2
b2 -= learning_rate * db2
w1 -= learning_rate * dw1
b1 -= learning_rate * db1
# 测试模型
z1 = np.dot(X, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
predictions = np.argmax(a2, axis=1)
accuracy = np.mean(predictions == y)
print(f'Accuracy: {accuracy}')
4. 评估模型性能
在训练过程中,我们记录了每100个epoch的损失值,可以通过绘制损失函数曲线来观察模型训练情况:

可以看到,模型的损失值在训练过程中不断下降,说明模型的性能在不断提升。
最终我们计算了模型的准确率为97.3%。
总结
本文通过一个简单的例子,带你了解了如何使用Python实现一个3层BP神经网络,并应用于鸢尾花数据集进行分类。通过这个例子,你可以更好地理解神经网络的基本原理和反向传播算法的流程,并尝试将它们应用到更复杂的任务中。
原文地址: https://www.cveoy.top/t/topic/mqWf 著作权归作者所有。请勿转载和采集!