Шаг 50.
Основы создания нейросети на Python. Создаем нейронную сеть на Python. Проект нейронной сети на Python. Текущее состояние кода

    На этом шаге мы приведем полный текст приложения и создадим простую нейронную сеть.

    Сделаем паузу и переведем дыхание, чтобы посмотреть, как выглядит в целом код, который мы к этому времени создали. А выглядит он так.

# определение класса нейронной сети 
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:
        # w11 w21
        # w12 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)


    # тренировка нейронной сети 
    def train():
        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.асtivation_function(final_inputs)

        return final_outputs

    Но это только определение класса, перед которым в первой ячейке блокнота IPython следует поместить код, импортирующий модули numpy и scipy.special.

import numpy
# библиотека scipy.special с сигмоидой expit() 
import scipy.special

    Попутно отметим, что функции query() в качестве входных данных потребуются только входные сигналы input_list. Ни в каких других входных данных она не нуждается.

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

    Прежде чем переходить к написанию кода функции train(), осуществляющей тренировку сети на примерах, протестируем, как работает уже имеющийся код. Для этого создадим небольшую сеть и предоставим ей некоторые входные данные. Очевидно, что никакого реального смысла результаты содержать не будут, но нам важно лишь проверить работоспособность всех созданных функций.

    В следующем примере создается небольшая сеть с входным, скрытым и выходным слоями, содержащими по три узла, которая опрашивается с использованием случайно выбранных входных сигналов (1.0, 0.5 и -1.5).


Рис.1. Пример создания сети

    Архив блокнота с созданной сетью можно взять здесь.

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

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

    На следующем шаге мы начнем тренировать сеть.




Предыдущий шаг Содержание Следующий шаг