iris_torch.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from sklearn import datasets
  2. import torch
  3. iris = datasets.load_iris()
  4. x, y = torch.tensor(iris.data, dtype=torch.float32), torch.tensor(iris.target, dtype=torch.long)
  5. INPUT_DIM = 4 # входные параметры
  6. OUTPUT_DIM = 3 # ответы нейронной сети
  7. H_DIM = 5 # Количество нейронов в слое
  8. EPOCH = 100 # Количество эпох
  9. Learning_rate = 0.5 # скорость обучения
  10. two_layer_net = torch.nn.Sequential( # структура нейросети
  11. torch.nn.Linear(INPUT_DIM, H_DIM),
  12. torch.nn.ReLU(),
  13. torch.nn.Linear(H_DIM, OUTPUT_DIM),
  14. torch.nn.Softmax(dim=-1)
  15. )
  16. loss_func = torch.nn.CrossEntropyLoss() # ошибка
  17. optim = torch.optim.SGD(two_layer_net.parameters(), lr=Learning_rate)
  18. history = []
  19. for epoch in range(EPOCH):
  20. #Forward
  21. y_pred = two_layer_net(x)
  22. #Loss
  23. loss = loss_func(y_pred, y)
  24. #Backward
  25. loss.backward()
  26. #Learning
  27. optim.step()
  28. optim.zero_grad()
  29. history.append(loss.item())
  30. import matplotlib.pyplot as plt
  31. plt.plot(history,label='loss')
  32. plt.show()
  33. x_new = torch.tensor([7.1, 3.5 , 4.7, 1.3], dtype=torch.float32)
  34. class_iris = ['setosa', 'versicolor', 'virginica']
  35. print(class_iris[torch.argmax(two_layer_net(x_new))])
  36. def calc_accuracy():
  37. correct = 0
  38. for i in range(len(y)):
  39. z = two_layer_net(x[i])
  40. y_pred = torch.argmax(z)
  41. if y_pred == y[i]:
  42. correct += 1
  43. acc = correct / len(y)
  44. return acc
  45. accuracy = calc_accuracy()
  46. print("Accuracy: ", accuracy)