Файл: Лабораторная работа 6 обновление весовых коэффициентов. Набор рукописных цифр mnist.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 29.11.2023

Просмотров: 158

Скачиваний: 13

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИCTEPCTBO НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИФедеральное государственное автономное образовательное учреждениевысшего образования«СЕВЕРО-КАВКАЗСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»Лабораторная работа № 6 ОБНОВЛЕНИЕ ВЕСОВЫХ КОЭФФИЦИЕНТОВ. НАБОР РУКОПИСНЫХ ЦИФР MNIST.







Выполнил:







Студент(ка) 2 курса направления подготовки
нефтегазовое дело,
гр. НГД-б-о-21-2

Баходиров Камолиддин
3.04.2023

Проверил:

Доцент кафедры информатики

Отметка о выполнении _________________________Ставрополь, Цель: рассмотреть процесс обновления весовых коэффициентов; подготовить тренировочные данные MNIST для проекта нейронной сети по распознаванию рукописных цифр.Контрольные вопросы1. В чем заключается метод градиентного спуска?Ответ: Метод градиентного спуска – это действительно хороший способ нахождения минимума функции, и он прекрасно работает, когда функция настолько сложна, что ее математическая обработка алгебраическими методами сопряжена с большими трудностями.2. Назовите преимущества метода градиентного спуска?Ответ: Преимущества этого метода по-настоящему проявляется в случае функций, зависящих от многих параметров. Например, вместо зависимости у от х мы можем иметь зависимость от a, b, с, d, е и f.3. Что означает функция ошибки (ошибка)? Как подсчитать ошибку?Ответ: Первым кандидатом на роль функции ошибки является простая разность значений (целевое – фактическое). Функция ошибки представляет собой сумму возведенных в квадрат разностей между целевым и фактическим значениями, где суммирование осуществляется по всем n выходным узлам.
4. Что представляют собой коэффициентом обучения нейронной сети?Ответ: Обновленный вес w jk – это старый вес с учетом отрицательной поправки, величина которой пропорциональна производной функции ошибки. Поправка записана со знаком «минус», поскольку мы хотим, чтобы вес увеличивался при отрицательной производной и уменьшался при положительной. Символ α (альфа) – это множитель, сглаживающий величину изменений во избежание перескоков через минимум. Этот коэффициент часто называют коэффициентом обучения.5. Каким образом происходит обновление весовых коэффициентов в процессе обучения нейронной сети?Ответ: Обновленный вес w jk – это старый вес с учетом отрицательной поправки, величина которой пропорциональна производной функции ошибки.6. Что представляют собой набор рукописных цифр MNIST?Ответ: Существует коллекция изображений рукописных цифр, используемых исследователями искусственного интеллекта в качестве популярного набора для тестирования идей и алгоритмов. Этим тестовым набором является база данных рукописных цифр под названием «MNIST», предоставляемая авторитетным исследователем нейронных сетей Яном Лекуном.7. Что такое распознавание образов?Ответ: Распознавание образов – корректная классификация содержимого изображений с помощью компьютера.8. Что такое тренировочный набор?Ответ: Тренировочный набор содержит 60 000 промаркированных экземпляров, используемых для тренировки нейронной сети. Слово «промаркированные» означает, что для каждого экземпляра указан соответствующий правильный ответ.9. Что такое тестовый набор?Ответ: Меньший тестовый набор, включающий 10 000 экземпляров, используется для проверки правильности работы идей или алгоритмов. Он также содержит корректные маркеры, позволяющие увидеть, способна ли наша нейронная сеть дать правильный ответ.Практические заданияКод:import numpy# библиотека scipy.special с сигмоидой expit ()import scipy.special# определение класса нейронной сети

class neuralNetwork:# инициализировать нейронную сетьdef __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):# задать количество узлов во входном, скрытом и выходном слоеself.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes# Матрицы весовых коэффициентов связей wih и who.# Весовые коэффициенты связей между узлом i и узлом j# следующего слоя обозначены как w__i__j:# wll w21# wl2 w22 и т.д.self.wih = numpy.random.normal (0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))self.who = numpy.random.normal (0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))# коэффициент обученияself.lr = learningrate# использование сигмоиды в качестве функции активацииself.activation_function = lambda x: scipy.special.expit(X)pass# тренировка нейронной сетиdef train (self, inputs_list, targets_list):# преобразование списка входных значений# в двухмерный массивinputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, ndmin=2).T# рассчитать входящие сигналы для скрытого слояhidden_inputs = numpy.dot(self.wih, inputs)# рассчитать исходящие сигналы для скрытого слояhidden_outputs = self.activation_function(hidden_inputs)# рассчитать входящие сигналы для выходного слояfinal_inputs = numpy.dot(self.who, hidden_outputs)# рассчитать исходящие сигналы для выходного слояfinal_outputs = self.activation_function(final_inputs)# ошибки выходного слоя =# (целевое значение - фактическое значение)output_errors = targets - final_outputs# ошибки скрытого слоя - это ошибки output_errors,# распределенные пропорционально весовым коэффициентам связей# и рекомбинированные на скрытых узлахhidden_errors = numpy.dot(self.who.T, output_errors)# обновить весовые коэффициенты для связей между# скрытым и выходным слоямиself.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose (hidden_outputs))# обновить весовые коэффициенты для связей между# входным и скрытым слоямиself.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose (inputs))pass# опрос нейронной сетиdef query(self, inputs_list):# преобразовать список входных значений# в двухмерный массивinputs = numpy.array(inputs_list, ndmin=2).T# рассчитать входящие сигналы для скрытого слояhidden_inputs = numpy.dot(self.wih, inputs)# рассчитать исходящие сигналы для скрытого слояhidden_outputs = self.activation_function(hidden_inputs)
# рассчитать входящие сигналы для выходного слояfinal_inputs = numpy.dot(self.who, hidden_outputs)# рассчитать исходящие сигналы для выходного слояfinal_outputs = self.activation_function(final_inputs)return final_outputsinput_nodes = 784hidden_nodes = 100output_nodes = 10# коэффициент обучения равен 0,3learning_rate = 0.3# создать экземпляр нейронной сетиn = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)# загрузить в список тестовый набор данных CSV-файла набора MNISTtraining_data_file = open("mnist_train.csv", 'r')training_data_list = training_data_file.readlines ()training_data_file.close()# тренировка нейронной сети# перебрать все записи в тренировочном наборе данныхfor record in training_data_list:# получить список значений, используя символы запятой (',')# в качестве разделителейall_values = record.split(',')# масштабировать и сместить входные значенияinputs = (numpy.asfarray(all_values[1:] / 255.0 * 0.99) + 0.01# создать целевые выходные значения (все равны 0,01, за исключением# желаемого маркерного значения, равного 0,99)targets = numpy.zeros(output_nodes) + 0.01# all_values[0] - целевое маркерное значение для данной записиtargets[int(all_values[0])] = 0.99n.train(inputs, targets)pass