Ознакомьтесь с предыдущим руководством:

DL01: написание нейронной сети с нуля (теория)

Привет, хакеры, время еще одного перерыва на кофе!

На этот раз приступим к кодированию.

Сопроводительный код можно найти здесь.

Numpy используется для математических вычислений в Python.

Укроп используется для хранения всех переменных в файле Python, чтобы их можно было загрузить позже. Установить с помощью pip3 install dill.

Теперь создадим класс для neural_network:

И класс для слоя:

Ладно, приступим!

Класс neural_network выполняет следующие функции:

  • __init__: В качестве входных данных принимает 4 элемента:
    1. num_layers: количество слоев в сети.
    2. num_nodes: это список размера num_layers, определяющий количество узлов в каждом слое. < br /> 3. Activation_function: это также список, определяющий функцию активации для каждого уровня (функция активации для первого уровня обычно будет None. Она может принимать значения sigmoid, tanh, relu, softmax.
    4. cost_function: функция для вычисления ошибки между прогнозируемым выходом и фактической меткой / целью. Может принимать значения mean_squared, cross_entropy.
    - Слои инициализируются заданным количеством узлов в каждом слое. Инициализируются веса, связанные с каждым слоем.
  • train: требуется 6 входов:
    1. batch_size: размер мини-пакета для градиентного спуска.
    2. Input: входные данные, передаваемые в сеть.
    3. label: целевые значения. < br /> 4. num_epochs: количество эпох, т.е. сколько раз программа должна повторять все обучение.
    5. Learning_rate: скорость обучения для алгоритма, как описано в DL01.
    6. filename: The имя файла, в котором после обучения будут сохранены все переменные. (имя файла должно иметь расширение .pkl).
    - Во-первых, есть цикл для итерации по количеству эпох. Затем существует вложенный цикл для перебора всех мини-пакетов. После этого в мини-пакете вызываются forward_pass, calculate_error и back_pass (что согласуется с тем, что мы узнали в DL01).
  • forward_pass: Требуется всего 1 вход:
    1. Входы: мини-пакет входов.
    - Эта функция умножает входные данные на веса, применяет функцию активации и сохраняет выходные данные как активации следующего уровня. Этот процесс повторяется для всех слоев, пока в выходном слое не появятся некоторые активации.
  • Calcul_error: также принимает 1 вход:
    1. label: Мини-пакет этикеток.
    - Эта функция вычисляет ошибку между предсказанным выходом (т.е. активациями на выходном слое после прямого прохода) и целью ценности. Эта ошибка затем распространяется по сети в функции back_pass.
  • back_pass: Требуется 1 вход:
    1. label: Мини-пакет этикеток.
    - Эта функция реализует алгоритм обратного распространения. Подробно об этом алгоритме будет рассказано в отдельном посте. По сути, он вычисляет градиент, умножает его на скорость обучения и вычитает произведение из существующих весов. Это делается для всех слоев, от последнего до первого.
  • прогноз: требуется 2 входа:
    1. filename: файл, из которого должна быть загружена обученная модель.
    2. input: ввод, для которого мы хотим получить прогноз.
    - Он прямой проход, а затем преобразует вывод в одноразовое кодирование, т.е. максимальный элемент массива равен 1, а все остальные - 0.
  • check_accuracy: Требуется 3 входа:
    1. filename: Файл, из которого должна быть загружена обученная модель.
    2. Входы: Входные тестовые данные.
    3. label: Целевые тестовые данные.
    - Эта функция выполняет почти то же самое, что и predict. Но вместо того, чтобы возвращать предсказанный результат, он сравнивает предсказания с метками, а затем вычисляет точность как correct*100/total.

Слой класса выполняет следующие функции:

  • __init__: принимает 3 аргумента:
    1. num_nodes_in_layer: количество узлов в этом слое.
    2. num_nodes_in_next_layer: количество узлов в следующем слое.
    3. Activ_function: функция активации для этого слой.
    - Эта функция вызывается из конструктора класса neural_network. Он инициализирует один уровень за раз. Вес последнего слоя установлен на None.

Этот пост подробно объяснил код. Хотя сверточные нейронные сети (CNN) намного лучше работают с изображениями, я обучил нейронную сеть на MNIST только для того, чтобы почувствовать это. О CNN мы поговорим в одном из следующих постов в блоге.

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