Проектируем нейросеть!

Как я начал изучать нейросети и python


Я начал изучать tensorflow
и как оказывается просто на нем можно
сделать свою нейросеть. Например я сейчас
покажу нейросеть которая отличает кошек
от собак. Для этого мне потребовалось
начать изучать язык питон который как
оказалось по-русски называют python
Раньше я избегал использование
этого языка потому что он работает очень
медленно и если я хотел сделать допустим
какую-нибудь игру там нужно производить
много вычислений эти вычисления бы
работали супер долго поэтому от язык мне
всегда не подходил но как оказалось
основная фишка тут в другом а именно в
0:33
том что большинство алгоритмов которые
0:35
нам нужны уже написаны и написаны в том
0:38
числе на достаточно быстрых и языках
0:40
типа see a python позволяет очень легко
0:42
взять подключить эти уже написанные
0:44
библиотеки и использовать их получается
0:46
что мы собираем программу из быстро
0:48
работающих частей которые в сумме будут
0:50
работать тоже быстро в других языках я
0:52
вас он привык использовать среду
0:53
разработки для написания проекта но
0:55
здесь например для экспериментов с
0:57
нейросетями принято использовать вот
0:59
этот вот джо петр ноутбук который
1:01
позволяет писать код в отдельных блоков
1:03
которые можно отдельно выполнять и это в
1:06
этом случае довольно удобно и код
1:07
получился настолько простым что он у
1:09
меня помещается на один экран и это еще
1:11
при том что здесь я сначала
1:13
подготавливаю данные для обучения на них
1:16
нейросети потом создаю саму нейросеть
1:18
потом ее обучаю и потом еще и и
1:21
использую все это вот здесь помещается я
1:23
сам только начал изучать все это поэтому
1:25
могу рассказать как проще начать
1:27
смотрите сейчас я использую вот это вот
1:30
джо питер ноутбук но чтобы его поставить
1:33
обычно устанавливают анаконду там
1:34
создают энвайроменталисты навлю туда
1:37
нужной библиотеки нужно чтобы все версии
1:39
совпадали нужно потом поднять эту
1:40
энвайроменталисты сложно в начале если я
1:43
хочу просто взять и начать писать код
1:45
но потом я нашел более удобный способ
1:47
оказывается google сделали свою штуку на
1:49
основе вот этой
1:50
где можно просто зайти на сайт и сразу
1:52
начать писать нейросеть для этого я
1:54
специально захожу на новый аккаунт чтобы
1:56
я еще не использовал эту программу
1:58
покажу как ее установить для этого
2:00
заходим в гугл диск нажимаем создать но
2:02
и и google немножко запрятали куда-то
2:04
далеко поэтому нажимаем еще здесь ее
2:06
тоже нет нажимаем подключить другие
2:08
приложения
2:09
и здесь я тоже сначала нет поэтому
2:12
пролить своим ниже и находим вот это вот
2:14
коллаборатория или google колаб его
2:17
устанавливаем он у меня почему-то
2:19
установился не с первого раза не знаю
2:21
почему но я несколько раз кликнул в
2:23
общем он установился теперь нажимаем еще
2:26
и здесь он появляется теперь мы можем
2:28
его открыть и здесь сразу можно писать
2:30
нейросеть плюс этого еще в том что все
2:32
что мы пишем будет выполняться на
2:34
серверах google а то есть наш комп
2:36
нагружаться не будет то есть это можно
2:37
писать любого даже самого старого компа
2:40
но в этом еще и минус потому что
2:41
мощности которые они предоставляют очень
2:43
низкие даже вот у меня комп семилетней
2:46
давности он выполняет все то же самое в
2:48
разы быстрее но зато для этого не нужно
2:50
ничего устанавливать поэтому сначала я
2:52
буду показывать такой подход
2:54
а еще подписывайтесь на канал прямо
2:56
посреди видео я еще раньше не просил
2:57
подписываться
2:58
но на всех видео две трети тех кто меня
3:00
смотрят не подписаны а есть несколько
3:02
видео на которых вообще 85 процентов те
3:05
кто меня смотрят не подписаны а еще нас
3:07
тут уже почти 100 тысяч вы знали что
3:09
существует больше ста тысяч каналов у
3:11
которых больше 100 тысяч подписчиков вот
3:13
и так для написания ты нейросети я
3:16
сначала добавляю все библиотеки которые
3:18
нам понадобятся когда вы используете
3:20
какой-то функции вы можете простые
3:21
загуглить и посмотреть какой библиотеки
3:24
она принадлежит и что нужно
3:25
импортировать для того чтобы она
3:26
работала я добавил все библиотеки и
3:28
теперь смотрите у нас нейросеть будет
3:31
работать с картинками и нужно чтобы
3:33
картинки были 1 разрешения так будет
3:35
гораздо удобнее поэтому давайте напишем
3:37
некоторый размер картинок
3:39
например у меня картинки будут 224 на
3:42
двести двадцать четыре пикселя вот я
3:43
объявил такую глобальную переменную
3:45
размеры
3:46
потом расскажу почему именно такое
3:48
разрешение дальше необходимо загрузить
3:50
datasette то есть те данные на которых
3:52
мы будем обучать нашу нейросеть я выбрал
3:55
майкрософтовский datasette с кошками и
3:57
собаками в нем 25 тысяч картинок для
4:00
того чтобы его загрузить пишем вот эту
4:01
функцию пишем название datasette а потом
4:04
пишем на какие части мы его разделим тут
4:07
я буду использовать полностью все для
4:09
тренировки нейросети то есть сто
4:11
процентов пойдет на тренировку нейросети
4:13
и вот у нас начинают скачиваться все эти
4:15
картинки обычно datasette делят на
4:17
несколько частей чтобы проверить 100 как
4:19
хорошо работает нейросеть на данных
4:21
которые она еще раньше не видел
4:22
но тут для упрощения я это пока уберу и
4:25
использовать мы и будем на своих данных
4:27
вот datasette скачался и нам
4:29
отображается его metadata то есть
4:31
описание этого datasette а вообще
4:33
проблема в том что datasette и все
4:35
устроены по-разному их нужно по-разному
4:37
скачивать потом по-разному использовать
4:39
но например здесь есть некоторые данные
4:41
за которые мы можем посмотреть например
4:43
разрешение тут она почему-то
4:45
отображается как на нан и 33 это
4:48
количество цветовых каналов то есть
4:50
красный зеленый синий той картинке у нас
4:52
цветные она говорит о том что разрешение
4:55
неизвестно на самом деле это потому что
4:57
все картинки в разном разрешение также
5:00
тут сказано что загрузилась 23000
5:03
картинок хотя обещали 25000 но на самом
5:06
деле это происходит из-за того что 1700
5:09
картинок повреждены и почему-то авторы
5:12
datasette а специально решили добавить
5:14
туда поврежденные картинки это даже
5:16
написано в его описании видимо это
5:18
сделано для того чтобы проверить
5:19
насколько программа может фильтровать
5:21
эти поврежденные картинки
5:23
но вот tensorflow это сделал за нас но
5:25
вот у нас вопрос от скачался теперь
5:27
нужно присвоить его какой-то переменной
5:29
а то я этого еще не сделал тут нам
5:31
возвращается два значения это сами
5:33
данные для обучения и вот это metadata
5:35
но metadata мы уже просмотрели дальше
5:37
она не нужно будет поэтому я поставлю
5:39
прочерк затем давайте посмотрим на
5:41
данные для обучения для этого я напишу
5:43
вот такой вот простой код где мы выведем
5:45
картинку из обучающей выборке
5:52
если вывести 10 картинок
5:55
то видно что вот здесь есть вот это вот
5:57
собака потом еще собака еще собака и
6:00
потом там дальше идут еще коты собаки но
6:03
все данные состоят из картинки и подписи
6:05
к ним поэтому давайте посмотрим еще на
6:07
подписи
6:08
видно что выводятся вот это вот лейбл и
6:10
тут единицы и нули видно что в начале 3
6:12
единицы и вот у нас идет три собаки
6:14
потом 0 и опять две единицы вот 0 это
6:17
код и потом еще две единицы это дальше
6:20
две собаки потом опять два кота это 2 0
6:23
и 2 собаки в конце 2 единицы то есть у
6:25
нас каты помечены нулем а собаки
6:28
единицей это кот с картинками давайте
6:30
уберем она дальше не понадобится я
6:31
просто напишу функцию которая будет
6:33
переводить картинки в более понятный для
6:36
не р city with дело в том что значение
6:38
пикселей в картинках обычно хранятся в
6:40
диапазоне от 0 до 255 а нейросети
6:44
гораздо проще распознавать данные
6:45
которые находятся в промежутке ну
6:47
например от нуля до единицы либо там от
6:50
минус единицы до единицы я просто поделю
6:52
все значения пикселей на 255 чтобы они
6:56
были в промежутке от нуля до единицы
6:57
также сменю разрешения всех этих
6:59
картинок на то самое 224 на 224 правда
7:03
некоторые картинки которые не очень
7:04
квадратные они получаются немножко и
7:06
сказаться но наверное для нейросети это
7:09
не так страшно и теперь давайте применим
7:11
эту функцию на наши данные для обучения
7:13
чтобы поменять разрешение картинок и
7:16
чтобы нормализовать значение пикселей
7:18
также здесь во второй строчке надо
7:19
разбить выборку на некоторые части а то
7:21
иначе она вся не по месяца в память
7:23
видеокарты данные подготовлены теперь
7:25
давайте перейдем к написанию самой
7:26
нейросети тут я буду использовать
7:28
свёрточная нейросеть так как она очень
7:30
хорошо распознаёт картинки свёрточная
7:33
нейросеть в отличие от классического
7:34
перцептивное не смотрит на всю картинку
7:36
сразу вместо этого она как бы сканирует
7:39
картинку по частям и и пытается
7:40
распознать там определенные фичи
7:42
например она может как бы идти по
7:44
картинке и искать где расположены уши
7:46
где расположены глаза и потом из этого
7:49
собирать где находится кот где находятся
7:51
собака но откуда нейросеть например
7:53
знает как выглядит ухо и для этого она
7:55
собирает ухо тоже из определенных частей
7:58
точно также как потом из этих частей
8:00
будет собирать например кота
8:02
сначала нейро
8:02
и смотрит на картинку и самое простое
8:04
что она пытается распознать это линии
8:06
следующий слой собирает из этих линий
8:09
например уголки а потом следующий за ним
8:11
из этих уголков собирает более сложные
8:13
изгибы или уже какие-нибудь простые
8:15
геометрические фигуры а потом следующий
8:18
слой из этих геометрических фигур уже
8:20
может например определить глаз а потом
8:22
следующий слой из этих глаз их прочих
8:24
фич может определить где код а где
8:26
собака при этом нейросеть сама всему
8:28
этому обучается она изначально не знает
8:30
что и нужно искать линии уголки кружки и
8:32
прочее
8:33
она сама в процессе обучения всегда
8:35
приходит вот такого вот
8:37
эффективному способу распознавания на
8:39
проблема в том что если мы будем сейчас
8:41
обучать нейросеть таким образом то это
8:43
будет очень долго потому что параметров
8:45
у нее огромное количество поэтому будет
8:47
очень трудно добиться высокой точности
8:49
но тут можно заметить что мы ведь уже
8:51
знаем что изначально нейросеть придет к
8:53
тому что она будет распознавать линии
8:55
потом эти уголки и так далее то есть мы
8:57
уже знаем основные фичи которые
8:59
нейросеть будет распознавать то есть
9:01
чтобы нейросеть не распознавала хотя то
9:03
котики и собачки и хоть это лица хоть
9:06
это какие-нибудь машины слоны или
9:08
космические снимки с телескопов всегда
9:10
нейросеть будет приходить к вот этим
9:12
простым вещам когда сначала она
9:14
распознает контуры фигур потом из них
9:16
собирает что-то более сложное вот я
9:18
нашел хорошую такую картинку где есть
9:19
лица машины слоны и стулья и видно что
9:22
все изначально начинается с одних и тех
9:24
же фич но тут наверное упрощенно это
9:26
показано потому что слоев скорее всего
9:28
потребуется гораздо больше и фичи в
9:30
начале какие-то слишком одинаковые но
9:32
общая суть примерно такая а это значит
9:35
что раз мы знаем что начальные фичи
9:37
будут одни и те же вы просто можем взять
9:40
кусок от уже обученные нейросети
9:42
и уже есть очень крутая нейросеть
9:44
которая может распознавать тысячу разных
9:46
объектов на картинках и тут я возьму
9:48
кусок от этой нейросети то есть ее
9:50
базовые слои которые будут распознавать
9:52
все эти фичи добавлю что тренировать эти
9:54
слои не нужно потому что они уже
9:56
натренированы
9:57
и вот она у нас скачивается кстати
9:59
именно поэтому я поставил разрешение
10:00
картинок 224 на двести двадцать четыре
10:03
пикселя потому что именно с таким
10:04
разрешением работает вот эта вот
10:06
нейросеть можно поставить меньше но чем
10:08
меньше тем ниже будет точность но чем
10:10
больше разрешение тем соответственно
10:12
медленнее будет работать нейросети
10:13
дольше нужно будет ее обучать
10:15
224 на двести двадцать четыре пикселя
10:17
это наверное не так много теперь нужно
10:19
собрать нашу нейросеть из вот этих
10:21
начальных слоев которые мы взяли от той
10:23
нейросети
10:23
и наших финальных которые будут уже
10:25
отвечать за распознавание кошек и собак
10:27
вообще в машинном обучении помимо
10:29
нейросетей существует огромное
10:31
количество других подходов
10:32
например обычные регрессии или леса
10:35
деревьев или модный сейчас лес по ней
10:37
поэтому для простоты чтобы не обозначать
10:39
каждый раз какие-то методы это просто
10:41
все называют модель то есть мы сейчас
10:42
обучаем некоторую модель так я и назову
10:45
эту переменную в которой будет храниться
10:46
наша нейросеть тут я вызываю функцию для
10:48
последовательного объявления слоев
10:51
сначала пишем наши базовые слои после
10:53
них делаем глобальный pulling он как бы
10:55
уменьшает картинку и усредняем значение
10:58
разных fitch затем я добавлю dropout на
11:00
0 2 это значит что 20 процентов нейронов
11:02
в процессе обучения будут случайно
11:04
выключаться это нужно для того чтобы
11:06
нейросеть не заучивала наизусть наши
11:08
данные а пыталась найти какие-то общие
11:10
фичи и затем добавляем вот такую вот
11:12
строчку чтобы скомпилировать эту модель
11:15
все теперь можно обучить нашу модель для
11:17
этого вызываем функцию фит в ней нужно
11:19
указать данные на которых мы обучаем и
11:21
количество эпох это то сколько раз она
11:23
пройдется по этим данным и запускаем это
11:26
мы видим уровень ошибки это насколько
11:28
точно не раз сеть сейчас может
11:30
распознавать картинки на которых она
11:32
обучается видно что это занимает около
11:34
13 минут поэтому я это просто ускорил
11:36
и вот нейросеть обучилась точность
11:39
девяносто семь с половиной процентов что
11:41
очень даже неплохо но на всякий случай
11:43
давайте я попробую еще запустить две
11:45
эпохи пусть нейросеть обучиться чуть
11:47
побольше вот когда прошло суммарно три
11:49
эпохи точность дошла до девяноста восьми
11:51
с половиной процентов теперь давайте я
11:53
загружу фотку своего кота применю на нее
11:55
те же самые преобразования которые мы
11:57
делали в начале с картинками чтобы это
11:59
подходило для нейросети
12:01
и у модели вызову функцию predict
12:03
которые как раз предскажет что ж это
12:05
такое
12:06
на что нейросеть отвечает значением
12:08
минус девять и что же такое это минус 9
12:11
а дело в том что если вы помните в
12:12
начале коты были помечены нулями о
12:14
собаке единицами а середина получается у
12:17
нас 0 5 то есть чем дальше в минус от 0
12:21
5 тем больше это кот а чем дальше это в
12:23
плюс 1 5 тем больше это собака
12:26
как я не применил не какую функцию
12:28
активации то значение просто уходят чем
12:30
больше тем наверное лучше а значит что
12:33
-9 это очень-очень код затем я создал
12:36
пост во как где попросил вас кинуть
12:38
своих котов собак и вот написал такой
12:40
код который будет проходиться по разным
12:42
картинкам и говорить что это кот или
12:44
собака нового первых сюда сложно
12:46
загружать картинки а во-вторых здесь
12:48
темный текст на тёмном фоне поэтому я
12:50
просто скопирую это все к себе и буду
12:52
выполнять уже это все у себя на компе
12:54
сначала мне его к присылали в самом
12:56
котов но видно что здесь видео коты коты
12:58
котэ
12:59
вот на этом коте видно что оценка не
13:01
очень большая потому что очень тяжело
13:03
его распознать и действительно когда
13:05
увидел эту картинку сразу подумал что
13:07
его надо будет тяжело распознать но тут
13:09
пошли собаки вот этот вот у него оценка
13:12
-9 то есть очень хорошо нейросеть
13:14
понимает что это кот хотя на него даже
13:16
наложены фильтра разные собака собака
13:18
собака кот вот у этого кота оценка -11
13:21
от огромная то есть нейросети распознают
13:23
его как очень-очень код а вот здесь
13:25
оценка очень низко и потому что тяжело
13:27
его распознать
13:28
а вот тут нейросеть подумала что это
13:29
собака до его наверно было очень сложно
13:31
распознать потому что картинка зашумлен
13:33
на я скорее всего это была схватка на в
13:35
темном помещении вот здесь оценка тоже
13:37
-11 то есть это очень код а вот здесь
13:39
нейросеть думает что это собака но по
13:41
моему это коз а вот здесь есть и кот и
13:43
собака и нейросеть дает ответ ровно
13:45
посередине 05 вот здесь код а здесь
13:48
нейросеть говорит что эта собака хотя
13:50
это явно код не собака кот кот кот
13:53
собака
13:54
а вот здесь попугай и нейросеть довольно
13:57
уверено в том что это собака тигр у нее
13:59
тоже почему-то собака вот здесь собака с
14:02
очень высокой оценкой 11 вот здесь кота
14:05
нейросеть распознавала как собаку хотя
14:08
действительно его очень тяжело
14:09
распознать я сам не сразу понял что тут
14:12
вообще на картинке происходит вот здесь
14:14
собака вот здесь код но они рассеять
14:16
очень неуверенно в том что это кот потом
14:19
здесь опять код притворился собакой
14:21
вот здесь оценка не очень высокое
14:24
здесь опять кот собака почему-то
14:26
нейросеть иногда котов считает собаками
14:29
но собака на никогда не считает котами
14:31
вот здесь опять попугай но на этот раз
14:33
нейросеть посчитала что это под и здесь
14:35
попугай у нас тоже скорее код и вот наши
14:37
победители вот этого катания рассеять
14:39
посчитала самым-самым котом а эту собаку
14:42
нейросеть посчитала самой-самой собакой
14:44
а это видео выходит в том числе
14:46
благодаря тем кто поддерживает канал на
14:48
патреоне ну или как говорится гур анус
14:50
панса ноты и коды а курить маз

Поделиться: