<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Roman</title><author><name>Roman</name></author><id>https://teletype.in/atom/brmi1</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/brmi1?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/brmi1?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-09-22T15:03:12.513Z</updated><entry><id>brmi1:DatasetsProcessing</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/DatasetsProcessing?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Обработка и сжатие наборов данных для тренировки нейронных сетей.</title><published>2021-05-17T19:35:57.398Z</published><updated>2021-05-17T19:40:26.160Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/ed/f1/edf189df-f899-4c28-8469-0433d0da5333.png"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/b6/7b/b67b1172-7cf9-46db-960f-b3f5bc26a4b2.png&quot;&gt;Зачастую наборы данных для тренировки нейронных сетей занимают много места. Кроме этого, для использования набора требуется правильная конвертация данных для того чтобы подать данные на вход сети.</summary><content type="html">
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b6/7b/b67b1172-7cf9-46db-960f-b3f5bc26a4b2.png&quot; width=&quot;390&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Зачастую наборы данных для тренировки нейронных сетей занимают много места. Кроме этого, для использования набора требуется правильная конвертация данных для того чтобы подать данные на вход сети.&lt;/p&gt;
  &lt;p&gt;В этой статье вы узнаете, как сжимать и обрабатывать наборы данных на примере фото и аудио.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;.npz&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;Формат .npz файла представляет собой сжатый архив файлов, названных в честь переменных, которые они содержат. Архив сжимается, и каждый файл в архиве содержит одну переменную в NumPy формате.&lt;/p&gt;
  &lt;p&gt;При открытии сохраненного .npz файла с помощью load() возвращается объект. Это объект, подобный словарю, который можно запросить как для своего списка массивов, так и для самих массивов.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;Пример&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;Импортируем функцию для создания .npz архива и генерации чисел. Так же сгенерируем массив.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/20/22/2022caed-af06-4011-9c61-7be8e98f6dcd.png&quot; width=&quot;501&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Указываем имя файла и имя значения в котором будут хранится элементы массива, а так же указываем путь к массиву.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9a/c2/9ac2638b-8e71-4137-96f1-da88661597ac.png&quot; width=&quot;459&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Готово. .npz архив создан.&lt;/p&gt;
  &lt;p&gt;Рассмотрим как же загрузить из такого архива данные.&lt;/p&gt;
  &lt;p&gt;Импортируем функцию загрузки.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/86/4a/864aee54-a8ae-4bd2-86bb-406b50a4db11.png&quot; width=&quot;272&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Указываем имя файла и названия значений.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/15/0d/150d8656-2bd4-4163-aa20-61502270c0a7.png&quot; width=&quot;379&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Готово. Ничего сложного.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;MNIST&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;MNIST – набор рукописных цифр. Сам архив весит около 20 MB, а загрузка данных занимает много времени. Давайте рассмотрим как же завернуть MNIST в .npz архив.&lt;/p&gt;
  &lt;p&gt;Импортируем нужные функции: для просмтора содержимого дериктории, для отоброжения процесса выполнения, функция для работы с изображениями, а так же некоторые фунцкии NumPy о которых вы узнаете позже.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a8/5f/a85fc7ba-b6af-4e7d-885f-2a247039e742.png&quot; width=&quot;542&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Создадим фунцкию для преобразования изображений в массив.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/08/96/089674bf-4c20-471e-8373-6226c4da3c8c.png&quot; width=&quot;810&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Она работает так: инициализируем массив в котором будут хранится все данные, загружаем список папок, после цего загружем список всех файлов в текущей папке, полученное изображение преобразуется в массив, после чего все значения делятся на 255 (так как возвращаются значения от 0 до 255 – яркость пикселя), после всех манипуляций массив добавляется в общий массив и возвражается функцией.&lt;/p&gt;
  &lt;p&gt;Далее создадим функцию для генерации лейблов.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6b/6e/6b6e7079-a324-42bb-b6e0-ba9a3d1b511f.png&quot; width=&quot;369&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Тут ничего сложного. Так как значения в архиве с данными идут по порядку, то и функция генерации лейблов будет создавать их по порядку.&lt;/p&gt;
  &lt;p&gt;Генерируем массив с числами идущими по порядку, все зависит от количества категорий и примеров.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;eye()&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;eye() возвращает массив нулей с единицами по диагонали, но если указать координаты (массив сгенерированных по порядку чисел), то можно изменять положение единиц.&lt;/p&gt;
  &lt;p&gt;Указываем путь к файлу и устанавливаем размерность лейблов (категории на кол. примеров).&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cb/e3/cbe36d67-4e2f-414c-beb3-c79d98873f6f.png&quot; width=&quot;273&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Далее сохраняем полученные значения в переменную и создаем архив, так же для проверки выведем размерность массива.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/26/71/2671b472-7a70-4581-ac53-edecad9b9d6c.png&quot; width=&quot;594&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Готово. Теперь набор данных весит 15 MB, а вместо конвертации данных и генерации лейблов можно в две строки загрузить данные.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;MSC&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;MSC (mini speech commands) – набор 8-ми голосовых команд от Google. Как и в случае с MNIST импортируем нужные функции: для просмтора содержимого дериктории, для отоброжения процесса выполнения, функция для построения спектограммы, а так же некоторые фунцкии NumPy.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a5/b7/a5b72c96-a7fd-4195-bbda-c41777ce43eb.png&quot; width=&quot;540&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Делаем все как и с MNIST, только вместо конвертации фото в массив, составляем спектограмму.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/45/c5/45c5f5b1-2214-4117-8d47-fb0c2c1b1ace.png&quot; width=&quot;631&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Лэйблы создаются как и в MNIST, т. к. значения идут по порядку.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/37/ff/37ffd3b7-e81b-43ee-a5e9-55766010e736.png&quot; width=&quot;370&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Указываем путь к файлу и устанавливаем размерность лейблов.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/00/30/00307c03-8ab9-416a-9dc8-4653aed9f491.png&quot; width=&quot;447&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Сохраняем полученные значения в переменную и создаем архив, так же для проверки выведем размерность массива.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/50/15/5015fea2-6035-4c28-86c1-7e8f32b5ca62.png&quot; width=&quot;772&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Готово. Вес архива с неконвертированными аудио – 90 MB, вес .npz архива – 13 MB.&lt;/p&gt;

