лаба 6. баходиров.камолиддин. Лабораторная работа 6 обновление весовых коэффициентов. Набор рукописных цифр mnist
Скачать 0.53 Mb.
|
МИНИCTEPCTBO НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «СЕВЕРО-КАВКАЗСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» Лабораторная работа № 6 ОБНОВЛЕНИЕ ВЕСОВЫХ КОЭФФИЦИЕНТОВ. НАБОР РУКОПИСНЫХ ЦИФР MNIST.
Отметка о выполнении _________________________ Ставрополь, Цель: рассмотреть процесс обновления весовых коэффициентов; подготовить тренировочные данные 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 = inputnodes self.hnodes = hiddennodes self.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).T targets = 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_outputs input_nodes = 784 hidden_nodes = 100 output_nodes = 10 # коэффициент обучения равен 0,3 learning_rate = 0.3 # создать экземпляр нейронной сети n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate) # загрузить в список тестовый набор данных CSV-файла набора MNIST training_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.99 n.train(inputs, targets) pass |