СРАВНЕНИЕ ПОДХОДОВ К НАПИСАНИЮ НЕЙРОННЫХ СЕТЕЙ НА PYTHON
М.Д. Баранов, студент Д.А. Кузьмин, студент Ж.С. Жукова, старший преподаватель
Московский технический университет связи и информатики (Россия, г. Москва)
DOI:10.24412/2500-1000-2024-5-1-175-180
Аннотация. Нейронные сети широко используются в научных исследованиях для обработки и анализа данных. В статье проведено сравнение способов написания нейронных сетей на языке программирования Python на примере набора данных «Ирисов Фишера»: без использования фреймворков и с использованием библиотеки PyTorch. Также рассмотрены различные инструменты, используемые при создании нейронных сетей, проведено сравнение результатов для обоих способов и сделаны выводы.
Ключевые слова: Python, TensorFlow, PyTorch, Keras, нейросети.
Использование нейронных сетей в научных исследованиях является важным направлением развития современных информационных технологий. Существует множество подходов к написанию нейронных сетей на Python, включая различные фреймворки и инструменты, такие как TensorFlow, PyTorch, Keras и другие [1]. Каждый из этих подходов имеет свои особенности, преимущества и недостатки. Однако в статье будут рассмотрены только два способа написания нейросетей: без ис-
пользования фреймворков и использование фреймворка PyTorch.
Для достижения поставленной цели за основу была выбрана базовая задача классификации набора данных «Ирисов Фишера». Этот набор данных включает 50 образцов каждого из трех видов ирисов: Iris Setosa, Iris virginica и Iris versicolor. Для каждого образца были измерены четыре признака: длина и ширина чашелистиков и лепестков в сантиметрах [2]. Пример данных представлен на рисунке 1.
Рис. 1. Пример данных из набора «Ирисов Фишера» [2]
Задача нейронной сети заключается в том, чтобы обработать четыре типа данных на входе и на выходе выдать правильный ответ, соответствующий одному из трех видов ирисов. В рамках данной статьи это будет проделано двумя способами,
тем самым рассмотрев гибкость и эффективность каждого подхода.
Архитектура нейросети представляет собой простой «Перцептрон», включающий в себя три слоя: входной, скрытый и выходной. По условию задачи на вход подается 4 параметра, следовательно, первый
слой будет иметь 4 нейрона. В скрытом слое будет 8 узлов (наиболее эффективное число). Выходной слой состоит из 3 нейрона, так как цель нейросети - выбрать один из трёх типов цветка.
Первым шагом в любом проекте машинного обучения является подготовка данных для дальнейшего её обучения и проверки [3] (рис. 2).
# Запись датасета из файла з переменную при помсаци библиотеки panda, s
dataset = pd.read_csv{1 IRIS.csv' )
# Записываем тренирозочные/тестозые данные и отзеты з разные переменные
df = dataset.copy() # dataframs
x = df.drop{['species'], axis=l) # Тренировочные/тестовые у = df [' species ' ] # Отзегь:
# Преобразование значений з числсзые значения label_encoder = LabelEncoder{)
у = label_encoder. fit_transfогт{у)
# Разделение данных на тренировочные и тестсзые(x train - вход, у train - зыход)
x_train, x_test, y_train, y_test = train_test_splitfx, y, test_size=0.2, random_state=42]
# Следующий блок кода расширяет тренировочные ответы для нейросети
# Это необходимо сделать r Tas: как изначальные данные представлены з следующем # з виде - [G G 1 G ... G 1 2] г где каждой цифре ссстзетстзует зид цзетка. А # нейросети для проверки на сколько она ошиблась нужны данные зида:
# [[1, G, 0], [1, 0, 0], ... [О, G, 1]], где индекс цифры 1 в
# списках ссстзетстзует виду цзетка. new_y_train = []
for i in range{len{y_train) ) :
new_y_train.append([1 if j == y_train[i] else 0 for j in range(3 ) ] )
y_train = new_y_train
new_y_test = []
for i in range{len{y_test)):
new_y_test.append([1 if j = y_test[i] else 0 for j in range {3 ) ] ) y_te s t = new_y_te s t
Рис. 2. Обработка данных
Для этого загружаем набор данных Iris из CSV-файла, используя библиотеку Pandas. Далее обрабатываем их через модуль scikit-learn. И впоследствии разделяем данные на обучающий и тестовый наборы. Для этой цели используем функцию train_test_split от scikit-learn.
Для обучения нейронной сети используется функция активации ReLU для скры-
того слоя и активацию softmax для выходного слоя. Обучение проводится с применением стохастического градиентного спуска (SGD). Во время каждой итерации вычисляется прямой проход, для получения предсказания, затем вычисляем потери. Веса обновляются с помощью обратного распространения, корректируя их для минимизации потерь [4] (рис. 3).
for interation in range(iterations): # Кол-во эпох
error, correct_cnt = (0.0, 0) # Процент ошибок (loss) и верных ответов (accuracy)
for i in range(len(x_train)):
layer_0 = x_train[i:i +1] # Входные данные
# Проход вперёд через скрытый слой с функцией активации ReLU.
layer_l = relu(np.dot(layer_0, weights_0_l))
# Проход зперёд через выходной слой с функцией активации softmax,
# предсказывающий вероятности принадлежности к каждому классу.
layer_2 = softmax(пр.dot(layer_l, weights_l_2))
# Вычисление ошибки по сравнению с целевым значением.
error += пр.sum((layer_2 - y_train[i:i +1]) ** 2)
# Подсчёт числа правильно классифицированных примеров.
correct_cnt += int(пр.argmax(layer_2) == пр.argmax(y_train[i:i + 1]))
# Вычисление ошибки для выходного слоя.
layer_2_delta = (y_train[i:i + 1] - layer_2)
# Обратное распространение ошибки к скрытому слою.
layer_l_delta = layer_2_delta.dot(weights_l_2.T) *
relu2deriv(layer_l)
weights_l_2 += alpha * layer_l.T.dot(layer_2_delta) # Обновление весов
weights_0_l += alpha * layer_O^JTjdotXlayer_l_delta)
Рис. 3. Код обучения нейронной сети
После того как модель обучалась, необходимо проверить её эффективность на тестовом наборе данных и визуализиро-
Train accuracy/loss
«л
Irt
о
ры
(H
>>
и и
L
=> 0« U
и
19
02
Как показывают графики, нейросеть довольно эффективно предсказывает тип цветка на данных, которые она ни разу не видела.
Теперь рассмотрим следующий способ создания нейронных сетей с использованием фреймворков. В этом подходе возь-
вать точность и потери обучения и тестирования по эпохам, используя matplotlib (рис. 4).
Validation accuracy
-accuracy
to _I-
/
« m ioo oo epoch
мём библиотеку PyTorch [5]. Для этого можем воспользоваться модулем torch.nn, который предоставляет удобные инструменты для создания и обучения нейронных сетей. Написание нейронной сети на фреймворке PyTorch сводится к следующим пунктам:
Рис. 4. Графики работы модели
1. Определение класса нейронной сети. В PyTorch обычно создают классы для определения структуры. Они содержат информацию о слоях, а также метод forward, который описывает процесс прямого прохода.
2. Обучение нейронной сети. Для обучения с помощью PyTorch, обычно используются стандартные практики, такие как определение функции потерь (loss function), выбор оптимизатора (optimizer) и итерации обучения.
3. Оценка эффективности модели. После обучения модели важно оценить ее эффективность на тестовом наборе данных. Это можно сделать, вычислив точность предсказаний и графики потерь и точности модели.
Такой подход обеспечивает высокую гибкость и расширяемость, позволяя использовать полный потенциал выбранного языка программирования без каких-либо ограничений для пользователя. Код и график представлены на рисунках 5, 6 и 7.
class NeuralNetwork(nn.Module):
def _init_(self) : # Конструктор родительского класса
nn.Module
super(NeuralNetwork, self)._init_()
# Создание полносзязного слоя с входишь размером 4 и выходным 8
# Этот слой будет выполнять операцию линейного преобразования с
# весами и смещением
self.fcl = nn.Linear(4, 8)
self.fc2 = nn.Linear(8, 3)
def forward(self, x): # Метод определяет процесс пря^^ого прохода
# Функция активации ReLU к выходу первого слоя
х = torch.relu(self.fcl(x))
# Применяет второй полносвязный слой к выходу первого слоя,
# возвращая выходные данные нейронной сети
x = self.fc2(x)
return x
Рис. 5. Класс нейросети
# Training the model
for epoch in range(1000):
optimizer.zero_grad() # Обнуление градиентов всех параметров модели
outputs = model(X_train) # Получает прогнозы для X train
loss = criterion(outputs, y_train) # Функция потерь между outputs и y_train
# Обратное распространение ошибки, вычисляя градиенты функций потерь
# по параметрам модели loss.backward()
# Обновление параметров модели, используя вычисленные градиенты и
# стратегию оптимизации optimizer.step()
# Отключение автоматического вычисления градиентов во избежание лишних вычислений
with torch.no_grad{):
outputs = model(X_test)
# Находит индексы классов с наибольшими значениями в выходах модели, что
# соответствует предсказанным классам
predicted = torch.max(outputs, 1)
# Вычисляет точность модели, сравнивая предсказанные классы с истинными метками и вычисляя долю правильных ответов
accuracy = (predicted == y_test).sum().item() / y_test.size(0)
print(f'Accuracy : {accuracy}')
Рис. 6. Обучение нейросети
0 200 40С 600 800 1000 0 200 «0 600 800 1000
epoch epoch
Рис. 7. Графики потерь и точности
Из графиков видно, что нейросеть также успешно научилась предсказывать тип цветка, так же, как и предыдущая модель, написанная вручную. Из чего можно сделать вывод, что 2 созданные нейросети работают идентично.
В заключении можно сказать, что оба подхода к созданию нейронных сетей имеют свои преимущества и недостатки, и выбор конкретного подхода зависит от
конкретной задачи, уровня опыта разработчика и требуемого уровня контроля над моделью. Ручное создание может быть предпочтительным для обучения и понимания основных принципов нейронных сетей, в то время как использование фреймворка может быть более эффективным для быстрого прототипирования и развертывания моделей в реальных приложениях.
Библиографический список
1. Жукова, Ж.С. Геотермические взаимодействия на метеостанции Восток: базовые алгоритмы машинного обучения и температурное прогнозирование / Ж.С. Жукова, А.А. Тимофеев-Каракозов // Тенденции развития науки и образования. - 2024. - № 105-14. - С. 26-30. - DOI 10.18411/trnio-01-2024-689. - EDN WSTTBB.
2. Iris Flower Dataset / Kaggle. - [Электронный ресурс]. - Режим доступа: https://www.kaggle.com/datasets/arshid/iris-flower-dataset/data.
3. Neural networks: A Tutorial / Iris Classification. - [Электронный ресурс]. - Режим доступа: https://www.kaggle.com/code/motahareshokri/neural-networks-a-tutorial-iris-classification/notebook.
4. Траск Эндрю. Грокаем глубокое обучение. - Санкт-Петербург: Питер, 2020. - 352 с.
5. PyTorch 2.2 documentation. - [Электронный ресурс]. - Режим доступа: https://pytorch.org/docs/stable/index. html.
COMPARISON OF APPROACHES TO WRITING NEURAL NETWORKS IN PYTHON
M.D. Baranov, Student D.A. Kuzmin, Student Z.S. Zhukova, Senior Lecturer
Moscow Technical University of Communications and Informatics (Russia, Moscow)
Abstract. Neural networks are widely used in scientific research for data processing and analysis. The article compares the ways of writing neural networks in the Python programming language using the example of the Fischer Irises dataset: without using frameworks and using the PyTorch library. Various tools used in the creation of neural networks are also considered, the results for both methods are compared and conclusions are drawn. Keywords: Python, TensorFlow, PyTorch, Keras, neural networks.