构建一个3层的bp神经网络隐层的大小为10输入层为4个特征输出层为3个分类实现BP神经网络分类算法根据鸢尾花的4个特征实现3种鸢尾花的分类数据集为iris给出模型的损失值与准确率需要实现模型内部代码不建议直接调用库要求一:熟悉反向传播算法流程及代码实现要求二:实验结果要有损失函数和准确率的曲线变化使用python语言编写
首先,我们需要导入所需的库:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
接着,我们需要定义一些参数:
# 定义学习率
learning_rate = 0.1
# 定义迭代次数
num_iterations = 10000
# 定义隐层大小
hidden_layer_size = 10
# 定义输入层大小
input_layer_size = 4
# 定义输出层大小
output_layer_size = 3
然后,我们需要定义一些函数,包括sigmoid函数、sigmoid函数的导数、前向传播函数、反向传播函数和损失函数:
# sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# sigmoid函数的导数
def sigmoid_derivative(x):
return x * (1 - x)
# 前向传播函数
def forward_propagation(X, W1, b1, W2, b2):
# 计算隐层输入
hidden_layer_input = np.dot(X, W1) + b1
# 计算隐层输出
hidden_layer_output = sigmoid(hidden_layer_input)
# 计算输出层输入
output_layer_input = np.dot(hidden_layer_output, W2) + b2
# 计算输出层输出
output_layer_output = sigmoid(output_layer_input)
return hidden_layer_output, output_layer_output
# 反向传播函数
def backward_propagation(X, Y, W1, b1, W2, b2, hidden_layer_output, output_layer_output):
# 计算输出层误差
output_layer_error = Y - output_layer_output
# 计算输出层的delta
output_layer_delta = output_layer_error * sigmoid_derivative(output_layer_output)
# 计算隐层误差
hidden_layer_error = np.dot(output_layer_delta, W2.T)
# 计算隐层的delta
hidden_layer_delta = hidden_layer_error * sigmoid_derivative(hidden_layer_output)
# 更新W2和b2
W2 += learning_rate * np.dot(hidden_layer_output.T, output_layer_delta)
b2 += learning_rate * np.sum(output_layer_delta, axis=0, keepdims=True)
# 更新W1和b1
W1 += learning_rate * np.dot(X.T, hidden_layer_delta)
b1 += learning_rate * np.sum(hidden_layer_delta, axis=0, keepdims=True)
return W1, b1, W2, b2
# 损失函数
def compute_loss(Y, output_layer_output):
return np.mean(np.square(Y - output_layer_output))
接下来,我们需要加载数据集并进行预处理:
# 加载数据集
iris = load_iris()
# 获取特征和标签
X = iris.data
Y = iris.target
# 将标签转换为独热编码
Y = np.eye(output_layer_size)[Y]
# 将数据集分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 对训练集和测试集进行归一化处理
X_train = (X_train - np.mean(X_train, axis=0)) / np.std(X_train, axis=0)
X_test = (X_test - np.mean(X_train, axis=0)) / np.std(X_train, axis=0)
现在,我们可以开始训练模型了。首先,我们需要初始化权重和偏置:
# 初始化W1、b1、W2、b2
np.random.seed(42)
W1 = np.random.randn(input_layer_size, hidden_layer_size)
b1 = np.zeros((1, hidden_layer_size))
W2 = np.random.randn(hidden_layer_size, output_layer_size)
b2 = np.zeros((1, output_layer_size))
然后,我们需要迭代训练模型,并记录损失值和准确率:
# 记录损失值和准确率
train_losses = []
test_losses = []
train_accuracies = []
test_accuracies = []
for i in range(num_iterations):
# 前向传播
hidden_layer_output, output_layer_output = forward_propagation(X_train, W1, b1, W2, b2)
# 计算损失值
train_loss = compute_loss(Y_train, output_layer_output)
# 计算准确率
train_accuracy = np.mean(np.argmax(output_layer_output, axis=1) == np.argmax(Y_train, axis=1))
# 反向传播
W1, b1, W2, b2 = backward_propagation(X_train, Y_train, W1, b1, W2, b2, hidden_layer_output, output_layer_output)
# 在测试集上进行预测
hidden_layer_output, output_layer_output = forward_propagation(X_test, W1, b1, W2, b2)
# 计算测试集上的损失值和准确率
test_loss = compute_loss(Y_test, output_layer_output)
test_accuracy = np.mean(np.argmax(output_layer_output, axis=1) == np.argmax(Y_test, axis=1))
# 记录损失值和准确率
train_losses.append(train_loss)
test_losses.append(test_loss)
train_accuracies.append(train_accuracy)
test_accuracies.append(test_accuracy)
# 打印训练过程中的损失值和准确率
if i % 1000 == 0:
print("Iteration:", i, "Train Loss:", train_loss, "Train Accuracy:", train_accuracy, "Test Loss:", test_loss, "Test Accuracy:", test_accuracy)
最后,我们可以绘制损失值和准确率的曲线:
# 绘制损失值的曲线
plt.plot(train_losses, label="Train Loss")
plt.plot(test_losses, label="Test Loss")
plt.legend()
plt.show()
# 绘制准确率的曲线
plt.plot(train_accuracies, label="Train Accuracy")
plt.plot(test_accuracies, label="Test Accuracy")
plt.legend()
plt.show()
完整代码如下:
原文地址: https://www.cveoy.top/t/topic/bGNG 著作权归作者所有。请勿转载和采集!