Разработка алгоритма на языке программирования Python «Обучение нейронной сети»

XXI Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Разработка алгоритма на языке программирования Python «Обучение нейронной сети»

Пуховская А.В. 1
1МБОУ Брянская СОШ
Кречман О.А. 1
1МБОУ Брянская СОШ
Автор работы награжден дипломом победителя III степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

В настоящее время нейронные сети, относящиеся к направлению искусственного интеллекта (далее - ИИ), применяются в нашей окружающей действительности, можно сказать, уже повсеместно. Сейчас нейросети могут писать музыку, создавать изображения, и со временем они становятся все больше похожими на оригинал. Это комплексная задача, которая может состоять из нескольких предыдущих. Например, «дорисовка» человека на фотографии — задача распознавания и прогнозирования одновременно. Нейронные сети используют для распознавания скрытых закономерностей в необработанных данных, группировки и классификации, а также решения задач в области ИИ, машинного и глубокого обучения

Все вышеперечисленное позволило нам выдвинуть гипотезу: мы предполагаем, что в домашних условиях можно обучить нейронную сеть распознавать людей на фотографии, где изображено множество людей.

Целью нашей работы является приобретение практических навыков в области программирования для обучения нейронных сетей и разработка алгоритма этого обучения.

Сначала надо было разобраться, что представляет собой ИИ, нейронная сеть, для чего они нужны и где встречаются в обыденной жизни. Мы пришли к выводу, что для этого нужно почитать книги по информатике, ИИ, программированию.

Мы поставили перед собой следующие задачи:

  1. Изучить научную и учебную литературу по основам ИИ, историю нейронных сетей

  2. Познакомиться со средой программирования Python на углубленном уровне

  3. Сформулировать задачу для искусственного интеллекта

  4. Разработать алгоритм на языке Python и создать приложение для обучения нейронной сети

  5. Запустить код, произвести отладку программы

  6. Провести эксперимент с фотографиями, на которых изображено множество людей

Объектом исследования является обучение нейронной сети.

Предмет исследования – алгоритм для создания приложения на языке Python по обучению нейронной сети

Методы исследования: метод машинного обучения, изучение компьютерных технологий и математики. Метод искусственного интеллекта — это способ, а фактически, — алгоритм решения какой-либо задачи. Существует большое количество направлений развития искусственного интеллекта. Мы же рассмотрим только один небольшой пример.

Этапы работы: подготовительный, практический, аналитический.

Структура интеллектуальной системы включает три основных блока — базу знаний, решатель и интеллектуальный интерфейс, позволяющий вести общение с ЭВМ без специальных программ для ввода данных.

Глава 1

1.1 Что такое нейронные сети?

Нейронные сети это компьютерные системы, которые моделируют работу мозга человека и могут обучаться на большом количестве данных. Они состоят из большого количества простых элементов, которые называются нейронами1.

Нейроны соединены между собой и обрабатывают информацию, проходящую через сеть. Каждый нейрон принимает входные сигналы от других нейронов и обрабатывает их с помощью внутренней функции активации. Затем результат передается следующему нейрону, и так далее.

Нейронные сети используются в различных областях, таких как распознавание образов, распознавание речи, анализ текстов, прогнозирование временных рядов и т.д. Они также могут использоваться для создания искусственного интеллекта и управления сложными системами.

Нейронные сети имеют множество преимуществ перед другими методами машинного обучения. Они могут обучаться на неструктурированных данных, могут выделять важные признаки в данных и могут находить сложные зависимости между признаками. Кроме того, они могут работать в режиме реального времени и быстро обрабатывать большие объемы данных.

Существует много различных типов нейронных сетей, каждый из которых имеет свои уникальные свойства и применения.

Например, сверточные нейронные сети широко используются для обработки изображений и видео, рекуррентные нейронные сети используются для обработки последовательностей, а глубокие нейронные сети используются для решения сложных задач, таких как распознавание речи и обработка естественного языка.

