
Краткое содержание
Данная статья описывает работу пакета nnhelper, предназначенного для создания и использования нейронных сетей в программах на языке Go.
Если Вы уже знакомы с машинным обучением и используете его в своей работе, то эта статья и описанные в ней примеры могут показаться вам слишком простыми. Если Вы в начале пути и хотите познакомиться с этой темой или вам хотелось бы научиться использовать нейроматрицу в ваших программах на языке Go, то вы попали точно по адресу.
Go пакет nnhelper разработан для быстрого создания нейронной сети и использовании ее в приложениях, написанных на языке Go. Для использования nnhelper не потребуется ничего дополнительного, кроме Go. Пакет nnhelper является надстройкой над пакетом gonn. И это единственная внешняя зависимость.
Нейронная сеть (нейроматрица)
Давайте я попробую своими словами объяснить, что же такое нейронная сеть или нейроматрица, что бы не копировать сюда сложные и, возможно, непонятные с первого прочтения объяснения.
Нейроматрица — это массивы значений с плавающей запятой, позволяющие дать нужные выходные значения в зависимости от входных значений. На вход нейроматрицы подаются известные нам значения, а на выходе выдаются ожидаемые нами результаты.

Давайте с помощью нейроматрицы решим задачку «Минус на Минус дают Плюс». Для этого составим две таблички: одну с входными данными, другую с результатами.
У нас два входных параметра и два выходных параметра. На вход подаем два числа со знаком плюс или минус. На выходе получаем два числа со значениями от 0 до 1. Если первое значение близко к 1, то результат Плюс, если второе значение близко к 1, то результат Минус. Т.е. на вход мы подаем реальные значения, а на выходе получаем массив результатов. Выбираем самое большое значение из массива и считаем это ответом.
Входные данные: Результаты (1ый – это Плюс, 2ой – это минус): 1, 1 – плюс * плюс 1, 0 – плюс 1,-1 – плюс * минус 0, 1 – минус -1, 1 – минус* плюс 0, 1 – минус -1,-1 – минус* минус 1, 0 – плюс
Из подготовленных табличек с входными и выходными данными создается нейроматрица с помощью ее обучения. Входные данные подаются на входы матрицы. Матрица выдает выходные данные, которые сравниваются с результатом из нашей таблички результатов. На основании этих ответов в матрице меняются коэффициенты. Входные данные прокручиваются сотни, тысячи и даже сотни тысяч раз, пока ответы матрицы не станут достаточно точными.
Перейдём к программированию
Хватит слов и теории. Посмотрим, как это выглядит на практике.
Создадим папку для проекта. В ней создадим три файла:
main.go sam03_inp.csv sam03_tar.csv
В файлах *.csv разместим наши входные и выходные данные:
sam03_inp.csv
1,1 1,-1 -1,1 -1,-1
sam03_tar.csv
1,0 0,1 0,1 1,0
В файле main.go создадим функцию main и напишем код:
// Константы с именами файлов наших данных и самой матрицы const ( SAM03_NN = "sam03.nn" SAM03_INP = "sam03_inp.csv" SAM03_TAR = "sam03_tar.csv" ) // Массив строк с понятными ответами для вывода на консоль humanAnswers := []string{"Plus", "Minus"} // Создаем матрицу с 2-я входами и 2-я выходами, из csv файлов, // если марица отсутствует на диске if _, err := os.Stat(SAM03_NN); errors.Is(err, os.ErrNotExist) { log.Println("Create", SAM03_NN, "neural network") nnhelper.Create(2, 4, 2, false, SAM03_INP, SAM03_TAR, SAM03_NN, true) } // Загружаем матрицу из файла nn := nnhelper.Load(SAM03_NN) // Предыдущий оператор создал матрицу и теперь мы ее используем/тестируем: // создаем массив с данными для которых хотим получить результат и для этого, // в цикле, выполняем функции nn.Answer и nn.AnswerToHuman const ( PLUS = 1.0 MINUS = -1.0 ) // Intput array for testing in := [][]float64{ {PLUS, PLUS}, // Plus * Plus = Plus {PLUS, MINUS}, // Plus * Minus = Minus {MINUS, PLUS}, // Minus * Plus = Minus {MINUS, MINUS}, // Minus * Minus = Plus {3000, -0.001}, // Minus * Plus = Minus } for i := range in { out := nn.Answer(in[i]...) answer, _ := nn.AnswerToHuman(out, humanAnswers) fmt.Println(in[i], answer, out) }
Полный текст этого примера и файлы с данными находятся в папке examples/sam03
Запускаем пример на выполнение:
go run .
И получаем результаты:
[1 1] Plus [0.9944239772210877 0.005449692189449571] [1 -1] Minus [0.006860785779850435 0.9935960167863507] [-1 1] Minus [0.005651009980489101 0.994384581174021] [-1 -1] Plus [0.9944591181959666 0.005221796400203198] [3000 -0.001] Minus [0.005445102841471242 0.9960123783099599]
В результатах видим (см. первую строку):
-
наши исходные данные: [1,1]
-
результат переведенный в понятный вид: Plus
-
результат полученный с выходов матрицы: [0.9944239772210877 0.005449692189449571]
Обратите внимание на последнюю строчку результатов. Наша матрица смогла дать правильный ответ на «неизвестные» входные данные. В этом и есть весь вкус нейронных сетей. Матрица дает ответы не только на входные данные, которым была обучена, но и на другие неизвестные ей входные параметры.
Что бы увидеть процесс обучения нейронной сети, нужно удалить файл sam03.nn и запустить пример.
Ну, пожалуй, на этом я закончу. Очень давно мечтал написать понятное и простое объяснение о том, как можно использовать нейронные сети в программировании. Надеюсь, что у меня это получилось.
В пакете есть ещё два примера:
-
sam02: На вход подаем время в 24-часовом формате и получаем ответ: Утро, Вечер, День или Ночь;
-
sam01: Пример матрицы для получения реакции игрового бота. На вход подается количество здоровья, наличие оружия, количество врагов, а на выходе получаем ответ на вопрос «что делать»: атаковать, красться, убегать или ничего не делать.
Пакет размещен на Github:
https://github.com/kirill-scherba/nnhelper
С уважением,
Kirill Scherba
ссылка на оригинал статьи https://habr.com/ru/post/664838/
Добавить комментарий