Сравнение подходов к написанию нейронных сетей на Python
Автор: Баранов М.Д., Кузьмин Д.А., Жукова Ж.С.
Журнал: Международный журнал гуманитарных и естественных наук @intjournal
Рубрика: Технические науки
Статья в выпуске: 5-1 (92), 2024 года.
Бесплатный доступ
Нейронные сети широко используются в научных исследованиях для обработки и анализа данных. В статье проведено сравнение способов написания нейронных сетей на языке программирования Python на примере набора данных «Ирисов Фишера»: без использования фреймворков и с использованием библиотеки PyTorch. Также рассмотрены различные инструменты, используемые при создании нейронных сетей, проведено сравнение результатов для обоих способов и сделаны выводы.
Нейросети
Короткий адрес: https://sciup.org/170205069
IDR: 170205069 | DOI: 10.24412/2500-1000-2024-5-1-175-180
Текст научной статьи Сравнение подходов к написанию нейронных сетей на Python
Использование нейронных сетей в научных исследованиях является важным направлением развития современных информационных технологий. Существует множество подходов к написанию нейронных сетей на Python, включая различные фреймворки и инструменты, такие как TensorFlow, PyTorch, Keras и другие [1]. Каждый из этих подходов имеет свои особенности, преимущества и недостатки. Однако в статье будут рассмотрены только два способа написания нейросетей: без ис-
пользования фреймворков и использование фреймворка PyTorch.
Для достижения поставленной цели за основу была выбрана базовая задача классификации набора данных «Ирисов Фишера». Этот набор данных включает 50 образцов каждого из трех видов ирисов: Iris Setosa, Iris virginica и Iris versicolor. Для каждого образца были измерены четыре признака: длина и ширина чашелистиков и лепестков в сантиметрах [2]. Пример данных представлен на рисунке 1.

