www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Tflearn: решение XOR с помощью нейронной сети с прямой связью 2x2x1 в Tensorflow

Дата публикации Jul 22, 2017

Простое руководство по обучению нейронной сети с прямой связью 2x2x1 для решения проблемы XOR с использованием всего 12 строк кода в python tflearn - библиотеке глубокого обучения, построенной на основе Tensorflow.

Цель нашей сети - обучить сеть принимать два логических входа и возвращать True только тогда, когда один вход - True, а другой - False.

пакеты

from tflearn import DNN
from tflearn.layers.core import input_data, dropout, fully_connected from tflearn.layers.estimator import regression

Входные данные

Мы определяем наши входные данныеИкси ожидаемые результатыYкак список списков.
Поскольку нейронные сети по сути имеют дело только с числовыми значениями, мы преобразуем наши логические выражения в числа, чтобыИстинные = 1а такжеЛожные = 0

X = [[0,0], [0,1], [1,0], [1,1]]
Y = [[0], [1], [1], [0]]

Модель

Определяем входной, скрытый и выходной слои.
Синтаксис для этого не может быть проще - используйтеinput_layer ()для входного слоя иfully_connected ()для последующих слоев.

input_layer = input_data(shape=[None, 2])
hidden_layer = fully_connected(input_layer , 2, activation='tanh')
output_layer = fully_connected(hidden_layer, 1, activation='tanh')

Почему ввод формы[Нет, 2]?Сеть заполняется несколькими примерами обучения одновременно. Так как мы используемдве особенностиза пример склонности и естьчетыре примеранаши данные имеютформа [4, 2].Но иногда нам нравится определять нашу сеть, чтобы она могла получать любое количество обучающих примеров. Мы можем использоватьНиктодля любого количества обучающих примеров и определите форму ввода как[Нет, number_of_features,…]

regression = regression(output_layer , optimizer='sgd', loss='binary_crossentropy', learning_rate=5)
model = DNN(regression)

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

Наконец, мы определяем нашу (едва ли) глубокую нейронную сеть в ftlearn, используя простоDNN ().

Далее нам нужно тренировать модель. В ходе этого процесса регрессор попытается оптимизировать функцию потерь. Конечным результатом обучения являются просто веса (и смещения), соединяющие узлы слоя.

Подготовка

model.fit(X, Y, n_epoch=5000, show_metric=True)

После запуска model.fit (), Tensorflow передаст входные данные 5000 раз и попытается соответствовать модели.

Если ваш вывод выглядит примерно так (стремитесь к небольшим потерям и высокой точности),

>>> Training Step: 5048  | total loss: 0.31394 | time: 0.002s
| SGD | epoch: 5048 | loss: 0.31394 - binary_acc: 0.9994 -- iter: 4/4

Ваша модель с точностью 0,999% означает, что она успешно научилась решать эту проблему.

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

прогнозирование

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

[i[0] > 0 for i in model.predict(X)]
>>> [False, True, True, False]

Большой! Наша модель работает.

Но какую логику использовала модель для решения проблемы XOR? Давай проверим под капотом.

Анализ веса

В отличие от И и ИЛИ,Выходы XOR не являются линейно разделимыми,
Поэтому нам нужно ввести еще один скрытый слой, чтобы решить его. Оказывается, что каждый узел в скрытом слое представляет одну из более простых линейно разделимых логических операций (AND, OR, NAND, ...), а выходной уровень будет действовать как другая логическая операция, передаваемая выходами из предыдущего уровня.

Если бы мы были ограничены использованием только простых логических операций, мы могли бы определить XOR как

XOR (X1, X2) = И (ИЛИ (X1, X2), NAND (X1, X2))

Чтобы понять, какую логику использует наша сеть для получения результатов, нам необходимо проанализировать ее вес (и отклонения).
Мы делаем это сmodel.get_weights (layer.W)чтобы получить вектор весов иmodel.get_weights (layer.W)чтобы получить вектор смещений.

print(model.get_weights(hidden_layer.W), model.get_weights(hidden_layer.b))
print(model.get_weights(output_layer.W), model.get_weights(output_layer.b))>>> [[ 3.86708593 -3.11288071] [ 3.87053323 -3.1126008 ]]
[-1.82562542 4.58438063]
>>> [[ 5.19325304]
[-4.87336922]

На рисунке ниже показано, к какому узлу принадлежат отдельные веса (для простоты цифры округлены)

X1а такжеX2наши входные узлы.a1а такжеa2узлы в нашем скрытом слое иОэто выходной узел.B1а такжеБи 2являются предвзятыми.

Что это говорит нам? Ну, ничего особенного пока нет. Но, вычисляя активации узлов для отдельных входов, мы можем видеть, как ведет себя конкретный узел.
Мы используем формулу (× обозначает умножение матриц):

активация = tanh (входные данные × веса + смещения)

Обратите внимание, что мы используемTANH ()это означает, что активация будет в диапазоне [-1, 1],

Активации закругленных узлов для отдельных входных комбинаций для приобретенной нейронной сети XOR
  • a1Истинно (1), если на входе есть хотя бы один 1.a1узелследовательнопредставляетИЛИлогическая операция
  • a2True всегда, кроме случаев, когда оба входа имеют значение True.a2поэтому узел представляетNANDлогическая операция
  • выходной узелПравда только тогда, когда обаa1а такжеa2Верны

Выходной узел может быть переписан как:

O (X1, X2) =А ТАКЖЕ(a1 (X1, X2), a2 (X1, X2)) =И (ИЛИ (Х1, X2), NAND (X1, X2))

Таким образом, обученная сеть является операцией И ИЛИ (X1, X2) и NAND (X1, X2)

Обратите внимание, что результаты будут отличаться из-за случайной инициализации веса, а это означает, что ваши веса, вероятно, будут отличаться каждый раз, когда вы тренируете модель.

Полный источник можно найтиВот:

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map