</content></entry><entry><id>brmi1:TensorflowBasics</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/TensorflowBasics?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Нейронные сети простым языком. Часть 5. Основы Tensorflow.</title><published>2021-05-17T19:34:41.288Z</published><updated>2021-05-17T19:34:41.288Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/95/8e/958eb912-f982-44fb-96f5-ae1591b6b205.png"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/f4/84/f484379c-7be9-4353-ba88-7980d80a8259.png&quot;&gt;В этой статье вы узнаете как программировать нейронные сети с помощью ML-библиотеки Tensorflow.</summary><content type="html">
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f4/84/f484379c-7be9-4353-ba88-7980d80a8259.png&quot; width=&quot;2056&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В этой статье вы узнаете как программировать нейронные сети с помощью ML-библиотеки Tensorflow.&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;MNIST&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;Импортируем нужные модули: функция для моделирования сети, слои, функция для разделения данных, а так же функция для чтения файлов (.npz).&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Первая и вторая строка отвечает за отключение лишних логов.&lt;/em&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/24/e1/24e161ec-d1b9-4405-b102-9debd9cf1e87.png&quot; width=&quot;622&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Загружаем тренировочный набор и разделяем данные на тренировочные и тестовые.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/00/58/0058eca8-b71c-4e24-a3fa-497989228c4f.png&quot; width=&quot;1065&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Далее инициализируем сеть и слои, указываем количество нейронов и функции активации.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/99/a5/99a5b5eb-2898-40eb-bfe3-019fe5b03f39.png&quot; width=&quot;495&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Первый слой в сети (Flatten) преобразует формат изображений из 2d-массива (28 на 28 пикселей) в 1d-массив из 28 * 28 = 784 пикселей. У этого слоя нет параметров для изучения, он только переформатирует данные.&lt;/p&gt;
  &lt;p&gt;Следующие слои - Dense. Это полносвязные нейронные слои.&lt;/p&gt;
  &lt;p&gt;Каждый нейрон последнего слоя содержит оценку, которая указывает вероятность того, что текущее изображение принадлежит одному из 10 классов.&lt;/p&gt;
  &lt;p&gt;Компилируем сеть с заданными параметрами, а так же запускаем тренировку.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/78/f0/78f01056-29c2-41f7-85b4-16c9c24ff287.png&quot; width=&quot;1008&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Если вам нужно указать количество батчей:&lt;/p&gt;
  &lt;p&gt;model.fit(&lt;em&gt;x_train&lt;/em&gt;, &lt;em&gt;y_train&lt;/em&gt;, epochs=&lt;em&gt;n_epoch&lt;/em&gt;, batch_size=&lt;em&gt;n_batch&lt;/em&gt;)&lt;/p&gt;
  &lt;p&gt;Для тестирования сети в момент тренировки:&lt;/p&gt;
  &lt;p&gt;model.fit(&lt;em&gt;x_train&lt;/em&gt;, &lt;em&gt;y_train&lt;/em&gt;, epochs=&lt;em&gt;n_epoch&lt;/em&gt;, validation_data=(&lt;em&gt;x_test&lt;/em&gt;, &lt;em&gt;y_test&lt;/em&gt;))&lt;/p&gt;
  &lt;p&gt;Если вам требуется вычислить предсказание после тренировки:&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Требуется импорт модуля NumPy argmax для полученияиндекса максимального элемента массива.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;print(argmax(model.predict(&lt;em&gt;var&lt;/em&gt;)))&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;MSC&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;Импортируем нужные модули.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/11/16/1116a232-7f4a-4309-8e9e-41214cf98f24.png&quot; width=&quot;613&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Загружаем набор данных, а так же разделяем его на тренировочные и тестовые.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d3/8f/d38faa5c-7b3c-4fb9-ac65-614199b1355d.png&quot; width=&quot;1063&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Инициализируем сеть и слои, указываем количество нейронов и функции активации.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c6/c4/c6c414a3-fc19-4027-a6ea-9aa45403f26f.png&quot; width=&quot;508&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;LSTM – рекурентный слой, слой с долгой кратковременной памятью. return_sequences = True означает, что данные стоит прогонять несколько раз, что и называется подкреплением.&lt;/p&gt;
  &lt;p&gt;Компилируем сеть с заданными параметрами и запускаем тренировку.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/16/ff/16fffe50-92c5-4264-b40d-dd6108a05e69.png&quot; width=&quot;1002&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>brmi1:easyAI_Tasks</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/easyAI_Tasks?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Нейронные сети простым языком. Часть 4. Задачи.</title><published>2021-05-17T19:34:25.546Z</published><updated>2021-05-17T19:34:25.546Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/6c/47/6c47ea00-61dd-4126-9490-c9fd90530fea.jpeg"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/04/0d/040d190a-7514-4d32-8bb8-6d8831433e27.jpeg&quot;&gt;В прошлой статье мы узнали как нейронную сеть, а так же рассмотрели примеры реализации на Python.</summary><content type="html">
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/04/0d/040d190a-7514-4d32-8bb8-6d8831433e27.jpeg&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/easyAI_ForwardPropagate&quot; target=&quot;_blank&quot;&gt;прошлой статье&lt;/a&gt; мы узнали как нейронную сеть, а так же рассмотрели примеры реализации на Python.&lt;/p&gt;
  &lt;p&gt;В этой статье для большего понимания рассмотрим реальные задачи, а также реализуем их на Python. Весь код приведенный ниже можно найти в &lt;a href=&quot;https://github.com/brmi1&quot; target=&quot;_blank&quot;&gt;моем GitHub&lt;/a&gt;.&lt;/p&gt;
  &lt;h2&gt;Светофор&lt;/h2&gt;
  &lt;p&gt;Сфетофор - простая, достаточно популярная задача. Всего 3 входных параметра, значения должны быть либо 0, либо 1. Нейросеть должна найти закономерность - значение по центру и является ответом.&lt;/p&gt;
  &lt;p&gt;Рассмотрим реализацию на Python. Для начала напишем основной класс, который отвечает за обучение и предсказание.&lt;/p&gt;
  &lt;p&gt;Импотрируем нужные модули библиотеки NumPy, а так же создадим объект класса для инициализации параметров сети.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e0/89/e08997a7-50f1-4652-bdd6-960c8d125319.png&quot; width=&quot;857&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Далее создадим функцию активации, в данной задаче будет достаточно сигмоиды.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/49/e4/49e4c707-5214-4dfb-aa05-11a57d971a06.png&quot; width=&quot;399&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Создадим объект отвечающий за вычисление предсказания.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/40/86/4086ddca-f9b0-4226-872c-4038df51bacf.png&quot; width=&quot;894&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Создадим объект отвечающий за корректировку весов.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c8/0f/c80f9dae-d42b-4a5d-aa69-da7c8d878539.png&quot; width=&quot;1044&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;А так же создадим объект тренировки сети и объект для возможности предсказания после обучения.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/5a/59/5a5934dd-c4b9-42e6-812f-f13b130bcafc.png&quot; width=&quot;1412&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь импотрируем написаный нами класс, а так же модуль для создания массива Numpy.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fc/0f/fc0fd210-aac6-4380-a9c7-e58c5e0458d4.png&quot; width=&quot;466&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В данном случае, переменная data - это и есть наш набор данных, где первые три колонки это входные данные, а последняя так называемые лэйблы, то есть то что должно получится на выходе. Далее происходит разделение данных и корректное формирование массивов для предотвращения ошибок при вычислении.&lt;/p&gt;
  &lt;p&gt;Инициализиреум сеть, задаем гиперпараметры, подаем данные для обучения, а так же зададим новый случай.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/29/83/298338d4-976c-4101-b132-71545b8f7e23.png&quot; width=&quot;657&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Результат:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2e/9e/2e9eafe2-2af5-48e2-8917-62672a10de69.png&quot; width=&quot;364&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видим, ошибка уменьшается, а сеть выдала отличный результат.&lt;/p&gt;
  &lt;h2&gt;Ирисы Фишера&lt;/h2&gt;
  &lt;p&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/%25D0%2598%25D1%2580%25D0%25B8%25D1%2581%25D1%258B_%25D0%25A4%25D0%25B8%25D1%2588%25D0%25B5%25D1%2580%25D0%25B0&quot; target=&quot;_blank&quot;&gt;Ирисы Фишера&lt;/a&gt; - популярная задача классификации. В данной задаче 4 входных параметра: длина/ширина двух типов лепестков. Суть в том, чтобы нейросеть смогла найти закономерности между данными и определить сорт растения.&lt;/p&gt;
  &lt;p&gt;Будем использовать тот же класс, но для более точного определения добавим нейроны отклонения.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/29/61/2961c3b5-06d7-4eb8-a7ab-1a5667d39b70.png&quot; width=&quot;912&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/be/d3/bed3dcb6-a20f-44c7-8f62-5086299da37d.png&quot; width=&quot;1040&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/3c/98/3c98635d-28de-4827-b0bd-d234711e44e5.png&quot; width=&quot;1175&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;По скольку набор данных уже в разы больше будет неразумно добавлять его в скрипт. По этому скачиваем датасет и импортируем в скрипте с помощью модуля NumPy - loadtxt. loadtxt загружает файл и разделяет содержимое на указанные значения.&lt;/p&gt;
  &lt;p&gt;Так же инициализируем сеть, задаем гиперпараметры и загружаем данные.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a8/0a/a80a4338-b062-4fb2-a329-9aae65164b34.png&quot; width=&quot;656&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Результат:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/bc/dd/bcddbf76-a783-4f48-81d9-d810c233c363.png&quot; width=&quot;364&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видим 500 эпох сети достаточно чтобы обучиться, правильность распознавания - 98%.&lt;/p&gt;
  &lt;h3&gt;Распознавание рукописных цифр&lt;/h3&gt;
  &lt;p&gt;Переходим к самому сложному в данной стетье - распознваванию рукописных цифр. Для этого нам так же понадобится скачать набор рукописных цифр &lt;a href=&quot;https://ru.wikipedia.org/wiki/MNIST_(%25D0%25B1%25D0%25B0%25D0%25B7%25D0%25B0_%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25BD%25D1%258B%25D1%2585)&quot; target=&quot;_blank&quot;&gt;MNIST&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Так же будем использовать написанный ранее класс (с нейронами отклонения), но одной функции активации уже недостаточно, будем использовать софтмакс для вычисления выходного слоя.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/be/80/be80d295-895b-4fdc-bd9f-41d571ccd6db.png&quot; width=&quot;967&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1e/2d/1e2d9b92-b4bf-443b-8886-7437e0c329f3.png&quot; width=&quot;442&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a4/02/a402e940-1ec8-4cb3-b9f7-64096e700754.png&quot; width=&quot;1037&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d5/e9/d5e9074f-0516-4ef6-91cd-2095c8aa20c0.png&quot; width=&quot;1174&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Инициализируем сеть, задаем гиперпараметры и загружаем данные.&lt;/p&gt;
  &lt;p&gt;Так как набор данный большой, 10 эпох будет достаточно. Стоит заметить что установленный шаг ниже чем в предыдущих примерах, это нужно для более лучшего обобщения.&lt;/p&gt;
  &lt;p&gt;Для проверки выберем случайное значение из набора и подадим сети на вход после обучения.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/01/39/0139465f-540e-437a-a33e-84466c4474b7.png&quot; width=&quot;909&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Результат:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ae/da/aeda8d9e-21bc-4a57-bb86-52e6af788d3b.jpeg&quot; width=&quot;363&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видим все работает, ошибка уменьшается - правильность растет, случайное значение из набора успешно распознано.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Стоит отметить что это не идеальная реализация, так как существуют различные варианты оптимизаторов, функций вычисления ошибки и т. д. Разделение пакетов используют по разному, а могут вообще и не использовать (в зависимости от набора данных), кроме этого, зачастую требуется перемещивать данные во избежание проблем обобщения сети. Так же данная реализация довольно медленная, т. к. для повышения скорости обучения обычно используют распараллеливание и мультипроцессорность (+GPU), а прописывать это вручную достаточно проблематично.&lt;/strong&gt;&lt;/p&gt;
  &lt;h3&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/editor/TensorflowBasics&quot; target=&quot;_blank&quot;&gt;следующей статье&lt;/a&gt; познакомимся с основами Tensorflow и рассмотрим реализацию некоторых задач на данном фреймворке.&lt;/h3&gt;

