Движок нейронных сетей, написанный с нуля без использования библиотек для машинного обучения.
Имеет своей целью исключительно демонстрацию принципа работы и обучения нейронной сети, то есть является исключительно учебным пособием. Практическое использование движка для решения прикладных задач не имеет смысла, так как он серьезно уступает по производительности решениям, основанным на tensorflow.
Для демонстрации работоспособности движка реализована нейросеть, которая учится распознавать цифры на монохромных изображениях формата xpm и разрешения 16x16.
Обучающая выборка находится в директории numbers
. Поддиректории с именами 0-9
содержат наборы изображений соответствующих им цифр. Поддиректория test
содержит 10 файлов для каждой цифры, имеющие в именах соответствующие им цифры.
Запуск обучения и последующего тестирования работоспособности сети осуществляется командой:
python3 test_numbers.py
Создание нейронной сети:
from structs import NeuralNetwork
import activation
nn = NeuralNetwork() # создаем нейронную сеть
nn.add_input_layer(3) # добавляем входной слой
nn.add_layer(4) # добавляем скрытый слой
nn.add_layer(5,
activation_class=activation.ActivationSigmoid,
random_radius=2) # добавляем скрытый слой с явно задаными параметрами
nn.add_layer(2) # добавляем выходной слой
Установка входных сигналов и выполнение прямого прохода:
nn.run([1, 1, 0])
Обучение нейросети на обучающей выборке с заданным коэффициентом скорости:
# готовим обучающую выборку
train_data = [
[[1, 0, 0], [1, 0]], # [[набор входных сигналов], [эталонные сигналы на выходе]]
[[0, 1, 0], [1, 1]],
[[0, 0, 1], [0, 1]],
[[1, 0, 1], [1, 1]],
[[0, 0, 0], [0, 0]],
]
# обучаем нейросеть
for i in range(30):
loss_total = nn.train(train_data, 0.1)
# выполняем прогон на тестовом примере
nn.run([1, 1, 0])
# получаем данные на выходе сети
print(nn.get_output())