Ух, как продвинулся прогресс! Раньше создание своих нейронных сетей было занятием дико сложным, требующим понимания математики и нехилого программирования. Я даже нарисовал свою, на Сишарпе. Она, конечно, была простенькая, но я очень много понял (особенно хорошо я понял, почему ничего, кроме свёрточных сетей, для классификации изображений использовать невозможно — тупо памяти не хватит).
А теперь движок нейронных сетей не надо писать самому. Сначала появилась Caffe (я использовал её для одного из проектов в университете по поиску изображений), а потом Гугл открыл свой TensorFlow для всех. Но даже TensorFlow был ОЧЕНЬ непрост в использовании. А теперь выяснилось, что для TensorFlow написали кучу вменяемых библиотек, и создание нейронных сетей стало очень несложным занятием.
Их несколько, но больше всего мне понравилась библиотека keras. И дело не сколько в том, какая она хорошая, а в том, что для неё больше всего документации 🙂 В прошлый раз, когда я щупал нейронные сети, я использовал библиотеку TF-Slim. Документации для неё, можно сказать, не было. Пришлось хакать исходники примеров, чтобы получить что-то своё.
Но оцените, как это теперь просто!
Вот, например, Питонный код для создания простой нейронной сети из двух входных нейронов, 16 скрытых, и 3 выходных. На входе единички и нолики, представляющие собой True и False, и три выходных нейрона, один выдаёт результат логической операции XOR, второй AND, третий OR. Тренируется сеть меньше, чем за 1000 эпох (если увеличить количество нейронов в скрытом слое, то ещё быстрее).
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = tf.keras.Sequential()
model.add(layers.Dense(16, activation=’relu’))
model.add(layers.Dense(3))
model.compile(optimizer=’adam’, loss=’mean_squared_error’, metrics=[‘binary_accuracy’])
data = np.array([[0,0],[0,1],[1,0],[1,1]], “float32”)
labels = np.array([[0,0,0],[1,0,1],[1,0,1],[0,1,1]], “float32”)
model.fit(data, labels, epochs=1000)
print(model.predict(data).round())
Элементарщина же!
Осталось понять, чего прикольного теперь можно с этим сделать 🙂 Наверное, ничего — чтобы сделать что-то прикольное, надо поставить задачу и дать вводные 🙂 Разве что сделать нейронную сеть и запустить её наоборот, в генеративном режиме, предварительно скормив ей, например, музыку Моцарта в формате MIDI 🙂 Кстати, вполне реальная вещь, вот чувак кормил сеть Бахом: https://www.youtube.com/watch?v=SacogDL_4JU