цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Как обучить нейронную сеть на основе персептрона



Как обучить нейронную сеть на основе персептрона

Автор: Mike(admin) от 20-12-2019, 03:55

Обучение нейронной сети с примером кода на Python


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


Как обучить нейронную сеть на основе персептрона

Функция активации в выходном узле довольно проста:


Как обучить нейронную сеть на основе персептрона

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


Как обучить нейронную сеть на основе персептрона

В оставшейся части этой статьи мы рассмотрим код Python, который мы использовалм для получения этих весов. Вот этот код:



import pandas

import numpy as np


input_dim = 3


learning_rate = 0.01


Weights = np.random.rand(input_dim)

#Weights[0] = 0.5

#Weights[1] = 0.5

#Weights[2] = 0.5


Training_Data = pandas.read_excel("3D_data.xlsx")


Expected_Output = Training_Data.output


Training_Data = Training_Data.drop(['output'], axis=1)


Training_Data = np.asarray(Training_Data)

training_count = len(Training_Data[:,0])


for epoch in range(0,5):

    for datum in range(0, training_count):

        Output_Sum = np.sum(np.multiply(Training_Data[datum,:], Weights))

        

        if Output_Sum < 0:

            Output_Value = 0

        else:

            Output_Value = 1

        

        error = Expected_Output[datum] - Output_Value

        

        for n in range(0, input_dim):

            Weights[n] = Weights[n] + learning_rate*error*Training_Data[datum,n] 


print("w_0 = %.3f" %(Weights[0]))

print("w_1 = %.3f" %(Weights[1]))    

print("w_2 = %.3f" %(Weights[2]))

Давайте внимательнее посмотрим на эти инструкции.


input_dim = 3

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


learning_rate = 0.01

Мы обсудим этот параметр (скорость обучения) в следующей статье.



Weights = np.random.rand(input_dim)
#Weights[0] = 0.5
#Weights[1] = 0.5
#Weights[2] = 0.5

Веса обычно инициализируются случайными значениями. Функция numey random.rand() генерирует массив длины input_dim, заполненный случайными значениями, распределенными по интервалу (0, 1). Однако начальные значения веса влияют на конечные значения веса, полученные в результате процедуры обучения нейронной сети, поэтому, если вы хотите оценить влияние других переменных (таких как размер тренировочного набора или скорость обучения), вы можете устранить этот мешающий фактор, установив все веса в известную константу вместо случайно сгенерированного числа.


Training_Data = pandas.read_excel("3D_data.xlsx")

Мы используюем библиотеку pandas для импорта данных тренировок из электронной таблицы Excel. Следующая статья более подробно расскажет о таких данных.



Expected_Output = Training_Data.output
Training_Data = Training_Data.drop(['output'], axis=1)

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



Training_Data = np.asarray(Training_Data)
training_count = len(Training_Data[:,0])

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


for epoch in range(0,5):

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


for datum in range(0, training_count):

Процедура, содержащаяся в этом цикле, выполняется один раз для каждой строки в обучающем наборе, где «строка» относится к группе значений входных данных и соответствующему выходному значению (в нашем случае группа ввода состоит из трех чисел, представляющих x, y и z компоненты точки в трехмерном пространстве).


Output_Sum = np.sum(np.multiply(Training_Data[datum,:], Weights))

Выходной узел должен суммировать значения, полученные тремя входными узлами. Данная реализация Python делает это, сначала выполняя поэлементное умножение массива Training_Data и массива Weights, а затем вычисляя суммирование элементов в массиве, полученных этим умножением.



if Output_Sum < 0:
Output_Value = 0
else:
Output_Value = 1

Оператор if-else применяет функцию активации с единичным шагом: если сумма меньше нуля, значение, сгенерированное выходным узлом, равно 0; если сумма равна или больше нуля, выходное значение равно единице.


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


Как обучить нейронную сеть на основе персептрона

Символ α обозначает скорость обучения. Таким образом, чтобы вычислить новое значение веса, мы умножаем соответствующее входное значение на скорость обучения и разницу между ожидаемым выходным значением (которое обеспечивается обучающим набором) и рассчитанным выходным значением, а затем добавляется результат этого умножения. к текущему значению веса. Если мы определим δ как разницу между ожидаемым и высчитанным выходными значениями, то сократим предыдущее уравнение до следующего.


Как обучить нейронную сеть на основе персептрона

Вот как мы реализовали правило обучения в Python.


error = Expected_Output[datum] - Output_Value
for n in range(0, input_dim):
Weights[n] = Weights[n] + learning_rate*error*Training_Data[datum,n]

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




© digitrode.ru


Теги: нейронная сеть, искусственный интеллект, машинное обучение




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

Комментарии:

Оставить комментарий