Одним из ключевых преимуществ нейронных сетей является их способность к адаптации к новым данным. После того как нейронная сеть была обучена на некотором наборе данных, она может быть использована для обработки новых данных без необходимости повторного обучения.

Кроме того, нейронные сети могут работать с неструктурированными данными, такими как изображения, аудио и текст, что делает их особенно полезными для решения задач в различных областях, таких как медицина, финансы, промышленность и многое другое. Нейронные сети продолжают развиваться, и с каждым годом появляются новые архитектуры и методы обучения. Это позволяет решать все более сложные задачи и создавать более точные модели, которые могут использоваться в широком спектре областей и приложений.

1.2. История развития нейронных сетей

История развития нейронных сетей началась еще в конце XIX века, когда некоторые ученые начали исследовать работу мозга и попытались создать компьютерную модель его функционирования. Однако в первой половине XX века из-за ограниченности вычислительных ресурсов и недостаточности знаний о мозге исследования в этой области продвигались медленно.

В 1943 году два исследователя, Уоррен Маккаллок и Уолтер Питтс, создали первую модель искусственного нейрона. Они предложили модель, которая состояла из нейрона, который принимал несколько входных сигналов и производил один выходной сигнал, в зависимости от входных данных. Эта модель нейрона стала основой для дальнейшего развития нейронных сетей.

В 1950-х годах Фрэнк Розенблатт разработал персептрон, который стал первой многослойной нейронной сетью. Он использовал алгоритм обратного распространения ошибки, чтобы обучить сеть распознавать образы. Однако персептрон имел ряд ограничений, которые привели к остановке исследований в области нейронных сетей на несколько десятилетий.

В 1980-х годах исследователи начали разрабатывать новые типы нейронных сетей, которые позволяли решать более сложные задачи. Были созданы рекуррентные нейронные сети, которые способны обрабатывать последовательности, а также сверточные нейронные сети, которые используются для обработки изображений и видео.

В 1990-е годы нейронные сети стали широко применяться в задачах распознавания речи и обработки естественного языка. В 2000-х годах нейронные сети начали использоваться в коммерческих приложениях, таких как распознавание речи и обработка естественного языка.

С развитием компьютерных технологий и увеличением доступности вычислительных ресурсов, нейронные сети стали все более популярными.

В 2012 году сверточная нейронная сеть, названная AlexNet, достигла значительного успеха в ImageNet Large Scale Visual Recognition Challenge, что привело к появлению большого интереса к нейронным сетям2.

Сегодня нейронные сети широко применяются в различных областях, таких как распознавание образов, распознавание речи, машинный перевод, генерация изображений, анализ данных и многих других.

Нейронные сети продолжают развиваться и улучшаться, и будущее этой технологии кажется очень перспективным. В последние десять лет deep learning и компьютерное зрение развивались неимоверными темпами. Все, что сделано значимого в этой области, произошло в последние лет шесть.

1.3. Обучение нейронной сети

Обучение нейронной сети происходит в два этапа: обучение и тестирование.

В процессе обучения нейронная сеть получает на вход набор данных и пытается выработать правила, которые помогут ей сделать правильный вывод на основе этих данных.

Во время тестирования нейронная сеть проверяется на новых данных, чтобы убедиться, что ее правила работают правильно.

Функция потерь (loss function)— это функция, которая измеряет, насколько хорошо нейронная сеть выполняет задачу, назначенную ей. Она вычисляет разницу между предсказанным выходом и фактическим выходом на каждой итерации обучения.

Цель обучения нейронной сети — минимизировать значение функции потерь.

В обучении нейронных сетей часто используется метод стохастического градиентного спуска (Stochastic Gradient Descent, SGD), который использует значение функции потерь для корректировки весов нейронной сети на каждой итерации. SGD работает путем вычисления градиента функции потерь по отношению к каждому весу и корректировки его на основе этого градиента. Это позволяет нейронной сети постепенно подстраиваться к оптимальным весам для решения задачи.

