代码:
from sklearn.datasets import load_iris, load_bostonfrom sklearn.model_selection import train_test_splitimport torchfrom torch.nn import functional as Ffrom torch import nnfrom sklearn.metrics import accuracy_score, confusion_matriximport numpy as npclass NeuralNetworksModel(nn.Module): """神经网络模型""" def __init__(self, x_dim, y_dim, hidden_size): super().__init__() self.hidden_1 = nn.Linear(x_dim, hidden_size) self.liner = nn.Linear(hidden_size, y_dim) def forward(self, x): out_1 = F.relu(self.hidden_1(x)) out = self.liner(out_1) return outclass IrisDataDeal(): """数据处理""" def __init__(self): self.data = None self.target = None self.target_names = None def get_data(self): iris_data = load_iris() self.data = iris_data.get('data') self.target = iris_data.get('target') self.target_names = iris_data.get('target_names') return train_test_split(self.data, self.target, test_size=0.2)class IrisClassify(): def __init__(self, model, data): self.model = model self.X_train, self.X_test, self.y_train, self.y_test = data.get_data() # 迭代次数 self.steps = 1000 # 学习率 self.learning_rate = 0.01 def data_trans_form(self): X_train = torch.tensor(self.X_train, dtype=torch.float32) X_test = torch.tensor(self.X_test, dtype=torch.float32) y_train = torch.tensor(self.y_train, dtype=torch.float32) y_test = torch.tensor(self.y_test, dtype=torch.float32) return X_train, X_test, y_train, y_test def train_model(self): # 策略: 交叉熵 loss_func = F.cross_entropy op = torch.optim.Adam(self.model.parameters(), lr=self.learning_rate) X_train, X_test, y_train, y_test = self.data_trans_form() for step in range(self.steps): # 前向传播,计算损失 # 交叉熵损失不需要自己进行one-hot编码 loss = loss_func(self.model(X_train), y_train.long()) # 反向传播 loss.backward() # 更新参数 op.step() # 梯度清0 op.zero_grad() if step % 100 == 0: print('loss: %s' % loss.item()) # 保存模型省略 # 打印训练集 准确度和混淆矩阵 outputs = model(X_train) predict = torch.max(outputs.data, 1)[1].cpu() train_acc = accuracy_score(y_train.long(), predict) print(train_acc) confusion = confusion_matrix(y_train.long(), predict) print(confusion) # 打印测试集 准确度和预测结果与真实结果 test_outputs = model(X_test) predict_test = torch.max(test_outputs.data, 1)[1].cpu() test_acc = accuracy_score(y_test.long(), predict_test) print(test_acc) print(predict_test.numpy()) print(np.array(y_test.numpy(), dtype=np.int))if __name__ == '__main__': iris_data = IrisDataDeal() model = NeuralNetworksModel(4, 3, 4) IrisClassify(model, iris_data).train_model()