Использование нейронной сети в Go


NNHelper — это пакет Go для создания и использования нейронной сети

Резюме

В этой статье описывается работа пакета nnhelper, предназначенного для создания и использования нейронных сетей в программах на языке Go.

Если вы уже знакомы с машинным обучением и используете его в своей работе, то эта статья и описанные в ней примеры могут показаться вам слишком простыми. Если вы находитесь в начале пути и хотите познакомиться с этой темой или желаете узнать, как использовать нейронную сеть в своих программах на Go, то вы пришли по адресу.

Пакет nnhelper Go предназначен для быстрого создания нейронной сети и использования ее в приложениях, написанных на языке Go. Чтобы использовать nnhelper, вам не нужно ничего, кроме языка Go. Пакет nnhelper является дополнением к пакету gonn. И это единственная внешняя зависимость.

Нейронная сеть (нейронная матрица)

Попробую объяснить своими словами, что такое нейронная сеть или нейронная матрица, чтобы не копировать сюда сложные и, возможно, непонятные объяснения из начального чтения.

Нейронная матрица — это массив значений с плавающей точкой, который позволяет выдавать желаемые выходные значения в зависимости от входных значений. Известные нам значения подаются на вход нейронной матрицы, а на выходе получаются ожидаемые нами результаты.

Давайте используем нейронную матрицу для решения задачи «Два минуса дают плюс». Для этого составим две таблицы: одну — с входными данными, другую — с результатами.

У нас есть два входных и два выходных параметра. На вход подаются два числа со знаком плюс или минус. На выходе мы получаем два числа со значениями от 0 до 1. Если первое значение близко к 1, то результат — плюс, если второе значение близко к 1, то результат — минус. То есть на вход мы подаем реальные значения, а на выходе получаем массив результатов. Затем мы выбираем из массива наибольшее значение и считаем его ответом.

Input data:              Results(plus, minus):
 1, 1  – plus * plus     1, 0 – plus
 1,-1  – plus * minus    0, 1 – minus
-1, 1  – minus* plus     0, 1 – minus
-1,-1  – minus* minus    1, 0 – plus
Вход в полноэкранный режим Выход из полноэкранного режима

Из подготовленных таблиц с входными и выходными данными создается нейронная матрица путем ее обучения: Входные данные подаются на входы матрицы. Матрица выдает выход, который сравнивается с результатом из нашей таблицы результатов. На основе этих ответов изменяются коэффициенты в матрице. Входные данные проходят через сотни, тысячи и даже сотни тысяч итераций, пока ответы матрицы не станут достаточно точными.

Перейдем к программированию

Достаточно слов и теории. Давайте посмотрим, как это выглядит на практике.

Создадим папку для проекта. И создадим в ней три файла:

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 и напишите следующий код:

// Constants with filenames of our matrix and data
const (
    SAM03_NN  = "sam03.nn"
    SAM03_INP = "sam03_inp.csv"
    SAM03_TAR = "sam03_tar.csv"
)

// Human answers string array
humanAnswers := []string{"Plus", "Minus"}

// Create NN if it file does not exists
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)
}

// Load neural matrix from file
nn := nnhelper.Load(SAM03_NN)

// Using / testing our neural network
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]
  • результат переведен в понятную форму: Плюс
  • результат, полученный при выводе матрицы: [0.9944239772210877 0.005449692189449571]

Обратите внимание на последнюю строчку результатов. Наша матрица смогла дать правильный ответ на «неизвестные» входы. В этом и заключается весь вкус нейронных сетей. Матрица дает ответы не только на те входные данные, на которых она обучалась, но и на другие неизвестные ей входные параметры.

Чтобы увидеть процесс обучения нейронной сети, нужно удалить файл sam03.nn и запустить пример снова.

Ну, пожалуй, на этом я закончу. Я давно мечтал написать понятное и простое объяснение того, как нейронные сети можно использовать в программировании. Надеюсь, мне это удалось.

В пакете есть еще два примера:

  • sam02: Введите время в 24-часовом формате и получите ответ: Утро, Вечер, День или Ночь;
  • sam01: пример матрицы для получения реакции игрового бота. На вход подается количество здоровья, наличие оружия, количество врагов, а на выходе мы получаем ответ на вопрос «что делать»: атаковать, подкрасться, убежать или ничего не делать.

Пакет размещен на Github:
https://github.com/kirill-scherba/nnhelper

С наилучшими пожеланиями,
Кирилл Щерба

Оцените статью
Procodings.ru
Добавить комментарий