Ознакомьтесь с предыдущим руководством:
Привет, хакеры, время еще одного перерыва на кофе!
На этот раз приступим к кодированию.
Сопроводительный код можно найти здесь.
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 мы поговорим в одном из следующих постов в блоге.
Надеюсь, теперь вы сможете сами реализовать нейронную сеть с нуля. Удачного кодирования!