代码:

  1. from sklearn.datasets import load_iris, load_boston
  2. from sklearn.model_selection import train_test_split
  3. import torch
  4. from torch.nn import functional as F
  5. from torch import nn
  6. from sklearn.metrics import accuracy_score, confusion_matrix
  7. import numpy as np
  8. class NeuralNetworksModel(nn.Module):
  9. """神经网络模型"""
  10. def __init__(self, x_dim, y_dim, hidden_size):
  11. super().__init__()
  12. self.hidden_1 = nn.Linear(x_dim, hidden_size)
  13. self.liner = nn.Linear(hidden_size, y_dim)
  14. def forward(self, x):
  15. out_1 = F.relu(self.hidden_1(x))
  16. out = self.liner(out_1)
  17. return out
  18. class IrisDataDeal():
  19. """数据处理"""
  20. def __init__(self):
  21. self.data = None
  22. self.target = None
  23. self.target_names = None
  24. def get_data(self):
  25. iris_data = load_iris()
  26. self.data = iris_data.get('data')
  27. self.target = iris_data.get('target')
  28. self.target_names = iris_data.get('target_names')
  29. return train_test_split(self.data, self.target, test_size=0.2)
  30. class IrisClassify():
  31. def __init__(self, model, data):
  32. self.model = model
  33. self.X_train, self.X_test, self.y_train, self.y_test = data.get_data()
  34. # 迭代次数
  35. self.steps = 1000
  36. # 学习率
  37. self.learning_rate = 0.01
  38. def data_trans_form(self):
  39. X_train = torch.tensor(self.X_train, dtype=torch.float32)
  40. X_test = torch.tensor(self.X_test, dtype=torch.float32)
  41. y_train = torch.tensor(self.y_train, dtype=torch.float32)
  42. y_test = torch.tensor(self.y_test, dtype=torch.float32)
  43. return X_train, X_test, y_train, y_test
  44. def train_model(self):
  45. # 策略: 交叉熵
  46. loss_func = F.cross_entropy
  47. op = torch.optim.Adam(self.model.parameters(), lr=self.learning_rate)
  48. X_train, X_test, y_train, y_test = self.data_trans_form()
  49. for step in range(self.steps):
  50. # 前向传播,计算损失
  51. # 交叉熵损失不需要自己进行one-hot编码
  52. loss = loss_func(self.model(X_train), y_train.long())
  53. # 反向传播
  54. loss.backward()
  55. # 更新参数
  56. op.step()
  57. # 梯度清0
  58. op.zero_grad()
  59. if step % 100 == 0:
  60. print('loss: %s' % loss.item())
  61. # 保存模型省略
  62. # 打印训练集 准确度和混淆矩阵
  63. outputs = model(X_train)
  64. predict = torch.max(outputs.data, 1)[1].cpu()
  65. train_acc = accuracy_score(y_train.long(), predict)
  66. print(train_acc)
  67. confusion = confusion_matrix(y_train.long(), predict)
  68. print(confusion)
  69. # 打印测试集 准确度和预测结果与真实结果
  70. test_outputs = model(X_test)
  71. predict_test = torch.max(test_outputs.data, 1)[1].cpu()
  72. test_acc = accuracy_score(y_test.long(), predict_test)
  73. print(test_acc)
  74. print(predict_test.numpy())
  75. print(np.array(y_test.numpy(), dtype=np.int))
  76. if __name__ == '__main__':
  77. iris_data = IrisDataDeal()
  78. model = NeuralNetworksModel(4, 3, 4)
  79. IrisClassify(model, iris_data).train_model()