</content></entry><entry><id>brmi1:easyAI_Training</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/easyAI_Training?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Нейронные сети простым языком. Часть 3. Обучение.</title><published>2021-05-17T19:33:24.205Z</published><updated>2021-05-17T19:33:24.205Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/59/8c/598c0323-bd44-4385-92e1-261d33e6b4ca.jpeg"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/8f/ad/8fad1d0b-4347-4112-b6b3-86c60b1c24b9.jpeg&quot;&gt;В прошлой статье мы узнали как получить прогнозируемое значение нейронной сети, что такое нейрон отклонения и для чего он нужен, а так же рассмотрели примеры реализации на Python.</summary><content type="html">
  &lt;p&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/easyAI_ForwardPropagate&quot; target=&quot;_blank&quot;&gt;прошлой статье&lt;/a&gt; мы узнали как получить прогнозируемое значение нейронной сети, что такое нейрон отклонения и для чего он нужен, а так же рассмотрели примеры реализации на Python.&lt;/p&gt;
  &lt;p&gt;Сейчас вы узнаете как же обучить нейронную сеть, а так же рассмотрим примеры реализации.&lt;/p&gt;
  &lt;h2&gt;Что такое обратное распространение?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Метод обратного распространения ошибки&lt;/strong&gt; (&lt;em&gt;backward propagation&lt;/em&gt;) – это метод вычисления градиента, который используется при обновлении весов в нейронной сети. Суть метода в том, чтобы распространять ошибку в обратном порядке.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8f/ad/8fad1d0b-4347-4112-b6b3-86c60b1c24b9.jpeg&quot; width=&quot;850&quot; /&gt;
    &lt;figcaption&gt;Обратного распространение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Для начала вычисляется ошибка скрытого слоя. На основе ошибки скрытого слоя вычисляется его дельта, после чего те же манипуляции выполняются со скрытыми слоями. Далее вычисляется значение обновления веса и с учетом шага и старого значения обновляется вес.&lt;/p&gt;
  &lt;h2&gt;&lt;strong&gt;random.seed()&lt;/strong&gt;&lt;/h2&gt;
  &lt;p&gt;Генерация случайных чисел не является «случайной». random выдает не случайное число, а число которое вычисляется алгоритмом на основе другого числа, по умолчанию это текущее время. random.seed() позволяет изменить число, которое передается в random для генерации случайного числа, а т.к. &amp;quot;случайные&amp;quot; числа выдаются одним и тем же алгоритмом, то при одинаковом параметре в random.seed() будут и одинаковые &amp;quot;случайные&amp;quot; числа.&lt;/p&gt;
  &lt;p&gt;При инициализации параметров для нейронной сети это нужно чтобы исключить уникальность, т. к. при каждом запуске из-за уникальных параметров нейронная сеть даже после обучения может выдавать разные результаты.&lt;/p&gt;
  &lt;h2&gt;Что такое гиперпараметры?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Гиперпараметр модели&lt;/strong&gt; – это конфигурация, внешняя по отношению к модели.&lt;/p&gt;
  &lt;p&gt;К гиперпараметрам относятся: количество нейронов в слое, шаг обучения, количество итераций, а так же наличие/отсутствие нейронов отклонения.&lt;/p&gt;
  &lt;h2&gt;Почему веса должны быть инициализированы случайным образом?&lt;/h2&gt;
  &lt;p&gt;Приведу аналогию.&lt;/p&gt;
  &lt;p&gt;Представьте, что кто-то сбросил вас с вертолета на неизвестную вершину горы, и вы оказались там в ловушке. Везде туман. Единственное, что вы знаете, это то, что вы должны каким-то образом спуститься на уровень моря. В каком направлении вы должны двигаться, чтобы спуститься к самой низкой возможной точке?&lt;/p&gt;
  &lt;p&gt;Если вы не могли найти путь к уровню моря, и поэтому вертолет забирал вас снова и сбрасывал на ту же самую вершину горы. Вам придется снова идти в том же направлении, потому что вы возвращаетесь на те же исходные позиции.&lt;/p&gt;
  &lt;p&gt;Тем не менее, каждый раз, когда вертолет высаживает Вас где-нибудь на горе, вы будете делать разные направления и шаги. Таким образом, у вас будет больше шансов достичь самой низкой возможной точки.&lt;/p&gt;
  &lt;p&gt;Вот что подразумевается под &lt;strong&gt;нарушением симметрии&lt;/strong&gt;. Инициализация &lt;strong&gt;асимметрична&lt;/strong&gt;, поэтому вы можете найти разные решения одной и той же проблемы.&lt;/p&gt;
  &lt;h2&gt;Что такое градиентный спуск?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Градиентный спуск&lt;/strong&gt; – это метод нахождения минимального значения функции потерь. Минимизация любой функции означает поиск самой глубокой впадины в этой функции. Поиск минимума означает получение наименьшей возможной ошибки или повышение точности модели. Мы увеличиваем точность, перебирая набор учебных данных при настройке параметров нашей модели (весов и смещений).&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/55/04/550495eb-b500-462c-a10e-67e3d4d437be.png&quot; width=&quot;1548&quot; /&gt;
    &lt;figcaption&gt;Градиентный спуск&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Что такое среднеквадратичная ошибка?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Среднеквадратичная ошибка&lt;/strong&gt; (Mean Squared Error) – это функция потери. Чтобы рассчитать MSE, вы берете разницу между предсказаниями вашей модели и основополагающей правдой, вычеркиваете ее и затем усредняете по всему набору данных.&lt;br /&gt;Результат всегда положительный, независимо от знака предсказанных и основанных значений истинности, и идеальное значение равно 0.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b8/ba/b8ba64ac-14b8-426c-9a0c-54db75f1f1f3.jpeg&quot; width=&quot;578&quot; /&gt;
    &lt;figcaption&gt;Формула для вычисления ошибки сети&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Что такое итерация?&lt;/h2&gt;
  &lt;p&gt;Итерация сравнима с шагом в цикле. Одна итерация равна одной пройденной эпохе.&lt;/p&gt;
  &lt;h2&gt;Что такое эпоха?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Эпоха&lt;/strong&gt; - это вся пройденная выборка (набор данных).&lt;/p&gt;
  &lt;h2&gt;Транспонирование&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Транспонированная матрица&lt;/strong&gt; – матрица, полученная из исходной матрицы заменой строк на столбцы.&lt;/p&gt;
  &lt;p&gt;Конкретно в реализации метода обратного распространения на NumPy транспонирование нужно для получения доступа к данным, т. к. в обычном виде функция dot() не сможет произвести произведение матриц параметров.&lt;/p&gt;
  &lt;h2&gt;Недостатки метода&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Паралич сети&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;В процессе обучения сети значения весов могут в результате коррекции стать очень большими величинами. Это может привести к тому, что все или большинство нейронов будут функционировать при очень больших выходных значениях, в области, где производная сжимающей функции очень мала. Так как посылаемая обратно в процессе обучения ошибка пропорциональна этой производной, то процесс обучения может практически замереть. В теоретическом отношении эта проблема плохо изучена. Обычно этого избегают уменьшением размера шага, но это увеличивает время обучения.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Локальные минимумы&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Метод градиентного спуска может застрять в локальном минимуме, так и не попав в глобальный минимум&lt;/p&gt;
  &lt;p&gt;Обратное распространение использует разновидность градиентного спуска, то есть осуществляет спуск вниз по поверхности ошибки, непрерывно подстраивая веса в направлении к минимуму. Поверхность ошибки сложной сети сильно изрезана и состоит из холмов, долин, складок и оврагов в пространстве высокой размерности. Сеть может попасть в локальный минимум, когда рядом имеется гораздо более глубокий минимум. В точке локального минимума все направления ведут вверх, и сеть не способна из него выбраться. Основную трудность при обучении нейронных сетей составляют как раз методы выхода из локальных минимумов: каждый раз выходя из локального минимума снова ищется следующий локальный минимум тем же методом обратного распространения ошибки до тех пор, пока найти из него выход уже не удаётся.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Размер шага&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Если размер шага фиксирован и очень мал, то сходимость слишком медленная, если же он фиксирован и слишком велик, то может возникнуть паралич или постоянная неустойчивость. Эффективно увеличивать шаг до тех пор, пока не прекратится улучшение оценки в данном направлении антиградиента и уменьшать, если такого улучшения не происходит.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Переобучение&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Следует также отметить возможность переобучения сети, что является скорее результатом ошибочного проектирования ее топологии или неправильным выбором критерия остановки обучения. При переобучении теряется свойство сети обобщать информацию. Весь набор образов, предоставленных к обучению, будет выучен сетью, но любые другие образы, даже очень похожие, могут быть распознаны неверно.&lt;/p&gt;
  &lt;h2&gt;Реализация на Python&lt;/h2&gt;
  &lt;p&gt;Для начала рассмотрим пошаговую реализацию для понимания алгоритма. Будем использовать сеть приведенную в &lt;a href=&quot;https://teletype.in/@brmi1/easyAI_ForwardPropagate&quot; target=&quot;_blank&quot;&gt;прошлой статье&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем нужные функции, а так же создаем функцию для вычисления сигмоиды и ее производной.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/69/8a/698a0ac6-fc93-4647-88d2-c61d89419a98.png&quot; width=&quot;533&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Создаем класс нейронной сети и инициализируем параметры.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/ee/b0eef5a6-549d-4eff-bab9-7f80bad8ca0a.png&quot; width=&quot;416&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем нейроны скрытого слоя, а так же их активацию.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e2/19/e219e581-454e-49c9-98af-aed64ea04c63.png&quot; width=&quot;697&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем выходной нейрон нейросети.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/10/c8/10c8c78e-4be0-4bc1-b49f-b3fb9016299f.png&quot; width=&quot;789&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем ошибку и дельты выходного и скрытых нейронов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fc/ad/fcadc7cb-76cf-4e3e-892a-34f7b7f855f9.png&quot; width=&quot;731&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем значения обновления весов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7f/6a/7f6a88f5-1e5a-4c94-9da6-93bbc5dc3194.png&quot; width=&quot;544&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Обновляем веса.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/36/80/36804608-35d2-4a67-a765-cf762d25110b.png&quot; width=&quot;553&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Обновляем нейроны отклонения.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/25/68/2568d0ec-0177-4ab0-883f-389dfcd44e06.png&quot; width=&quot;785&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Создадим объект класса для тренировки сети.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/60/cc/60cc719f-19a0-46fb-9784-85540f1f8361.png&quot; width=&quot;482&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Набор данных.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/76/b076a0a5-2e80-466d-b8ef-0d1d280eec50.png&quot; width=&quot;510&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Тренируем нейронную сеть.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8c/5c/8c5cc8f0-45c1-417e-894f-1ff3c03b43ce.png&quot; width=&quot;352&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Сделаем небольшую функцию для просмотра конечного результата сети.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b4/f8/b4f82cf4-3c0c-4315-9255-607812eaee19.png&quot; width=&quot;1054&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Результат.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a9/50/a9507a47-6e53-45ae-9920-1a65a8ded7f6.png&quot; width=&quot;135&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;&lt;strong&gt;Рассмотрим реализацию на NumPy&lt;/strong&gt;&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем нужные функции, а так же создаем функцию для вычисления сигмоиды, ее производной, а так же функцию для вычисления среднеквадратичной ошибки.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7b/32/7b324ff0-69bd-40e1-a87f-a5da56e57a08.png&quot; width=&quot;689&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Создаем класс нейронной сети и инициализируем параметры.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0e/6e/0e6e7f2f-7604-4910-97ea-9f0c038c0151.png&quot; width=&quot;786&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Производим прямое распространение (вычисляем предсказание сети).&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/28/a8/28a8b5a1-802c-4317-b74b-8b251def8bce.png&quot; width=&quot;1054&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем ошибку и дельты выходного и скрытых нейронов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/72/7b/727b905e-5fb0-4314-8c36-56afe696b064.png&quot; width=&quot;1124&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;em&gt;*.T - транспонирование в NumPy.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем значения обновления весов.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7e/48/7e48d83c-6b8d-4c98-b487-68f61b80bff3.png&quot; width=&quot;990&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Обновляем веса.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/03/b8/03b8a370-ec56-4f0d-bb5d-51f9c6bedd6f.png&quot; width=&quot;689&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Создадим объект класса для тренировки сети.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4a/a3/4aa38dab-bd30-4d14-836f-ff1dc4c134b8.png&quot; width=&quot;418&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Набор данных.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9a/2f/9a2f51a5-b972-4870-acb8-38540c8ca03c.png&quot; width=&quot;513&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Тренируем нейронную сеть.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4d/6c/4d6c1cf2-0512-4339-b2f9-f1fb3d4bc400.png&quot; width=&quot;801&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Результат.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8c/50/8c508ece-58e1-4a35-b984-c054435725ac.png&quot; width=&quot;267&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;iframe&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;С нейроном отклонения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Нейрон смещения обычно добавляется к каждому слою, кроме входного.&lt;/p&gt;
  &lt;h2&gt;Реализация на Python&lt;/h2&gt;
  &lt;p&gt;Для начала рассмотрим пошаговую реализацию для понимания алгоритма. Будем использовать сеть приведенную выше.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем библиотеку с математическими функциями для использования экспоненты, а так же создадим функцию сигмоиды.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1e/08/1e082656-73f8-4127-a3f3-6308c81164a1.png&quot; width=&quot;324&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Теперь инициализируем параметры.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/21/24/2124329f-ffbf-4abe-ab2b-592287318d7c.png&quot; width=&quot;451&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем нейроны скрытого слоя.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b7/71/b771fcab-58c2-4d92-ba91-6a79b8322ab7.png&quot; width=&quot;439&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем выходной нейрон (результат, предсказание сети).&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/27/af/27af44b8-4a0f-45a7-8785-9589bbe6aad6.png&quot; width=&quot;423&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Ответ сети:&lt;/em&gt;&lt;/strong&gt; 0.7075&lt;/p&gt;
  &lt;p&gt;Этот метод не совсем корректен, так как при большом количестве параметров сети, код будет просто огромным, да и сам Python считается достаточно медленным, поэтому реализуем все на NumPy.&lt;/p&gt;
  &lt;h2&gt;Что такое NumPy?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/NumPy&quot; target=&quot;_blank&quot;&gt;NumPy&lt;/a&gt;&lt;/strong&gt; - это библиотека с открытым исходным кодом для языка программирования Python. Поддерживает многомерные массивы; высокоуровневые математических функций, предназначенных для работы с многомерными массивами и т. д.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем нужные нам функции, а так же создадим функцию сигмоиды.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/3d/64/3d645216-bb02-495d-b43a-86e61a80eb6a.png&quot; width=&quot;471&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Инициализируем параметры случайным образом.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/48/50/4850d1b0-cfd5-4f35-b3fb-84de6f3b69d6.png&quot; width=&quot;516&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;em&gt;random.randn(2, 2) - создает 2 ячейки по 2 случайных значения&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;random.randn(2, 1) - создает 1 ячейку по 2 случайных значения&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;В данном случае массивы с весами инициализируются таким образом - кол. нейронов входного слоя -&amp;gt; кол. нейронов скрытого слоя, кол. нейронов скрытого слоя -&amp;gt; кол. нейронов выходного слоя.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем скрытый слой.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/26/87/2687e126-ab83-4cff-ac0b-9df873512abd.png&quot; width=&quot;560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем выходной слой.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/67/09/670971c2-097b-4218-8b87-7d8fd24b21d9.png&quot; width=&quot;678&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Сгенерированные параметры:&lt;/p&gt;
  &lt;p&gt;weights_1 = [[1.76, 0.40], [0.99, 2.24]]&lt;br /&gt;weights_2 = [[ 1.87], [-0.98]]&lt;br /&gt;bias1 = 0.95&lt;/p&gt;
  &lt;p&gt;bias2 = -0.15&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Ответ сети:&lt;/em&gt;&lt;/strong&gt; 0.6951&lt;/p&gt;
  &lt;h2&gt;Что такое dot() в NumPy?&lt;/h2&gt;
  &lt;p&gt;Функция dot() выполняет &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86&quot; target=&quot;_blank&quot;&gt;произведение матриц&lt;/a&gt;. В нашем случае это требуется для вычисления слоев.&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Что такое random.seed() для чего нужна эта функция, узнаете в следующей статье.&lt;/em&gt;&lt;/p&gt;
  &lt;h3&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/editor/easyAI_Tasks&quot; target=&quot;_blank&quot;&gt;следующей статье&lt;/a&gt; рассмотрим как обучить нейронную сеть.&lt;/h3&gt;
  &lt;h2&gt;Ссылки&lt;/h2&gt;
  &lt;p&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8&quot; target=&quot;_blank&quot;&gt;https://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://qna.habr.com/q/422558&quot; target=&quot;_blank&quot;&gt;https://qna.habr.com/q/422558&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://coderoad.ru/20027598/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B2%D0%B5%D1%81%D0%B0-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85-%D1%81%D0%B5%D1%82%D0%B5%D0%B9-%D0%B4%D0%BE%D0%BB%D0%B6%D0%BD%D1%8B-%D0%B1%D1%8B%D1%82%D1%8C-%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%BC%D0%B8-%D1%87%D0%B8%D1%81%D0%BB%D0%B0%D0%BC%D0%B8&quot; target=&quot;_blank&quot;&gt;https://coderoad.ru/20027598/Почему-веса-нейронных-сетей-должны-быть-инициализированными-случайными-числами&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://neurohive.io/ru/osnovy-data-science/gradient-descent/&quot; target=&quot;_blank&quot;&gt;https://neurohive.io/ru/osnovy-data-science/gradient-descent/&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://www.machinelearningmastery.ru/importance-of-loss-function-in-machine-learning-eddaaec69519/&quot; target=&quot;_blank&quot;&gt;https://www.machinelearningmastery.ru/importance-of-loss-function-in-machine-learning-eddaaec69519/&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>brmi1:easyAI_CalculatingPrediction</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/easyAI_CalculatingPrediction?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Нейронные сети простым языком. Часть 2. Вычисление предсказания.</title><published>2021-05-17T19:31:46.385Z</published><updated>2021-05-17T19:31:46.385Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/03/cf/03cf1330-45a5-4231-ab88-bc9c02885b92.jpeg"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/c6/4b/c64bfe4c-27c9-483a-98be-e8fa1a049806.jpeg&quot;&gt;В прошлой статье мы узнали из чего состоит нейронная сеть, узнали о ее проблемах, а так же немного затронули историю ИНС.</summary><content type="html">
  &lt;p&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/easyAI_Introduction&quot; target=&quot;_blank&quot;&gt;прошлой статье&lt;/a&gt; мы узнали из чего состоит нейронная сеть, узнали о ее проблемах, а так же немного затронули историю ИНС.&lt;/p&gt;
  &lt;p&gt;Сейчас мы рассмотрим как получить прогнозируемое значение (результат выходного слоя), а так же рассмотрим реализацию на Python.&lt;/p&gt;
  &lt;h2&gt;Что такое прямое распространение?&lt;/h2&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c6/4b/c64bfe4c-27c9-483a-98be-e8fa1a049806.jpeg&quot; width=&quot;850&quot; /&gt;
    &lt;figcaption&gt;Прямое распространение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Прямое распространение&lt;/strong&gt; (forward propagate) – это процесс передачи входных значений в нейронную сеть и получения выходных данных, которые называются прогнозируемым значением. Когда входные значения передаются в первый слой нейронной сети, процесс проходит без каких-либо операций. Второй уровень сети принимает значения первого уровня, а после операций по умножению и активации передает значения далее. Тот же процесс происходит на более глубоких слоях.&lt;/p&gt;
  &lt;p&gt;Пускай у нашей нейронной сети будет 2 входных нейрона, 2 нейрона в скрытом слое и 1 выходной нейрон.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6e/2b/6e2b46ec-d972-490b-a9a8-cf8aad6a3063.png&quot; width=&quot;470&quot; /&gt;
    &lt;figcaption&gt;Нейронная сеть&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Для начала разберемся что означает каждая переменная.&lt;/p&gt;
  &lt;p&gt;Каждая цифра соответствует номеру нейрона в слое. X - входной нейрон, H (hidden) - нейрон скрытого слоя, O (output) - выходной нейрон, W (weights) - веса (синапсы).&lt;/p&gt;
  &lt;p&gt;Формула для вычисления слоя нейросети такая:&lt;/p&gt;
  &lt;h3 data-align=&quot;center&quot;&gt;f(x) = (inputs * weights) + bias&lt;/h3&gt;
  &lt;p&gt;f(x) - функция активации, bias - нейрон отклонения (смещения). Давайте разберемся что это такое.&lt;/p&gt;
  &lt;h2&gt;Функция активации&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Функция активации&lt;/strong&gt; определяет выходное значение нейрона в зависимости от результата взвешенной суммы входов и порогового значения. Простым языком, функция активации нужна для нормирования данных.&lt;/p&gt;
  &lt;p&gt;Существует несколько функций активаций. Вот самые распространенные.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Функция ReLU&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a6/f7/a6f70801-99c5-4472-b97a-a2fed49c1ae6.png&quot; width=&quot;349.99999999999994&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Сигмоидная функция&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/17/f5/17f56f82-e94a-4834-b95d-c5db26165670.png&quot; width=&quot;349.55728689275895&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Функция гиперболического тангенса&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ee/c7/eec753d8-884c-4933-84e9-1673b4ce9dd3.png&quot; width=&quot;350.381255686988&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;У каждой функции активации есть свои недостатки, поэтому стоит выбирать функцию исходя из результатов выдаваемых нейронной сетью.&lt;/p&gt;
  &lt;p&gt;Например, сигмоида хорошо показывает себя в &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8&quot; target=&quot;_blank&quot;&gt;задачах классификации&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Так же стоит отметить что у каждой функции активации своя производная (есть исключения). &lt;em&gt;О производной в следующей статье.&lt;/em&gt;&lt;/p&gt;
  &lt;h2&gt;Нейрон смещения&lt;/h2&gt;
  &lt;p&gt;Нейрон смещения нужен для того, чтобы иметь возможность получать выходной результат, путем сдвига графика функции активации вправо или влево.&lt;/p&gt;
  &lt;p&gt;Это более понятно на картинке.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2b/a7/2ba7800a-dce6-4093-92d7-fd94655754dc.png&quot; width=&quot;538&quot; /&gt;
    &lt;figcaption&gt;Без нейрона отклонения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/10/fc/10fc4dc0-1769-4a12-97dc-7abe9743e895.png&quot; width=&quot;538&quot; /&gt;
    &lt;figcaption&gt;С нейроном отклонения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Нейрон смещения обычно добавляется к каждому слою, кроме входного.&lt;/p&gt;
  &lt;h2&gt;Реализация на Python&lt;/h2&gt;
  &lt;p&gt;Для начала рассмотрим пошаговую реализацию для понимания алгоритма. Будем использовать сеть приведенную выше.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем библиотеку с математическими функциями для использования экспоненты, а так же создадим функцию сигмоиды.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1e/08/1e082656-73f8-4127-a3f3-6308c81164a1.png&quot; width=&quot;324&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Теперь инициализируем параметры.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/21/24/2124329f-ffbf-4abe-ab2b-592287318d7c.png&quot; width=&quot;451&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем нейроны скрытого слоя.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b7/71/b771fcab-58c2-4d92-ba91-6a79b8322ab7.png&quot; width=&quot;439&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем выходной нейрон (результат, предсказание сети).&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/27/af/27af44b8-4a0f-45a7-8785-9589bbe6aad6.png&quot; width=&quot;423&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Ответ сети:&lt;/em&gt;&lt;/strong&gt; 0.7075&lt;/p&gt;
  &lt;p&gt;Этот метод не совсем корректен, так как при большом количестве параметров сети, код будет просто огромным, да и сам Python считается достаточно медленным, поэтому реализуем все на NumPy.&lt;/p&gt;
  &lt;h2&gt;Что такое NumPy?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/NumPy&quot; target=&quot;_blank&quot;&gt;NumPy&lt;/a&gt;&lt;/strong&gt; - это библиотека с открытым исходным кодом для языка программирования Python. Поддерживает многомерные массивы; высокоуровневые математических функций, предназначенных для работы с многомерными массивами и т. д.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Импортируем нужные нам функции, а так же создадим функцию сигмоиды.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/3d/64/3d645216-bb02-495d-b43a-86e61a80eb6a.png&quot; width=&quot;471&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Инициализируем параметры случайным образом.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/48/50/4850d1b0-cfd5-4f35-b3fb-84de6f3b69d6.png&quot; width=&quot;516&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;em&gt;random.randn(2, 2) - создает 2 ячейки по 2 случайных значения&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;random.randn(2, 1) - создает 1 ячейку по 2 случайных значения&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;В данном случае массивы с весами инициализируются таким образом - кол. нейронов входного слоя -&amp;gt; кол. нейронов скрытого слоя, кол. нейронов скрытого слоя -&amp;gt; кол. нейронов выходного слоя.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем скрытый слой.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/26/87/2687e126-ab83-4cff-ac0b-9df873512abd.png&quot; width=&quot;560&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Вычисляем выходной слой.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/67/09/670971c2-097b-4218-8b87-7d8fd24b21d9.png&quot; width=&quot;678&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Сгенерированные параметры:&lt;/p&gt;
  &lt;p&gt;weights_1 = [[1.76, 0.40], [0.99, 2.24]]&lt;br /&gt;weights_2 = [[ 1.87], [-0.98]]&lt;br /&gt;bias1 = 0.95&lt;/p&gt;
  &lt;p&gt;bias2 = -0.15&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Ответ сети:&lt;/em&gt;&lt;/strong&gt; 0.6951&lt;/p&gt;
  &lt;h2&gt;Что такое dot() в NumPy?&lt;/h2&gt;
  &lt;p&gt;Функция dot() выполняет &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86&quot; target=&quot;_blank&quot;&gt;произведение матриц&lt;/a&gt;. В нашем случае это требуется для вычисления слоев.&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Что такое random.seed() для чего нужна эта функция, узнаете в следующей статье.&lt;/em&gt;&lt;/p&gt;
  &lt;h3&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/editor/easyAI_Training&quot; target=&quot;_blank&quot;&gt;следующей статье&lt;/a&gt; рассмотрим как обучить нейронную сеть.&lt;/h3&gt;
  &lt;h2&gt;Ссылки&lt;/h2&gt;
  &lt;p&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C#%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&quot; target=&quot;_blank&quot;&gt;https://ru.wikipedia.org/wiki/Нейронная_сеть#Нейронные_сети_прямого_распространения&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://proglib.io/p/neural-nets-guide&quot; target=&quot;_blank&quot;&gt;https://proglib.io/p/neural-nets-guide&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>brmi1:easyAI_Introduction</id><link rel="alternate" type="text/html" href="https://teletype.in/@brmi1/easyAI_Introduction?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=brmi1"></link><title>Нейронные сети простым языком. Часть 1. Введение.</title><published>2021-05-17T19:29:19.152Z</published><updated>2021-05-17T19:31:00.007Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/11/ac/11ac3b57-c6e5-423b-a15b-fae694b1a82a.jpeg"></media:thumbnail><category term="neural-networks" label="Нейронные сети"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/2a/23/2a234240-83fb-4182-8cb2-501976bcf83d.jpeg&quot;&gt;Нейронная сеть – это математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей – сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Нейронные сети представляет собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов). Такие процессоры обычно довольно просты. Каждый процессор подобной сети имеет дело только с сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И, тем не менее, будучи соединёнными в достаточно большую сеть с управляемым...</summary><content type="html">
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2a/23/2a234240-83fb-4182-8cb2-501976bcf83d.jpeg&quot; width=&quot;850&quot; /&gt;
    &lt;figcaption&gt;Схема простой нейросети&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Что такое нейронная сеть?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Нейронная сеть&lt;/strong&gt; – это математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей – сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Нейронные сети представляет собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов). Такие процессоры обычно довольно просты. Каждый процессор подобной сети имеет дело только с сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И, тем не менее, будучи соединёнными в достаточно большую сеть с управляемым взаимодействием, такие по отдельности простые процессоры вместе способны выполнять довольно сложные задачи.&lt;/p&gt;
  &lt;h2&gt;Что такое нейрон (процессор)?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Нейрон&lt;/strong&gt; – это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной, скрытый и выходной. Также существует нейрон смещения, о котором вы узнаете в следующих статьях.&lt;/p&gt;
  &lt;h2&gt;Что такое синапс (сигнал)?&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Синапс&lt;/strong&gt; – это связь между нейронами. У синапса имеется один параметр – весовой коэффициент, в зависимости от его значения происходит то или иное изменение информации, когда она передается от одного нейрона к другому. Именно благодаря этому входная информация обрабатывается и превращается в результат, а обучение нейронной сети основано на экспериментальном подборе такого весового коэффициента для каждого синапса, который и приводит к получению требуемого результата.&lt;/p&gt;
  &lt;h2&gt;Для чего нужны нейронные сети?&lt;/h2&gt;
  &lt;p&gt;Нейронные сети используются для решения сложных задач, которые требуют аналитических вычислений подобных тем, что делает человеческий мозг. Самыми распространенными применениями нейронных сетей является: прогнозирование, распознавание образов, классификация и др.&lt;/p&gt;
  &lt;h2&gt;Какие бывают нейронные сети?&lt;/h2&gt;
  &lt;p&gt;Существует 26 типов нейронных сетей. Одними из наиболее популярных являются:&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Нейронные сети прямого распространения&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Широко используются в прогнозировании, кластеризации и распознавании. Все связи направлены строго от входных нейронов к выходным.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Рекуррентные нейронные сети&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Применимы в таких задачах, где нечто целостное разбито на части, например: распознавание рукописного текста или распознавание речи.Сигнал с выходных нейронов или нейронов скрытого слоя частично передается обратно на входы нейронов входного слоя.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Сверточные нейронные сети&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Специальная архитектура нейронных сетей нацеленная на эффективное распознавание образов. Каждый фрагмент изображения умножается на матрицу свертки поэлементно, а результат суммируется и записывается в аналогичную позицию выходного изображения.&lt;/p&gt;
  &lt;h2&gt;Немного истории&lt;/h2&gt;
  &lt;p&gt;Термин &amp;quot;нейронная сеть&amp;quot; появился в середине XX века. Первые работы, в которых были получены основные результаты в данном направлении, были проделаны Мак-Каллоком и Питтсом. В 1943 году ими была разработана компьютерная модель нейронной сети на основе математических алгоритмов и теории деятельности головного мозга. Они выдвинули предположение, что нейроны можно упрощённо рассматривать как устройства, оперирующие двоичными числами, и назвали эту модель &amp;quot;пороговой логикой&amp;quot;. Исследователи предложили конструкцию сети из электронных нейронов и показали, что подобная сеть может выполнять практически любые вообразимые числовые или логические операции. Мак-Каллок и Питтс предположили, что такая сеть в состоянии также обучаться, распознавать образы, обобщать, т. е. обладает всеми чертами интеллекта.&lt;/p&gt;
  &lt;p&gt;В 1949 году канадский физиолог и психолог Хебб высказал идеи о характере соединения нейронов мозга и их взаимодействии. Он первым предположил, что обучение заключается в первую очередь в изменениях силы синаптических связей. Теория Хебба считается типичным случаем самообучения, при котором испытуемая система спонтанно обучается выполнять поставленную задачу без вмешательства со стороны экспериментатора.&lt;/p&gt;
  &lt;p&gt;В 1954 году в Массачусетском технологическом институте с использованием компьютеров Фарли и Кларк разработали имитацию сети Хебба. Также исследования нейронных сетей с помощью компьютерного моделирования были проведены Рочестером, Холландом, Хебитом и Дудой в 1956 году.&lt;/p&gt;
  &lt;p&gt;В 1957 году Розенблаттом были разработаны математическая и компьютерная модели восприятия информации мозгом на основе двухслойной обучающейся нейронной сети. При обучении данная сеть использовала арифметические действия сложения и вычитания. Розенблатт описал также схему не только основного перцептрона, но и схему логического сложения.&lt;/p&gt;
  &lt;p&gt;В 1958 году им была предложена модель электронного устройства, которое должно было имитировать процессы человеческого мышления, а два года спустя была продемонстрирована первая действующая машина, которая могла научиться распознавать некоторые из букв, написанных на карточках, которые подносили к его &amp;quot;глазам&amp;quot;, напоминающим кинокамеры.&lt;/p&gt;
  &lt;p&gt;Интерес к исследованию нейронных сетей угас после публикации работы по машинному обучению Минского и Пейперта в 1969 году. Ими были обнаружены основные вычислительные проблемы, возникающие при компьютерной реализации искусственных нейронных сетей. Первая проблема состояла в том, что однослойные нейронные сети не могли совершать &amp;quot;сложение по модулю 2&amp;quot;, то есть реализовать функцию &amp;quot;Исключающее ИЛИ&amp;quot;. Второй важной проблемой было то, что компьютеры не обладали достаточной вычислительной мощностью, чтобы эффективно обрабатывать огромный объём вычислений, необходимый для больших нейронных сетей.&lt;/p&gt;
  &lt;p&gt;Исследования нейронных сетей замедлились до того времени, когда компьютеры достигли больших вычислительных мощностей. Одним из важных шагов, стимулировавших дальнейшие исследования, стала разработка в 1975 году Вербосом метода обратного распространения ошибки, который позволил эффективно решать задачу обучения многослойных сетей и решить проблему со &amp;quot;сложением по модулю 2&amp;quot;.&lt;/p&gt;
  &lt;h2&gt;Недостатки нейронных сетей&lt;/h2&gt;
  &lt;p&gt;У нейронных сетей есть ряд серьезных недостатков.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Ответ, выдаваемый нейронной сетью, всегда приблизительный&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Нейронные сети не способны давать точные и однозначные ответы. Но задачи, в которых надо применять ИНС и одновременно получать точные ответы, встречаются довольно редко.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Неспособность принятия решений в несколько этапов&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Нейронная сеть не может решать задачи, которые требуют последовательного выполнения нескольких шагов; она способна решать задачу только &amp;quot;в один заход&amp;quot;. Поэтому нейросеть не может, например, доказать математическую теорему.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Неспособность решать вычислительные задачи&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;В ИНС нельзя загрузить, допустим, математическое уравнение и получить его решения для различных параметров. Но это и не является предназначением нейронных сетей.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Трудоемкость и длительность обучения&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Для того чтобы нейронная сеть могла корректно решать поставленные задачи, требуется провести ее обучение на десятках миллионов наборов входных данных. Но уже разработаны различные технологии ускоренного обучения, современные видеокарты позволяют обучать нейросети в сотни раз быстрее, а недавно появились готовые, предобученные нейросети, в частности, распознающие образы. На основе таких нейросетей можно создавать приложения, не занимаясь длительным обучением.&lt;/p&gt;
  &lt;h3&gt;В &lt;a href=&quot;https://teletype.in/@brmi1/editor/easyAI_CalculatingPrediction&quot; target=&quot;_blank&quot;&gt;следующей статье&lt;/a&gt; рассмотрим как осуществляется предсказание сети.&lt;/h3&gt;
  &lt;h2&gt;Ссылки&lt;/h2&gt;
  &lt;p&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C&quot; target=&quot;_blank&quot;&gt;https://ru.wikipedia.org/wiki/Нейронная_сеть&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://www.it.ua/ru/knowledge-base/technology-innovation/iskusstvennye-nejronnye-seti-ins&quot; target=&quot;_blank&quot;&gt;https://www.it.ua/ru/knowledge-base/technology-innovation/iskusstvennye-nejronnye-seti-ins&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;http://www.interface.ru/home.asp?artId=37476&quot; target=&quot;_blank&quot;&gt;http://www.interface.ru/home.asp?artId=37476&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>