В зависимости от задачи нейронная сеть может использовать различные функции потерь, которые позволяют оценить ее точность и эффективность в решении задачи.

Когда нейронная сеть делает предсказания на тестовых данных, мы можем измерить, насколько она правильно справляется с задачей, используя функцию потерь. Функция потерь измеряет, как сильно предсказанные значения отличаются от фактических значений целевой переменной. Чем выше значение функции потерь, тем хуже производительность модели.

Кроме того, функция потерь используется во время обучения модели для определения, насколько хорошо модель выполняет задачу. В процессе обучения модель настраивает веса своих нейронов так, чтобы минимизировать функцию потерь. Этот процесс называется оптимизацией.

Обучение нейронной сети заключается в итеративном повторении этого процесса на различных примерах обучающей выборки. Цель состоит в том, чтобы минимизировать ошибку сети на обучающей выборке и при этом достичь хорошей обобщающей способности сети на новых данных.

Проблема переобучения (overfitting) возникает, когда нейронная сеть обучается слишком хорошо на тренировочных данных и показывает плохие результаты на новых данных. Такое происходит, когда нейронная сеть начинает запоминать тренировочные данные вместо того, чтобы выучивать общие закономерности.

Итак, в первой главе мы рассмотрели кратко понятие нейронной сети, историю ее развития, и описали, что значит обучить нейронку. А теперь перейдем к практике.

Глава 2

2.1. Разработка алгоритма и создание приложения по обучению нейронной сети

Для того, чтобы выполнить поставленную цель – создание приложения, нам необходимо было установить на свой компьютер интерпретатор языка программирования Python и среду разработки PyCharm, а также импортировать необходимые библиотеки PyQt6.

Начиная писать код, импортируем разные виджеты, такие, как окна, кнопки и т.д.:

from PyQt6.QWidgets

import QApplication, QHBoxLayout, QMainWindow, QPushButton, QSpinBox, QVBoxLayout, QWidget, QFileDialog, QLabel, QErrorMessage
from PyQt6.QtGui import QImage,QPixmap
import cv2
import numpy as np

Программный код полностью приведен в Приложении I.

Запускаем наш код, предварительно исправив все ошибки. Приложение готово (Приложение II)

Нажимаем Выбрать изображение. Указываем путь к нашей фотографии- Открыть. Нажимаем двойной щелчок мыши в Приложении на кнопке Процесс. Идет работа самого приложения некоторое время. Нейронная сеть распознает людей на фотографии. Цель наша достигнута.

Провели эксперимент на 5 фотографиях (Приложение III). Наша сеть обучается хорошо. Цель обучения – это уменьшение ошибок.

Таким образом, мы создали пример обучения нейронной сети на Python, которая распознает изображения (Приложение IV).

Мы исследовали один из методов обучения нейронной сети, написали алгоритм (программный код) для создания приложения, которое может обучать нейронную сеть и оно имеет практическую значимость (Приложение V). Наше приложение может обучить нейронную сеть распознавать и считать людей на фотографии.

Для примера мы использовали готовую нейронку.

Практическая значимость: работы заключается в том, что наше приложение, может быть использовано не только для распознавания людей, но и для распознавания различных животных, и других объектов.

Нейронные сети могут обучаться на неструктурированных данных, могут выделять важные признаки в данных и могут находить сложные зависимости между признаками. Кроме того, они могут работать в режиме реального времени и быстро обрабатывать большие объемы данных.

Заключение

Нейронные сети это одно из самых мощных средств машинного обучения в настоящее время. Они позволяют анализировать и предсказывать данные с высокой точностью и способны распознавать шаблоны и закономерности, которые не всегда могут быть выявлены простыми алгоритмами.

Однако использование нейронных сетей не всегда является оптимальным решением. Например, для решения простых задач, таких как нахождение максимального элемента в массиве, сортировка данных, поиск значений и т.д., можно использовать простые алгоритмы в Python, не прибегая к использованию нейронных сетей.