unique values
4.3 5.1 |
7.9 |
2 3.5 |
4.4 |
1 1 .4 |
6.9 |
0.1 0.2 |
2.5 |
Iris-setosa |
4.9 |
3 |
1 .4 |
0.2 |
Iris-setosa |
||||
4.7 |
3.2 |
1.3 |
0.2 |
Iris-setosa |
||||
4.6 |
3.1 |
1 .5 |
0.2 |
Iris-setosa |
||||
5 |
3.6 |
1 .4 |
0.2 |
Iris-setosa |
||||
5.4 |
3.9 |
1.7 |
0.4 |
Iris-setosa |
Рис. 1. Пример данных из набора «Ирисов Фишера» [2]
Задача нейронной сети заключается в том, чтобы обработать четыре типа данных на входе и на выходе выдать правильный ответ, соответствующий одному из трех видов ирисов. В рамках данной статьи это будет проделано двумя способами,
тем самым рассмотрев гибкость и эффективность каждого подхода.
Архитектура нейросети представляет собой простой «Перцептрон», включающий в себя три слоя: входной, скрытый и выходной. По условию задачи на вход подается 4 параметра, следовательно, первый
слой будет иметь 4 нейрона. В скрытом слое будет 8 узлов (наиболее эффективное число). Выходной слой состоит из 3 нейрона, так как цель нейросети – выбрать один из трёх типов цветка.
Первым шагом в любом проекте машинного обучения является подготовка данных для дальнейшего её обучения и проверки [3] (рис. 2).
-
# Запись датасета из файла в переменную при полощи библиотеки pandas
-
# Записываем тренировочные/тестовые данные и ответы в равные переменные
-
# Преобразование значений в числовые значении
label_encoder = LabelEncoder ()
у = label_encoder. fit_transf oria(y)
-
# Разделение данных на тренировочные и тестовые (и train - вход, у train - выход)
x_train, x_test, y_train, y_test = train_test_split(х, у, test_size=O.2, random_state=42)
-
# Следующий блок кода расширяет тренировочные ответы для нейросети
-
# Это необходимо сделать, таи хак изначальные данные представлены в следующем ~ в виде -[0010... 012], где каждой цифре соответствует вид цветка. Л # нейросети для проверки насколько она сшиблась нужны данные вида:
-
# [[1, 0, 0], [1, 0, 0], ... [О, 0, 1] ] , где индекс цифры 1 в
-
~ списках соответствует виду цветка.
new_y_train - []
for i in range(len(y_train) ) :
y_train = new_y_train new_y_test = []
for i in range(len(y_test)):
y_test = new_y_test
Рис. 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(пр.dot(layer_0, weights_0_l))
-
# Проход вперёд через выходной слой с функцией активации softnax,
-
# предсказывающий вероятности принадлежности к каждому классу.
-
# Вычисление ошибки по сравнению с целевым значением.
error += пр.sum((layer_2 - y_train[i:i +1]) ** 2)
-
# Подсчёт числа правильно классифицированных примеров.
correct_cnt += int(пр.argmax(1ауег_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)
Рис. 3. Код обучения нейронной сети
После того как модель обучалась, необходимо проверить её эффективность на тестовом наборе данных и визуализиро-
вать точность и потери обучения и тестирования по эпохам, используя matplotlib (рис. 4).

Рис. 4. Графики работы модели
Как показывают графики, нейросеть довольно эффективно предсказывает тип цветка на данных, которые она ни разу не видела.
Теперь рассмотрим следующий способ создания нейронных сетей с использованием фреймворков. В этом подходе возь-
-
1. Определение класса нейронной сети. В PyTorch обычно создают классы для определения структуры. Они содержат информацию о слоях, а также метод forward, который описывает процесс прямого прохода.
-
2. Обучение нейронной сети. Для обучения с помощью PyTorch, обычно используются стандартные практики, такие как определение функции потерь (loss function), выбор оптимизатора (optimizer) и итерации обучения.
-
3. Оценка эффективности модели. После обучения модели важно оценить ее эффективность на тестовом наборе данных. Это можно сделать, вычислив точность предсказаний и графики потерь и точности модели.
Такой подход обеспечивает высокую гибкость и расширяемость, позволяя использовать полный потенциал выбранного языка программирования без каких-либо ограничений для пользователя. Код и график представлены на рисунках 5, 6 и 7.
def __init__(self) : # Конструктор родительского класса nn .Module super(NeuralNetwork, self) ._init__()
-
# Создание полносвязного слоя с входным размером 4 и выходным 8
-
# Этот слой будет выполнять операция линейного преобразования с
-
# весами и смещением
def forward(self, x) : # Метод определяет процесс прямого прохода
-
# Функция активации ReLU к выходу первого слоя
-
# Применяет второй полносвязный слой к выходу первого слоя,
-
# возвращая выходные данные нейронной сети
х = self.fс2(х)
return х
Рис. 5. Класс нейросети
-
# Training the model
for epoch in. range (1000):
optimizer.zero_grad() # Обнуление градиентов всех параметров модели outputs = model(X_train) # Получает прогнозы для
X train loss = criterion(outputs/ y_train) # Функция потери между outputs и у train
-
# Обратное распространение ошибки, вычисляя градиенты функций потерь
-
# по параметрам модели
loss.backward()
-
# Обновление параметров модели, используя вычисленные градиенты и
-
# стратегию оптимизации
-
# Отключение автоматического вычисления градиентов во избежание лишних вычислений
with torch. no_grad () :
outputs = model(X_test)
-
# Находит индексы классов с наибольшими значениями в выходах модели, что
-
# соответствует предсказанным классам
-
# Вычисляет точность модели, сравнивая предсказанные классы с истинными метками и вычисляя долю правильных ответов
print(f'Accuracy: {accuracy}')
Рис. 6. Обучение нейросети

Из графиков видно, что нейросеть также успешно научилась предсказывать тип цветка, так же, как и предыдущая модель, написанная вручную. Из чего можно сделать вывод, что 2 созданные нейросети работают идентично.
В заключении можно сказать, что оба подхода к созданию нейронных сетей имеют свои преимущества и недостатки, и выбор конкретного подхода зависит от
конкретной задачи, уровня опыта разработчика и требуемого уровня контроля над моделью. Ручное создание может быть предпочтительным для обучения и понимания основных принципов нейронных сетей, в то время как использование фреймворка может быть более эффективным для быстрого прототипирования и развертывания моделей в реальных приложениях.
Список литературы Сравнение подходов к написанию нейронных сетей на Python
- Жукова, Ж.С. Геотермические взаимодействия на метеостанции Восток: базовые алгоритмы машинного обучения и температурное прогнозирование / Ж.С. Жукова, А.А. Тимофеев-Каракозов // Тенденции развития науки и образования. - 2024. - № 105-14. - С. 26-30. DOI: 10.18411/trnio-01-2024-689 EDN: WSTTBB
- Iris Flower Dataset / Kaggle. - [Электронный ресурс]. - Режим доступа: https://www.kaggle.com/datasets/arshid/iris-flower-dataset/data.
- Neural networks: A Tutorial / Iris Classification. - [Электронный ресурс]. - Режим доступа: https://www.kaggle.com/code/motahareshokri/neural-networks-a-tutorial-iris-classification/notebook.
- Траск Эндрю. Грокаем глубокое обучение. - Санкт-Петербург: Питер, 2020. - 352 с.
- PyTorch 2.2 documentation. - [Электронный ресурс]. - Режим доступа: https://pytorch.org/docs/stable/index.html.