当前位置:   article > 正文

python实现BP神经网络模型对鸢尾花分类_python实现bp神经网络分类

python实现bp神经网络分类

        这里没有用pytorch,直接通过逻辑实践,使用的是梯度下降算法,由于本身计算量不大,所以没有采用其他的优化器,当然可以使用Adam之类的更优化的算法。参数设置哪里可以修改使得准确率提高。

  1. import numpy as np
  2. from sklearn.datasets import load_iris
  3. from sklearn.model_selection import train_test_split
  4. import matplotlib.pyplot as plt
  5. # 预处理数据
  6. iris = load_iris()
  7. X, y = iris.data, iris.target
  8. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  9. X_train = X_train.T # 调整数据维度
  10. X_test = X_test.T
  11. y_train = y_train.reshape(1, -1) # 调整标签维度
  12. y_test = y_test.reshape(1, -1)
  13. n, m = X_train.shape
  14. # 参数设置
  15. input_size = n
  16. hidden_size = 10
  17. output_size = 3
  18. learning_rate = 0.01
  19. epochs = 1000
  20. L1 = []
  21. # 初始化参数
  22. np.random.seed(0)
  23. W1 = np.random.randn(hidden_size, input_size) * 0.01 # random.randn函数生成一个大小为(hidden_size, input_size)的随机数组,并将其乘以0.01
  24. b1 = np.zeros((hidden_size, 1)) # 创建一个hidden_size行1列的0矩阵
  25. W2 = np.random.randn(output_size, hidden_size) * 0.01
  26. b2 = np.zeros((output_size, 1))
  27. L1 = []
  28. # 定义激活函数
  29. def relu(x):# 这里意思就是取最大值
  30. return np.maximum(0, x)
  31. # 训练模型
  32. for epoch in range(epochs):
  33. # 前向传播
  34. Z1 = np.dot(W1, X_train) + b1 # x矩阵*w矩阵
  35. A1 = relu(Z1) # 通过relu函数
  36. Z2 = np.dot(W2, A1) + b2
  37. A2 = np.exp(Z2) / np.sum(np.exp(Z2), axis=0) # softmax激活函数
  38. # 计算损失
  39. logprobs = -np.log(A2[y_train, range(m)]) #这些预测概率值取对数
  40. cost = np.sum(logprobs) / m
  41. L1.append(cost)
  42. # 反向传播
  43. dZ2 = A2
  44. dZ2[y_train, range(m)] -= 1
  45. dW2 = np.dot(dZ2, A1.T) / m
  46. db2 = np.sum(dZ2, axis=1, keepdims=True) / m # keepdims=True表示保持原有数组的维度
  47. dA1 = np.dot(W2.T, dZ2)
  48. dZ1 = dA1 * (Z1 > 0)
  49. dW1 = np.dot(dZ1, X_train.T) / m
  50. db1 = np.sum(dZ1, axis=1, keepdims=True) / m
  51. # 更新参数,进行梯度下降算法
  52. W2 -= learning_rate * dW2
  53. b2 -= learning_rate * db2
  54. W1 -= learning_rate * dW1
  55. b1 -= learning_rate * db1
  56. if epoch % 100 == 0:
  57. print(f'Epoch {epoch}, cost: {cost}')
  58. L1.append(cost)
  59. # 模型评估
  60. Z1 = np.dot(W1, X_test) + b1
  61. A1 = relu(Z1)
  62. Z2 = np.dot(W2, A1) + b2
  63. A2 = np.exp(Z2) / np.sum(np.exp(Z2), axis=0)
  64. predictions = np.argmax(A2, axis=0)
  65. accuracy = np.mean(predictions == y_test)
  66. # 绘制图像
  67. plt.plot(np.arange(len(L1)), L1, label='Training Loss')
  68. plt.xlabel('epochs') # 横坐标轴标题
  69. plt.ylabel('the change of losses') # 纵坐标轴标题
  70. plt.show()
  71. print('Test accuracy:', accuracy)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/358914
推荐阅读
相关标签
  

闽ICP备14008679号