Читаем Нейронный сети. Эволюция полностью

Cмоделируем такую структуру, для чего подадим на вход нейрона (дендрит у биологического нейрона), значение x, и меняя коэффициент A (синапс у биологического нейрона), по правилам, которые мы вывели с линейным классификатором, будем получать выходные значения нейрона y (аксон у биологического нейрона). Так же условимся, что Y (большое) – правильный ответ (целевое значение), а y (малое) – ответ нейрона (его выход).

Визуализируем структуру нейрона, которую будем моделировать:



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

Программа

Действовать будем так же, как мы действовали, рассчитывая линейный классификатор.

Создадим переменную А, являющейся коэффициентом крутизны наклона прямой, и зададим ей любое значение, пусть это будет всё те же А=0.4.

A = 0.4

Запомним начальное значение коэффициента А:

A_vis = A

Покажем функцию начальной прямой:

print('Начальная прямая: ', A, '* X')

Укажем значение скорости обучения:

lr = 0.001

Зададим количество эпох:


epochs = 3000


Эпоха – значение количества проходов по обучающей выборке. Если в нашей выборке девять наборов, то одна эпоха – это один проход в цикле всех девяти наборов данных.

Зададим наш набор данных, используя массивы. Создадим два массива. В один массив поместим все входные данные – x, а в другой целевые значения (ответы) – Y.

Создадим массив входных данных х:

arr_x = [1, 2, 3, 3.5, 4, 6, 7.5, 8.5, 9]


Создадим массив целевых значений (ответы Y):

arr_y = [2.4, 4.5, 5.5, 6.4, 8.5, 11.7, 16.1, 16.5, 18.3]


Задаем в цикле эпох, вложенный цикл – for i in range(len(arr)), который будет последовательно пробегать по входным данным, от начала до конца. А циклом – for e in range(epochs), мы как раз указываем количество таких пробегов (итераций):


for e in range(epochs):

for i in range(len(arr)):


Функция len(arr) возвращает длину массива, в нашем случае возвращает девять.


Получаем x координату точки из массива входных значений x:


x = arr_x[i]


А затем действуем как в случае с линейным классификатором:


# Получить расчетную y, координату точки

y = A * x

# Получить целевую Y, координату точки

target_Y = arr_y[i]

# Ошибка E = целевое значение – выход нейрона

E = target_Y – y

# Меняем коэффициент при x, в соответствии с правилом A+дельтаA = A

A += lr*(E/x)


Напомню, процессом изменения коэффициентов в ходе выполнения цикла программы, называют – процессом обучения.


Выведем результат после обучения:


print('Готовая прямая: y = ', A, '* X')


Полный текст программы:


# Инициализируем любым числом коэффициент крутизны наклона прямой

A = 0.4

A_vis = A # Запоминаем начальное значение крутизны наклона

# Вывод данных начальной прямой

print('Начальная прямая: ', A, '* X')


# Скорость обучения

lr = 0.001

# Зададим количество эпох

epochs = 3000


# Создадим массив входных данных x

arr_x = [1, 2, 3, 3.5, 4, 6, 7.5, 8.5, 9]

# Создадим массив целевых значений (ответы Y)

arr_y = [2.4, 4.5, 5.5, 6.4, 8.5, 11.7, 16.1, 16.5, 18.3]


# Прогон по выборке

for e in range(epochs):

for i in range(len(arr_x)): # len(arr) – функция возвращает длину массива

# Получить x координату точки

x = arr_x[i]


# Получить расчетную y, координату точки

y = A * x


# Получить целевую Y, координату точки

target_Y = arr_y[i]


# Ошибка E = целевое значение – выход нейрона

E = target_Y – y


# Меняем коэффициент при x, в соответствии с правилом A+дельтаA = A

A += lr*(E/x)


# Вывод данных готовой прямой

print('Готовая прямая: y = ', A, '* X')


Результатом ее работы будет функция готовой прямой:


y = 2.0562708725692196 * X


Для большей наглядности, что я специально указал данные в обучающей выборке, так чтобы они лежали около значений функции y = 2x. И после обучения нейрона, мы получили ответ очень близкий к этому значению.

Было бы неплохо визуализировать все происходящие на графике прямо в Python.

Визуализация позволяет быстро получить общее представление о том, что мы делаем и чего добились.


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

Ниже приведена инструкция, с помощью которой мы импортируем нужный нам пакет для работы с графикой:


import matplotlib.pyplot as plt


Кроме того, мы должны дополнительно сообщить Python о том, что визуализировать следует в нашем блокноте, а не в отдельном окне. Это делается с помощью директивы:


%matplotlib inline


Если не получается загрузить данный пакет в программу, то скорей всего его надо скачать из сети. Делать это удобно через Anaconda Prompt, который устанавливается вместе с пакетом Anaconda.

Для системы Windows, в Anaconda Prompt вводим команду:


conda install matplotlib


И следуем инструкциям. Для других операционных систем возможно потребуется другая команда.

Теперь мы полностью готовы к тому, чтобы представить наши данные и функции в графическом виде.

Выполним код:


import matplotlib.pyplot as plt

%matplotlib inline


# Функция для отображения входных данных

Перейти на страницу:

Похожие книги

Чем женщина отличается от человека
Чем женщина отличается от человека

Я – враг народа.Не всего, правда, а примерно половины. Точнее, 53-х процентов – столько в народе женщин.О том, что я враг женского народа, я узнал совершенно случайно – наткнулся в интернете на статью одной возмущенной феминистки. Эта дама (кандидат филологических наук, между прочим) написала большой трактат об ужасном вербальном угнетении нами, проклятыми мужчинами, их – нежных, хрупких теток. Мы угнетаем их, помимо всего прочего, еще и посредством средств массовой информации…«Никонов говорит с женщинами языком вражды. Разжигает… Является типичным примером… Обзывается… Надсмехается… Демонизирует женщин… Обвиняет феминизм в том, что тот "покушается на почти подсознательную протипическую систему ценностей…"»Да, вот такой я страшный! Вот такой я ужасный враг феминизма на Земле!

Александр Петрович Никонов

Публицистика / Прочая научная литература / Образование и наука / Документальное
Введение в логику и научный метод
Введение в логику и научный метод

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

Моррис Коэн , Эрнест Нагель

Философия / Прочая научная литература / Образование и наука