Файл: Лабораторная работа 8 по дисциплине Теория информации, данные, знания Исследование методов классификации данных с помощью нейронной сети.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 03.12.2023
Просмотров: 102
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Видим, что картина поменялась. Возможно, эта картина более адекватная. Судя по метрике, она "угадывает на валидации" немножко лучше, отделяет классы друг от друга, и можно сделать вывод, что для данной задачи два скрытых слоя – это слишком много, это переусложнение, и хватает всего одного скрытого слоя, даже более того: кажется, что от уменьшения сложности нейронной сети мы выигрываем в качестве.
import torch
import random
import numpy as np
##
random.seed(0)
np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed(0)
torch.backends.cudnn.deterministic = True
##
import sklearn.datasets
wine = sklearn.datasets.load_wine()
wine.data.shape
##
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
wine.data[:, :2],
wine.target,
test_size=0.3,
shuffle=True)
X_train = torch.FloatTensor(X_train)
X_test = torch.FloatTensor(X_test)
y_train = torch.LongTensor(y_train)
y_test = torch.LongTensor(y_test)
##
class WineNet(torch.nn.Module):
def __init__(self, n_hidden_neurons):
super(WineNet, self).__init__()
self.fc1 = torch.nn.Linear(2, n_hidden_neurons)
self.activ1 = torch.nn.Sigmoid()
self.fc2 = torch.nn.Linear(n_hidden_neurons, n_hidden_neurons)
self.activ2 = torch.nn.Sigmoid()
self.fc3 = torch.nn.Linear(n_hidden_neurons, 3)
self.sm = torch.nn.Softmax(dim=1)
def forward(self, x):
x = self.fc1(x)
x = self.activ1(x)
x = self.fc2(x)
x = self.activ2(x)
x = self.fc3(x)
return x
def inference(self, x):
x = self.forward(x)
x = self.sm(x)
return x
wine_net = WineNet(5)
##
##
loss = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(wine_net.parameters(),
lr=1.0e-3)
##
batch_size = 10
for epoch in range(5000):
order = np.random.permutation(len(X_train))
for start_index in range(0, len(X_train), batch_size):
optimizer.zero_grad()
batch_indexes = order[start_index:start_index+batch_size]
x_batch = X_train[batch_indexes]
y_batch = y_train[batch_indexes]
preds = wine_net.forward(x_batch)
loss_value = loss(preds, y_batch)
loss_value.backward()
optimizer.step()
if epoch % 100 == 0:
test_preds = wine_net.forward(X_test)
test_preds = test_preds.argmax(dim=1)
print((test_preds == y_test).float().mean())
##
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (10, 8)
n_classes = 3
plot_colors = ['g', 'orange', 'black']
plot_step = 0.02
x_min, x_max = X_train[:, 0].min() - 1, X_train[:, 0].max() + 1
y_min, y_max = X_train[:, 1].min() - 1, X_train[:, 1].max() + 1
xx, yy = torch.meshgrid(torch.arange(x_min, x_max, plot_step),
torch.arange(y_min, y_max, plot_step))
preds = wine_net.inference(
torch.cat([xx.reshape(-1, 1), yy.reshape(-1, 1)], dim=1))
preds_class = preds.data.numpy().argmax(axis=1)
preds_class = preds_class.reshape(xx.shape)
plt.contourf(xx, yy, preds_class, cmap='Accent')
for i, color in zip(range(n_classes), plot_colors):
indexes = np.where(y_train == i)
plt.scatter(X_train[indexes, 0],
X_train[indexes, 1],
c=color,
label=wine.target_names[i],
cmap='Accent')
plt.xlabel(wine.feature_names[0])
plt.ylabel(wine.feature_names[1])
plt.legend()
##
Задание на лабораторную работу
-
Изучить понятие кросс-энтропии и Softmax. -
Исследовать нейронную сеть при заданных начальных параметрах (см. таблицу). Найти минимальное значение , при котором сеть дает неудовлетворительные результаты, т.е. обучение невозможно. -
Исследовать зависимость точности распознавания от количества нейронов в скрытом слое, количества слоев, метода активации. -
При каком значении test_size сеть предсказывает хуже, чем Base Rate (BaseRate –это вероятность самого многочисленного класса в исходных данных)? И какой Base Rate у датасета вин?
Примечание: самый многочисленный класс датасета – первый.
Base Rate = len(wine.target[wine.target == 1]) / len(wine.target)
-
Исследовать зависимость времени обучения от размера батча.
Таблица. Начальные значения гиперпараметров нейронной сети
| Метод оптимизации | Число нейронов в скрытом слое n_hidden_neurons | Шаг градиентного спуска lr |
0 | ADAM | 10 | 0.01 |
1 | ADAM | 20 | 0.001 |
2 | ADAM | 30 | 0.01 |
3 | ADAM | 40 | 0.001 |
4 | ADAM | 5 | 0.01 |
5 | SGD | 10 | 0.001 |
6 | SGD | 20 | 0.01 |
7 | SGD | 30 | 0.001 |
8 | SGD | 40 | 0.01 |
9 | SGD | 50 | 0.001 |
Содержание отчета
-
Титульный лист -
Цель работы, постановка задачи исследования. -
Описание методики исследования. -
Результаты исследования в соответствии с заданием. -
Выводы по работе.