Обучение нейронной сети с примером кода на 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