Нейронные сети

Ух, как про­дви­нул­ся про­гресс! Рань­ше созда­ние сво­их ней­рон­ных сетей было заня­ти­ем дико слож­ным, тре­бу­ю­щим пони­ма­ния мате­ма­ти­ки и нехи­ло­го про­грам­ми­ро­ва­ния. Я даже нари­со­вал свою, на Сишар­пе. Она, конеч­но, была про­стень­кая, но я очень мно­го понял (осо­бен­но хоро­шо я понял, поче­му ниче­го, кро­ме свёр­точ­ных сетей, для клас­си­фи­ка­ции изоб­ра­же­ний исполь­зо­вать невоз­мож­но — тупо памя­ти не хва­тит).

А теперь дви­жок ней­рон­ных сетей не надо писать само­му. Сна­ча­ла появи­лась 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