На этом шаге мы рассмотрим задание начальных параметров сети.
Начнем с инициализации. Мы знаем, что нам необходимо задать количество узлов входного, скрытого и выходного слоев. Эти данные определяют конфигурацию и размер нейронной сети. Вместо того чтобы жестко задавать их в коде, мы предусмотрим установку соответствующих значений в виде параметров во время создания объекта нейронной сети. Благодаря этому можно будет без труда создавать новые нейронные сети различного размера.
В основе нашего решения лежит одно важное соображение. Хорошие программисты, ученые-компьютерщики и математики при всяком удобном случае стараются писать обобщенный код, не зависящий от конкретных числовых значений. Это хорошая привычка, поскольку она вынуждает нас более глубоко продумывать решения, расширяющие применимость программы. Следуя ей, мы сможем использовать наши программы в самых разных сценариях. В данном случае это означает, что мы будем пытаться разрабатывать код для нейронной сети, поддерживающий как можно больше открытых опций и использующий как можно меньше предположений, чтобы его можно было легко применять в различных ситуациях. Мы хотим, чтобы один и тот же класс мог создавать как небольшие нейронные сети, так и очень большие, требуя лишь задания желаемых размеров сети в качестве параметров.
Кроме того, нам нельзя забывать о коэффициенте обучения. Этот параметр также можно устанавливать при создании новой нейронной сети. Посмотрите, как может выглядеть функция инициализации __init__() в подобном случае.
# инициализировать нейронную сеть def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): # задать количество узлов во входном, скрытом и выходном слое self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes # коэффициент обучения self.lr = learningrate
Добавим этот код в наше определение класса нейронной сети и попытаемся создать объект небольшой сети с тремя узлами в каждом слое и коэффициентом обучения, равным 0,3.
# количество входных, скрытых и выходных узлов input_nodes = 3 hidden_nodes = 3 output_nodes = 3 # коэффициент обучения равен 0,3 learning_rate = 0.3 # создать экземпляр нейронной сети n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
Конечно же, данный код позволяет получить объект сети, но такой объект пока что не будет особенно полезным, потому что не содержит ни одной функции, способной выполнять полезную работу. Впрочем, тут нет ничего плохого, это нормальная практика - начинать с малого и постепенно наращивать код, попутно находя и устраняя ошибки.
Исключительно для проверки того, что мы ничего не упустили, ниже показано, как выглядит блокнот IPython с определением класса нейронной сети и кодом для создания объекта.
Рис.1. Определение класса нейронной сети и создание объекта нейронной сети
Что дальше? Мы сообщили объекту нейронной сети, сколько узлов разных типов нам необходимо иметь, но для фактического создания узлов пока что ничего не сделали.
На следующем шаге мы рассмотрим определение весовых коэффициентов сети.