Кроме того, не всегда удается получить высокую точность работы нейронной сети при малом объеме данных. В таких случаях простые алгоритмы показывают более стабильные результаты.

Поэтому для принятия решения об использовании нейронных сетей необходимо учитывать объем и качество данных, сложность задачи и требования к точности работы. Также нужно учитывать наличие ресурсов для обучения и использования нейронных сетей.

В процессе работы над проектом мы пришли к выводу, что в домашних условиях вполне возможно обучить нейронку распознавать людей. Наше приложение еще пока не способно быть мыслящей машиной. Оно только выполняет те команды, которые заложены в программе.

Приложение может предоставлять хозяину помощь, например, работать в особо вредных и опасных условиях, а также в военных зонах.

Таким образом, задачи нашего исследования были успешно решены, цель достигнута, гипотеза подтвердилась. В процессе работы над проектом мы пришли к выводу, что в домашних условиях вполне возможно обучить нейронку.

Мы планируем и далее продолжать изучать возможности ИИ для создания новых проектов, в которых хотим использовать наше приложение для распознавания животных, птиц, человеческих эмоций.

Список использованных источников и литературы

  1. https://cloud.ru/ru/services/neural-networks - сайт «Полное сопровождение для решения бизнес-задач»

  2. https://start.1t.ru/c/index.html - сайт 1T Старт – курсы по программированию «Код будущего»

Приложение I

ПрограммныйкодПриложения

import sys
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QMainWindow, QPushButton, QSpinBox, QVBoxLayout, QWidget, \
QFileDialog, QLabel, QErrorMessage

from PyQt6.QtGui import QImage,QPixmap
import cv2
import numpy as np
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setWindowTitle("ImageTracer")
main_layout = QVBoxLayout()
top_bar_layout = QHBoxLayout()
image_bar_layout = QHBoxLayout()

self.source_filename = None
self.source_image_data = None
self.result_image_data = None
self.max_img_height = 400
self.max_img_width = 600
select_image_button = QPushButton('Select Image')
process_image_button = QPushButton(
'Process!')
select_image_button.clicked.connect(
self.choose_source_image)
process_image_button.clicked.connect(
self.process_image)
for btn in [select_image_button,process_image_button]:
btn.setFixedHeight(
30)
btn.setFixedWidth(
100)
self.r_select = QSpinBox()
self.g_select = QSpinBox()
self.b_select = QSpinBox()
self.threshold_select = QSpinBox()
for start_val, prefix, spinbox in zip([30,1,72,152],['Threshold','R','G','B'],
[
self.threshold_select,self.r_select,self.g_select,self.b_select]):
spinbox.setPrefix(
f'{prefix}:')
spinbox.setMinimum(
0)
spinbox.setMaximum(
255)
spinbox.setValue(start_val)
spinbox.setFixedWidth(
130)
top_bar_layout.addWidget(select_image_button)
top_bar_layout.addWidget(
self.r_select)
top_bar_layout.addWidget(
self.g_select)
top_bar_layout.addWidget(
self.b_select)
top_bar_layout.addWidget(
self.threshold_select)
top_bar_layout.addWidget(process_image_button)

self.source_image = ImageWidget()
self.result_image = ImageWidget()
self.source_image.setMaximumSize(self.max_img_width, self.max_img_height)
self.result_image.setMaximumSize(self.max_img_width, self.max_img_height)
source_image_layout = QVBoxLayout()
source_image_layout.addWidget(QLabel(
"Source image:"))
source_image_layout.addWidget(
self.source_image)
result_image_layout = QVBoxLayout()
result_image_layout.addWidget(QLabel(
"Result image:"))
result_image_layout.addWidget(
self.result_image)
image_bar_layout.addLayout(source_image_layout)
image_bar_layout.addLayout(result_image_layout)
bottom_bar_layout = QHBoxLayout()

self.save_button = QPushButton('Save as file')
self.save_button.clicked.connect(self.save_as_file)
self.save_button.setFixedWidth(300)
bottom_bar_layout.addWidget(
self.save_button)
self.percent_traced_label = QLabel()
bottom_bar_layout.addWidget(
self.percent_traced_label)
main_layout.addLayout(top_bar_layout)
main_layout.addLayout(image_bar_layout)
main_layout.addLayout(bottom_bar_layout)
widget = QWidget()
widget.setLayout(main_layout)

self.setCentralWidget(widget)
def choose_source_image(self):
self.source_filename=QFileDialog.getOpenFileName()[0]
self.source_image_data.cv2.imread(self.source_filename)
source_image_resized=resize_image(
self.source_image_data,self.max_img_width,self.max_img_height)
self.source_image.setPixmap(pixmap_from_cv_image(source_image_resized))
def process_image(self):
if self.source_image_data is None:
error_dialog=QErrorMessage()
error_dialog.showMessage(
'No image selected')
error_dialog.exec()

else:
self.result_image_data,percent_traced=get_image_mask(self.source_image_data,
[
self.r_select.value(),self.g_select.value(),
self.b_select.value()],
self.threshold_select.value())
self.percent_traced_label.setText(f'Percent of image traced: {(percent_traced * 100):.3f}%')
result_image_resized=resize_image(
self.result_image_data,self.max_img_width,self.max_img_height)
self.result_image.setPixmap(pixmap_from_cv_image(result_image_resized))
def save_as_file(self):
if self.result_image_data is None:
error_dialog=QErrorMessage()
error_dialog.showMessage(
'No image process')
error_dialog.exec()

else:
filename = QFileDialog.getSaveFileName(
self,'Save file')[0]
if len(filename)>0:
cv2.imwrite(filename,
self.result_image_data)
class ImageWidget(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.setScaledContents(True)
def hasHeightForWidth(self):
return self.pixmap() is not None
def
heightForWidth(self,w):
if self.pixmap():
try:
return int(w*(self.pixmap().height() / self.pixmap().width()))
except ZeroDivisionError:
return 0
def resize_image(image_data,max_img_width,max_img_height):
scale_percent =
min(max_img_width/image_data.shape[1],max_img_height/image_data.shape[0])
width =
int(image_data.shape[1]*scale_percent)
height =
int(image_data.shape[0]*scale_percent)
newSize = (width,height)
image_resized = cv2.resize(image_data,newSize,
None,None,None,cv2.INTER_AREA)
return image_resized
def pixmap_from_cv_image(cv_image):
height, width, _ =cv_image.shape
bytesPerLine =
3*width
qImg = QImage(cv_image.data,width,height,bytesPerLine,QImage.Format.Format_RGB888).rgbSwapped()

return QPixmap(qImg)
def get_image_mask(img,blue_shade,diff):
lower = np.array([
max(0,val)for val in [blue_shade[2]-diff,blue_shade[1]-diff,blue_shade[0]-diff]],
dtype=np.uint8)
upper=np.array([
min(255,val)for val in [blue_shade[2]+diff,blue_shade[1]+diff,blue_shade[0]+diff]],
dtype=np.uint8)
mask = cv2.inRange(img,lower,upper)
percent_traced = np.sum(mask>
0)/(mask.shape[0]*mask.shape[1])
return cv2.cvtColor(mask,cv2.COLOR_BGR2RGB),percent_traced
app =QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

Приложение II

Фото1. Общий вид Приложения

Приложение III

Фото 2. Приложение запущено в работу: выбор изображения

Приложение IV

Фото 3. Результат обучения нейронной сети

Приложение V

Фото 4. Юный программист за работой

1 https://start.1t.ru/c/index.html - сайт 1T Старт – курсы по программированию «Код будущего»

2 https://start.1t.ru/c/index.html - Обучающий курс «Код будущего»

Просмотров работы: 14