0: Всем добрый день. В этом видеоролике мы рассмотрим решение задачи классификации изображений. Используя библиотеку пайторч, то есть, используя свёрточные нейронные сети, в 1 очередь как раз-таки рассмотрим, как можно обучить собственный резнёт любую
1: Глубины, которая нас интересует. Также посмотрим, как можно обучить в принципе, любую архитектуру, используя фреймворк пайторч. Обычно задача классификации изображения. Это, знаете, как самая такая базовая задача, с которой стартует любой компьютер, вижн, разработчик, начинающий так же, как hello, world.
2: Только из мира компьютерного зрения. Поэтому данное видео будет полезно в 1 очередь ребятам, которые впервые знакомятся вообще с компьютерным зрением и хотят понять, как работает с пайторчом в частности. Да и как вообще можно производить классификацию тех или иных снимков, в чем смысл?
3: Классификация это, по сути, выбрать тот или иной класс. То есть на выходе такой нейронной сети должен быть класс. То есть вот представим себе ситуацию. Есть фотографии, куча разных фоток, например, фигуры домашние, животные дикие животные, там вообще может пироги какие-то.
4: Неважно, любые классы вы подаёте фотографию сетка должна отнести к какому-то из классов, то есть понять, что на данной фотографии расположен такой объект, который принадлежит к Такому то классу. Ну и притом ещё в идеале выдать вам какую-то степень уверенности, да, то есть убеждённости самой нейронной сети.
5: В том, что этот класс реально, вот этот класс, который она называет, само собой, воспринимать понятие уверенность в сети, как вот, ну, как факт уверенности человека, это немножко разные вещи, да, то есть сеть может быть уверена 100%, что перед нами медведь, а на самом деле перед нами там панда.
6: Ну, просто потому, что похожие объекты и вот так себя повела сетка. Такое тоже, может быть, как раз посмотрим. Тут понятно, чем больше у вас данных, чем разнообразнее датасет, тем лучше вы подойдёте к процессу обучения, подберёте гиперпараметры, о которых мы сегодня поговорим, тем больше шансов на успех решения задачи. Давайте
7: Сегодня как пример возьмём какую-то такую вот базовую задачу не особо сложную трехклассная у нас будет классификация, мы попробуем по фотографиям ботинок определить что это за модель обуви. Ну то есть модель имею ввиду вот что это nike, что
8: Адидасы, либо конверсы, да, то есть у нас будет вот 3 класса, 3 фирмы, значит, как выглядит наш датасет. Давайте посмотрим структуру датасета. Значит, это папочка на компьютере, да, вот я её собрал, папочка датасет, и в ней я разложил сразу фотки по трейн валидейшен.
9: То есть train то, на чем мы будем обучаться, валидейшен, то, на чем мы будем оценивать качество нашей нейронной сети. Смысл в том, что, само собой, если сетку оставить обучаться до бесконечности, да, там, подобрав идеальные параметры, сетка просто наизусть выучит все данные с train, то есть в
10: Она будет давать чуть ли не стопроцентное значение точности на трейнах, но это нам не очень нужно. Нам важно, чтобы сетка не идеально знала трейн, а чтобы она поняла общую закономерность, общую логику. Отсюда, собственно, чем лучше архитектура, чем её интереснее строение.
11: Тем больше шансов на то, что сетка поймёт именно то, что надо, а не просто заучит датасет. В принципе, можно заучить датасет, используя даже неглубокую архитектуру. Можно хоть полносвязную сетку использовать, чтобы просто запомнить трейн, это нам не очень нужно, нужно как бы, да, вот.
12: Понять общую закономерность. Значит, вот структура у нас есть папочка трейн, и в этой папочке 3 отдельные подпапки, да, то есть столько подпапок, сколько у вас классов. У меня сейчас в моём случае трехклассная классификация, поэтому будет 3 класса. Вот папочка адидас и tout лежат куча фотографии.
13: Про с кроссовками фирмы adidas дальше конверс и тут тоже папочка с большим количеством фотографий от конверсов то есть понятно да, тут довольно непростой такой датасет то есть много вообще не очень понятных не очень очевидных моментов да, вот например такая фотография ну я.
14: Не очень понятно, что это за класс, но, собственно, мы рассчитываем на то, что сетка как бы сможет общую закономерность понять. Вот. Потом посмотрим, как она отработает на валидационных данных. Значит, найк вот так выглядит папочка.
15: Значит, что ещё есть папочка валидейшен, да, то есть, видите, есть train есть валидейшен, валидейшен, абсолютно такую же структуру имеет это опять-таки 3. То есть столько папок, сколько у нас классов и в каждой из них вот фотографии, но у нас на валидации фото поменьше. То есть вот тут, допустим, по 38 в адидас,
16: Конверсах 38 и в night тоже 38, да, то есть ну у меня сбалансированные классы, понятно, что если не сбалансированные, то тут можно разные подходы использовать, можно, например увеличивать да, наращивать это определённого класс.
17: То есть, чтобы сделать более равноценные выборки, в общем, тут в этом плане нужно с этим чуть чуть поиграться. Ну, мы посмотрим прям такую базовую ситуацию, когда у нас прям сбалансированные классы и нужно просто классифицировать фотографии. Что ж, ещё в идеале, конечно, иметь
18: Тестовый датасет это dataset, о котором вообще в процессе всего обучения, всего подхода никогда мы не будем его использовать только тогда, когда все обучили, получили готовую нейронную сетку, прогнали на тесте, посмотрели качество это самый честный подход валидация.
19: Посмотрим, что такое, зачем нужна валидация. Валидация для нас это на самом деле, ну, вспомогательная вещь. Будем тоже смотреть, как у нас постепенно улучшается качество на валидации, и будем останавливать обучение в тот момент, когда у нас на валидации лучше всего показатели. Поэтому на самом деле нужно понимать, что при обучении
20: И мы будем как бы искусственно тормозить сетку, говорить, что все, стоп, харе обучаться, да, больше не будем обучаться. Все, хватит, потому что сейчас ты получил самое превосходное качество на валидации. Логично, что это не совсем правильно, да, то есть мы как бы подстроили
21: Сетку под хорошее качество на валидации. Поэтому в идеале иметь ещё 1 сторонний, 3 датасет, называемый тестовым, на котором мы потом просто прогоним, проверим, посмотрим и скажем, что да, действительно правильно сделали, что именно там остановились. Вот это качество самое хорошее, вот такая
22: Вот общая идея, но мы с вами посмотрим такую базовую ситуацию из 2 подборок обычно пропорции деления сами решайте, но это чаще всего 25 на test, остальные проценты на train то есть train должен быть большим, его должно быть много чем больше данных на трейне, тем больше сетка увидит в процессе обучения и как бы
23: Маризи поймёт общую закономерность. Думаю, с этим разобрались. То есть видно, вот, да, у нас датасет папочка, в ней трейн валидейшен, открываем трейн, тут 3 класса и валидейшен тут 3 класса, и в каждой, если открыть, это будет разные фотографии, да, по тематикам, думаю.
24: С этим тоже разобрались. Так, собрать свой, думаю, тоже сможете. Если вам нужно будет такую задачу решать. Супер. Давайте теперь попробуем понять, а как её решать с помощью пайторча, значит, начнём с того, что загрузим пайторч. Для этого заходите на сайт пайторча.
25: Там есть команда pip install пайторч, если у вас есть видеокарта, да, чтобы было быстрее обработка, то нужно ставить определённую версию пайторча. Давайте покажу, значит пишем пайторч. Так, ну, пайторч.
26: И вот на сайте пайторча тут можно собственно найти его установку значит где вот установка вот снизу вот есть как установить pytorch значит стейбл версия допустим у меня windows через пип устанавливаю для питона и
27: Дальше выбираю версию куды, куда это, собственно, вы сначала перед этим ставите себе, куды, если у вас есть видеокарта, устанавливаете её на компьютер, а потом выбираете ту версию, которую вы поставили. Это либо 12 точка 1, либо 11 точка 8. Если же у вас нету видеокарты, то используйте версию цпу. Вот, собственно, ваша команда для
28: То есть вот например, я ставил с видеокартой, по моему, у меня куда 11, вот, собственно я взял себе, поставил вот эту вот строчку и у меня все заработало супер. Ну вот значит у нас все готово, мы установили все нужные библиотеки, это pytorch поставили, да, у нас само собой станет ещё торч.
29: Библиотека это которая позволяет нам использовать некоторые встроенные модули тарча, например, готовые нейронные сетки, да, то есть архитектуры, готовые всякие трансформации, датасеты и так далее. Вот кудм это тоже полезная библиотека для того, чтобы отображать прогресс, да, вот по загрузке
30: Когда у вас такое, знаете, будет динамически, как будто двигаться прогрузка. То есть это позволяет делать. Ну, рандом, понятно. Нампай тоже, думаю, знакомо для вас сайкит лерн нужен будет для подсчёта метрик. Мы с вами будем оценивать классификационные
31: Метрики, классификационные метрики самые известные. Это понятно. Экрос, пресижн, рекол, там, ф, 1 рок аук. То есть очень много разных метрик есть. Я думаю, вы про все из них как минимум слышали. Советую ознакомиться, потому что мы ими будем сегодня этот оперировать. Такж.
32: Матрица ошибок confusion matrix, да, то есть тоже все это будем использовать дальше матплотлиб для отображения графиков. Сиборн тоже для графиков пил это для отображения ну тоже по сути как cvv 2 библиотека да, это для работы с изображениям.
33: Также можно пилом работать обычно, когда работают с пайторчом, чаще используют пил, потому что, ну, скажем так, пайторч лучше с пилом взаимодействует. Для него очень много готового всего есть, поэтому я буду использовать в данном случае пил вместо cvv 2 ну тут как бы не критично мож.
34: В принципе, через cvv 2 сделать все тоже будет работать супер значит давайте тогда будем запускать по очереди значит выбрали некое окружение вот у меня это питон 3 10 в принципе неважно. Любой питон выше чем 3 6 точно будет работать собственно вот у меня сейчас длительный процесс установки готов.
35: Значит, дальше выбираем стилистику графиков. Тут, короче, можно узнать, вот такая есть команда плт стайл, веллбелл. Можно посмотреть, какие у вас есть, в принципе, стилистики для отображения графиков. Ну, я, собственно, использую вот gg плот, ну, мне такой просто нравится, вот.
36: Собственно, я поэтому его установил. Можете попробовать разные. Это чисто вот такая стилизация ваших графиков, плт. Итак, далее, установка сидов. Это нужно для того, чтобы вы имели возможность сделать повторяемость экспериментов, чтобы если вы дальше, например, решите взять и ещё
37: Раз запустить все ячейки сверху вниз, да, чтобы у вас были те же самые результаты, чтобы у вас не получалось. Так что каждый раз у вас будет разные резы, почему так может происходить? А потому что каждый раз у вас, во первых, нейронная сетка может заполняться рандомными числами. Градиентные спуски, батчи.
38: Да, который постоянно там будет у вас подсовываться разные рандомно перемешке, чтобы вот это вот все параметры, где у нас есть какие-то рандомы перемешивания, все это было постоянно идентичным, чтобы каждый раз получали одно и то же. Вот это нужно для повторимости экспериментов. Тут видно фиксирую вообще.
39: Все седы это седы, связанные с видеокартой, с цпу, с нампаем с обычным пакетом рандома. Вот то есть тут прям сразу куча всего супер. Далее запускаем вот эту команду, эта команда нам покажет, что
40: На каком устройстве возможно производить обучение. То есть вот эта строчка. Понятно, что он проверяет, есть у вас видеокарта или нет. Если видеокарту обнаруживает, то у вас будет, собственно, куда, если видеокарту не обнаруживает, то у вас будет цпу здесь в ответе вот
41: Мне он говорит, что да, супер девайс куда-то есть он нашёл видеокарту и у нас вся обработка будет с видеокарты вестись, но опять-таки тут если у вас есть видеокарта, да, от nvidia, и при этом вы видите здесь, что у вас нету, куда пишется цпу, то возможно вы неправильн.
42: Поставили пайторч возможно вы не установили куду заранее да, на компьютер нужной версии короче вот посмотрите со всеми этими моментами поизучать в интернете как поставить правильно куда и установить pytorch вот это собственно больше не к моему видео это больше вопрос к установке библиотек, поэтому поизучайте это.
43: Отдельно супер. Давайте поговорим немножко про нейронные сети, а именно про классификацию, как обычно. Какая задача подходит значит, чтоб было понимание. Давайте чуть чуть порисуем и как раз-таки все это на примере обсудим. Значит, смотрите, что такое классификация. По сути, это выдача того или иного
44: Класса, поэтому на выходе сетки всегда столько нейронов, сколько классов, то есть в у нас будет 3 класса, поэтому 3 нейрона и каждый класс отвечает за, ну каждый нейрон за свой класс, например это будет night, это будет
45: Конверс, например, конверс. Неважно. Я не помню, как пишется, вот и будет адидас.
46: Суть в том, что нейронная сетка будет принимать на вход изображение, да, какое-то изображение, притом наше изображение это трехканальное изображение, потому что это rgb, оно цветное, да, то есть вот трехканальное изображение какого-то размера. Обычно это главное очень важное правило, когда работаете с любыми нейронными сетям,
47: Вы должны заранее определить размер входного, ну, входной размер фотографии, то есть все фотки сначала ресайзятся, да, то есть, как бы приводятся к определённым размерам, а потом прогоняется через нейронную сеть. Поэтому вы сами задаёте параметр этого стартового ресайза, но советую брать, если мы используем какие т.
48: Готовые архитектуры, да, а мы с вами как раз будем использовать готовые архитектуры, потому что нет резона делать свою архитектуру, когда есть хорошие, проверенные на практике архитектуры. Поэтому возьмём готовую, будем юзать с вами архитектуру, резнёт. Про неё сегодня тоже поговорим попозже у этой
49: Архитектура, размер 224. Ну, классический, да, который используется 224. Вот. Ну и канальность 3. Поэтому вот, собственно, наш размер будет 224 224 на 3. Вот таким вот образом приходит фотография, подаётся на некой некий, как говорится, чёрный
50: Ящик, да, вот эта наша сетка, цнн сетка. И на выходе, собственно, цнн сетка вот так вот выплюнет ответы, да, и получится 3 числа. То есть сетка приняла фотографию такой размером, а на выходе выдала 3 числа, например, числа могут быть, не знаю.
51: Там 15 200, - 3. Ну, я абстрактно, вот мы получили такие 3 числа. Тогда, собственно, принцип очень простой. То число, которое больше, то и есть правильный ответ. То есть в данном случае ответ был бы конверс, потому что 2 число в данном случае, например, в нашем кейсе отвечае
52: За конверс. То есть получается класс определяется как бы номером иннервированной нейрона, тот самый нейрон, который больше всех как бы зажёгся, то есть больше всех имеет значение. Поэтому вот такая общая логика будет под капотом. При этом есть ещё такая операция в
53: Математики называется софт Макс софт. Макс. Можете про неё изучить, посмотреть, что это за функция. Вот если подать вот эти вот этот вот вектор через софт Макс, то нам на выходе выплюнет вероятности. То есть, по сути, выплюнет там уже уверенности.
54: И в классах, то есть он сделает так, что суммарно это будет единица, и vektor будет выглядеть. Ну, например, я выдумываю, я не прогонял через софт. Макс, ну, например, 0 0 5.
55: Потом будет 90. Давайте так. 0 98, 0 0 1. Вот что-то типа такого, что он сделал суммарно. Так, только я, наверное, ошибся. 0 90.
56: Не 8, извините, а 0 94. Вот так сумма должна быть равная единице, да, сумма. И каждое значение, собственно, тогда определяет нам как бы конфиденс. То есть уверенность это в данном случае интерпрети.
57: Как 5%, да, то есть уверенности это значит, 94% это 1%. Ну и логично, что суммарно у нас 100%. То есть видно, да, у нас как бы, выход, мы можем интерпретировать как уверенность, вот насколько сильно числа друг от друга разнятся. Логично, чт.
58: Чем больше расстояние между числами, да, то есть, чем больше ответ, который занервировал я, выделяется от других чисел, тем больше уверенность классификатора. То есть, например, если бы тут было бы 200, а другой нейрон 150, то логично, что конфиденс был бы уже не 5.
59: Процентов тут, а уже побольше. То есть он был бы ближе к 200, да, то есть, значит, он был бы, наверное, ближе там, к тому же, что и у другого класса получилось бы примерно 40%. 1 класс, там, не знаю, 45 другой. То есть, понятно, да, вот такая вот общая логика, чем больше эта вот разница, да, выделе
60: От конкретного числа, тем больше конфиденс. Вот такая вот общая, ну, задумка, которая лежит под капотом операции софтмакс, которая как раз как бы интерпретируется в математике как уверенность, убеждённость нейронной сети. Теперь давайте посмотрим, а че находится вот в этом вот
61: Блоке, который назвал черным ящиком под названием свёрточная нейронная сеть. Это, собственно, как раз-таки архитектура, которая позволяет нам из фотографии на выходе получить 3 числа, как она это делает. Значит, каждый раз у нас пробегается не
62: Фильтр, да, который подбирает свои коэффициенты. Много, много, много фильтров друг за другом. Они бегают, бегают, бегают по изображению, постепенно изображение уменьшают, уменьшают, уменьшают. И тем самым мы рано или поздно получаем как бы очень, очень, очень маленькое изображение, в котором сконцентри
63: Какая-то гипер информативная составляющая оо входном изображении, то есть получаем некий как бы некий формально некое изображение, потом его как бы превращаем в длинный вектор, то есть, по сути делаем операцию флатерне вот этот вот большой длинный информативный вектор.
64: Признаков подаётся на обычную фули коннектор, то есть полносвязную сетку типа пенцетом. И на выходе у нас 3 нейрона. То есть вот мы получаем как бы на выходе обычную полносвязную сетку, которая как бы все со всеми. То есть вот у вас будет там примерно вот такая вот логик.
65: То есть все со всеми будут связаны. Вот такая вот общая там структура. То есть любая сверочная, классификационная нейронная сеть состоит из 2 аспектов, это свёрточная часть, а потом идёт фули коннекта, то есть полносвязная, то есть полносвязная часть.
66: Никогда не может не быть, потому что у нас в данном случае, видите, концовка видно, да, это же как раз-таки полносвязный элемент, он никак не является свёрточным элементом. Это просто полносвязный про то, что такое свер, что такое свёртка. Операция, что это математически значит? Посмотрите в интернете, почитайте, не так уж сло.
67: Сложно на самом деле это операция как бы скольжение некого фильтра по изображению. То есть, по сути мы пытаемся неким скольжением фильтра по изображению какие-то паттерны вытягивать и информативные признаки как бы выхватывать из исходного изображения, а ресайзы, то есть, да, постоянная
68: Уменьшение размера нужно для чего? Для того, чтобы мы могли видеть разного уровня? Признаки высокоуровневые, низкоуровневые. То есть, да, вот, например, если первые слои будут выхватывать такие признаки, как, не знаю, там морщины, может быть там, не знаю, глаза, че-нибудь такое, то уже подальше это будет уже лица, это
69: Будет уже там, не знаю, тело человека, да, то есть уже какие-то более высокоуровневые признаки. То есть, да, мы смотрим то вблизи, то вдали и так далее. Вот общая идея, поэтому архитектура классифик, давайте посмотрим вот общее строение, например, извест
70: Нейронной сети, которую мы сегодня будем использовать. Резнёт, резнёт. Это такая 1 из самых популярных сейчас сетей. Есть, само собой, очень много сетей, которые давно уже бьют соты, то есть бьют как бы рейтинги, и они выигрывают у резнета по качеству. Но нужно понимать, что когда мы говорим, что какая-то сетка выигрывает у другой сетки,
71: На самом деле, что имеется ввиду с точки зрения реальности, это означает то, что есть некий общий датасет, всемирный, да, который называется имиджнет. И на этом датасете куча разных разработчиков соревнуется, кто у кого выиграет, то получит лучшее качество, то, что кто-то выигрывает.
72: Имеет лучшее качество, не всегда означает, что его сетка лучше в априори. Возможно, его сетка хороша просто вот для этой конкретной уникальной задачи под названием классификация, там имиджнет. Но вот именно общий случай, да, то есть, чтобы можно было, например, вам в своём уникальном случае, да, вот у вас там не зна,
73: Проект какой-нибудь вы классифицируете станки или, не знаю, там пытаетесь определить там кошек от собак. Вот для вас, возможно лучше подойдёт какая-то другая сетка, да, то есть не обязательно та самая, которая выигрывает на имэджнете. Вот особенность резнета кроется.
74: В том, что это такая сетка с очень оптимальной хорошей архитектурой, которая, в принципе, интуитивно даже понятна, почему она хорошая, почему она, ну, преферентных ре, для стартового ресерча. Если вы делаете какой-то ресерч, обычно все его проводят на резнёт. То есть обычно
75: Него начинают, бывает даже так, что на нём и заканчивают, потому что из нет зачастую выигрывает в гонке. Вот ещё из хороших архитектур, которые советую тоже поизучать. Это архитектуры мобайл. Нет, мы сегодня тоже их все увидим. Давайте покажу, чтобы было понимании.
76: Вот смотрите, у пайторча есть готовые архитектуры. Вот они алекс, нет виджи джи ризет сквиз. Нет, dance, нет инсепшн. Вот собственно вот эти все сетки, они все довольно хорошие. Вот мобайл нет, в 2, например, вот этот вот реально популярный, её часто используют тоже как
77: Для ресерча советую, особенно, когда у вас для мобильного устройства нужно сделать, да, какое-то решение, то есть очень быстрое, очень лёгкое резнёт. Вот, собственно, у резнета тоже понимали, резнёт он не 1, у него, если открыть, там у резнета очень много разных архитектур, то есть сам резнёт.
78: А приче, определяется глубиной. То есть, например, у резнета может быть 18, 32, 64. То есть, там, короче, резнеты это целое семейство сетей. То есть, это как бы, и идея сетей, а уже вот это число, которое в конце ставится, это как бы глубина, чем глу.
79: Глубже сетка, тем, во первых, она медленнее работает, но зато у неё, возможно, лучше качество. Но учтите, если у вас данных мало, вы не сможете обучить сетку гиганта, то есть сетку, которая глубинной, там 100 с чем-то слоёв. Если у вас данных, там всего 1000 фотографий, ну, скорее всего, у вас никаких шансов обучит.
80: Если бы у вас был бы 1000000 фотографий, там 100000 фотографий, тогда да, конечно. То есть, чем больше данных, тем больше шансов того, что глубокая сетка даст выигрыш, часто бывает так, что чем меньше сетка, тем даже лучше получается, потому что неглубокие сетки при маленьком количестве данных, ну,
81: Быстрее сходятся, да, то есть быстрее доходят до оптимальной конфигурации, чтобы давать хорошие результаты. Ну вот такая вот идея. Поэтому, видите, у пайторча, если вы используете пайторч, есть готовые сетки, можно их уже подгрузить. Вот пример, да, например, можно резнёт, вгрузить алекснет, виджи, джи, то есть любую сетк.
82: Вгружаете и с ними дальше работаете, их обучаете. Поэтому запомним важную фразу. Понятие сетка, когда я говорю, используем, резнёт, значит мы взяли архитектуру, то есть строение, то есть то, что находится у нас здесь под капотом чёрного ящика, вот это
83: Вот мы как раз-таки используем готовое. Я сегодня тоже покажу в конце видео, как можно использовать свою рукописную сетку, то есть создать свою архитектуру нейронной сети свёрточной. Ну обычно этим никто не занимается. То есть зачастую все берут готовые какие-то базовые архитектуры. Супер. Значит с этим мы
84: Разобрались. Давайте теперь посмотрим, как в коде это все сделать. Значит, мы должны с вами сейчас подгрузить готовую нейронную сеть, а именно резнёт, да, то есть сетка резнёт. Возьмём её не особо глубокую. 18 это самая самый неглубокий вариант резнета резнёт.
85: 18. Значит, у нас всего 18 будет слоёв. Вот и вгрузим, собственно, эту сетку. Что ещё нам нужно сразу тогда сделать? Так нужно тогда обсудить, в чем смысл резнета? Чем он такой уникальный. Смотрите, любая
86: Свёрточная сетка обычно состоит из неких определённых, определённого порядка операций математических. 1 операция это свёртка называется конволюшн, да, на английском. То есть свёртка. После свёртки обычно ставится некая операция. Activation активе.
87: Это какая-то функция активации. Обычно активация, ну зачастую используется релу. Далее после активации у нас идёт Макс пулинг, Макс пулинг.
88: И вот это вот называется обычно вот это вот как бы совокупность 3 операций называется свёрточным слоем. То есть, когда говорят, у меня 18, да, там 18 свёрточных слоёв, на самом деле, имеется ввиду, что у вас 18 вот таких вот последовательных блоков, которые содержат конволюшен актив.
89: Pulling конволюшн activation пуллинг и вот они у вас собственно последовательно друг за другом ставятся. И вот зачастую самые первые нейронные сетки, которые появлялись очень популярные в своё время. Давайте, например покажу вам виджи джи вот такая была раньше очень популярная сетка у неё.
90: Архитектура вот такая. Смотрите то есть у вас идёт раз блок all activation пулинг 2, потом дальше ещё 1 видите ещё 1 собственно и там у вас по очереди постоянно идёт вот видите во
91: Convolution макспулинг идёт, да, тут же ещё активация там используется. Зачастую там ещё бывают. А сейчас, сейчас уже такие всякие модернизации, когда используют конволюшен, том, опять конволюшен. То есть бывает такое, знаете, двухстадийный 2 раза конволюшен используется. Но общая структура всегд
92: Одинаковая. То есть у вас в какой-то момент произошёл макспулинг. Макспулинг это снижение размерности. Вот оно у вас снизилось, потом опять снизилась размерность, опять какие-то операции, свёрток, потом опять снизилась размерность опять снизилась и так далее. То есть идея в чем, что когда вы постепенно снижаете некую
93: Вы смотрите разного уровня фичи, то есть то высокоуровневый, то низкоуровневый. То есть вы смотрите на фотографию под разными ракурсами, да, то есть вблизи, то вдали. Поэтому смысл Макс пулинга именно в том, чтобы вам дать разнообразие ракурсов. И в конце, всегда после окончания свёрточных слоёв. Видите?
94: То, что тут такого салат, ну, типа зелёного такого, да, синеватого цвета, это полносвязные сверочные слои, а в конце начинается вот фиолетовый, это полносвязные. Вот я всегда говорил, что в конце, да, у вас идёт фули, коннект, слои, потому что это как бы, ну, обязательный атрибут, чтобы
95: Получилась классификацию на выхое должно быть столько нейронов, сколько классов. Вот тут, например, на входе 1000 классов, видите? Вот, да, сайз 1000, то есть на выходе 1000 классовая классификация, поэтому в конце нейронов 1000. И вот, собственно, это какие-то промежуточные полносвязные слои. Вот примерно общая
96: Архитектура чем же проблема таких сетей, как vg g, когда сетка очень глубокая, когда в ней очень много свёрточных слоёв, вообще всего всего очень много и навалом, то когда вы обучаете такую сетку, вы, по сути пытаетесь с помощью градиентного спуска минимизировать функцию ошибки и
97: Если вот обучить слои вот эти полносвязные довольно не сложно, то вот обучить вот эти вот глубокие слои, да, те, которые находятся на старте, практически невозможно, потому что, как бы градиентный спуск даже не доходит до таких слоёв. Обычно он начинает менять все ваши нейрончики вот здесь, ближе к
98: Сетки, но не к началу. И тем самым, как бы вы, по сути, поменяли только выходные слои. А вот эти вот внутренние, которые как бы тоже, наверное, полезные, нужные. Вы вообще, по сути, даже оставили, типа, нетронутыми такими, как они были рандомно инициализированы сначала. То есть вы сначала как б
99: Рандомно инициализировали веса, а потом просто рандомным образом пытаетесь как бы, ну, подобрать хороший коэффициент. Вот с помощью градиентных спусков. Логично, что тогда вы подберёте концовку, а начало сети, скорее всего, останется таким же
100: Рандомным, таким же неоптимальным под вашу задачу. Как же эту проблему решить? Как сделать так, чтобы градиенты, да, могли достукиваться до самых стартовых слоёв, чтобы они спокойно проходили вот эти вот все глубокие многослойные сетки. Для этого была придумана классная идея.
101: Названием резидуал коннекшнс, то есть как бы по сути некие перелёты отсюда слово резнёт, то есть резиди коннекшн, нетворк, вот такое у неё строение. Смотрите, вот у вас на вход приходит какая-то фотография. Так, сейчас секундочку тут нужно посмотреть, понять порядок.
102: Справа налево, да, вот значит вы приходи, приходит какая-то фотография и вот смотрите, видите, какой-то идёт блок и свёрток, куча разных свёрток. Потом, собственно опа, Перелёт. Смотрите, опять какой-то блок и свёрток опять Перелёт. Видите, вот эти перелёты позволяют делать так что когда вот
103: Вы делаете бэки, то есть обратное распространение ошибки, вы можете спокойно долететь до первых слоёв. Вот смотрите, вот представьте себе, что вы вот какой-то там, не знаю, градиентный спуск. И вот вы пытаетесь как-то оптимизировать веса нейронной сети, тогда благодаря Такому подходу вы можете
104: Спокойно, кстати, вот так вот по этим вот резнета, да, вот по этим вот перелётам быстро, быстро, быстро достучаться, даже вот до самых самых первых слоёв. То есть вы можете спокойно перелететь сквозь все свёрточные операции и спокойно, быстренько поменять
105: Вот, скажем так, веса даже на стартовых, скажем так, стартовых свёртках. Вот это вот главное преимущество, которое очень сильно прокачало качество, ну, систем классификации. Сейчас вообще эта резнёт. Технология используется почти везде, какую бы сейчас бы сетку
106: Нашли по детекции, сегментации, классификации. У всех будет строение, подобное лизетам, потому что перелёты позволяют повысить качество. Вот это вот общая идея. Вот видите, вот смотрите, вот пример, как это все выглядит. Вот у нас класси идёт общее строение, у нас есть какой-то
107: Цинн, блок, да, свёрточный. Потом идёт функция активации опять какая-то свёрточный блок. И вот смотрите, опа, Перелёт, видите? То есть просто чисто Перелёт этот Перелёт позволяет, скажем так, пробрасывать градиенты быстрее. Ну, в общем, общую идею, думаю, разобрались, поэтому резнёт такой популярны.
108: Он интуитивно понятен, а главное, он действительно даёт классную возможность обучать даже очень глубокие сетки. То есть даже если у вас будет сетка размером 100 с чем-то слоёв, можно будет без проблем её обучить, потому что резнёт, позволяет вам это сделать. Вот думаю, с идеей разобрались теперь.
109: Переходим к коду. Значит, что мы делаем? Запускаем данный код. Значит, мы с вами загружаем. Модель резнёт. Вот мы загрузили модель резнёт. Собственно, и я ставлю параметр претрейнд равный true.
110: Это значит, смотрите, что такое вообще загрузить нейронную сеть. Мы просто как бы создали некую архитектуру и по умолчанию просто рандомным образом, случайно практически, да, там, там, конечно, умный рандомайзер, но тоже, как, скажем, практически рандом в кавычках он заполняет все, все.
111: Все нейроны какими-то числами. Стартовая инициализация зачастую не самая хорошая штука. Рандом не всегда классно работает. Зачастую стараются использовать стартовые веса, такие как уже у хороших сетей. Вот, собственно, когда вы ставите параметры, претрейн равный
112: Вам загружает, резнёт уже с хорошими стартовыми весами, да, они, скорее всего, будут вообще, типа, ну, бесполезны для вашей задачи. Но в любом случае инициализация хоть чем-то отдалённо хорошим, лучше, чем просто рандомом, поэтому предпочитает всегда.
113: Используют предобученную сетку, то есть берут по по старту претрейнд равный true эта операция называется файнтюнинг, то есть вы как бы загрузили готовую сетку, а дальше будете тюнить, то есть, да, дотюнивать до улучшать, начиная от весов какой-то другой нейронной сети.
114: Вот, собственно, это вот общая идея, поэтому, если вы ставите здесь параметр претрейн равный true у вас будет готовая сетка и ставите фолс, то у вас будет рандомная инициализация весов мы сегодня с вами тоже посмотрим, как эксперимент, запустим вариант с предобученной архитектурой и без предобученной посмотрим, насколько у нас лучше.
115: Происходит сходимость, насколько быстрее мы доходим до хорошего качества вообще, какие у нас, ну, преимущества от использования файнтюнинг подхода. Итак, смотрите, когда мы загрузили готовую функцию инет, то на самом деле можно, давайте вот ради интереса просто проведём этот, такой
116: Некий абстрактный эксперимент. Вот мы загрузили некую модель, давайте я прям отдельно вот вынесу её, просто загрузили модель и теперь попробуем через эту модель прогнать некий случайный вектор по моему
117: Пишется торч точка ранд по моему, ранд, по моему, так rand.
118: Вот по моему рене и дальше нужно указать собственно размер. Давайте попробуем ещё какую-то размерность подобрать. Ну вот смотрите, я сейчас подобрал, вот значит, 1, 3 224 224 это значит 1 размерность это butch. То есть в чем идея, мы на самом деле в сетку гоним
119: Не 1 фотографию, а сразу несколько фотографий. Поэтому, собственно, мы, допустим, можем прогнать за сетку, там 100 фотографий, 200 фотографий. Поэтому 1 число это количество фотографий, которые мы гоним за раз. Дальше. Размерность фотографии 3, это количество каналов rgb. И я уже говорил про эти числа 224 на
120: 224. Давайте 224. Это как бы размерность фотки, которую мы подали на вход. Значит вот мы прогнали. Видите, смотрите, каждый раз я запускаю какие-то рандомные числа, генерятся, рандомные числа проходят через сетку, и мы получаем какие-то ответы. Что это за ответ такой у сетки?
121: Давайте посмотрим, что за ответ выдаёт нам модул. Давайте просто пишем функцию шейп по моему так она пишется шейп, и давайте глянем, че у неё за размер. И вот мы видим, что её размерность 1, то есть
122: Получается 1 фотография и для 1 фотографии выделена 1000 чисел. Почему 1000? А все очень просто, потому что, когда мы инициализировали нейронную сетку, а именно резнёт, она взяла по умолчанию, резнёт, который обучался для задачи, имиджнет, имиджнет. Это задача классифици.
123: На 1000 классов. Поэтому, помните, я говорил, что в конце количество нейронов столько, сколько классов у нас по умолчанию сетка загрузилась тысячью классами, нам же с вами не нужно 1000 классов, нам нужно, чтобы у нас нейронов, было столько, сколько у нас классов, у нас их 3, да, то есть night там dead.
124: И этот, и конверсы. Поэтому давайте с вами сейчас возьмём сетку, которая вот нам нужна, и эту сетку чуть чуть изменим. То есть просто поменяем количество последних нейрончиков вместо 1000 поставим 3. Вот.
125: Для этого вот, собственно, какой код я написал значит мы загружаем сетку, потом указываем, сколько нам нужно классов и, собственно, заменяем фули коннект, то есть полносвязный последний выходной слой на количество нейронов, которые нас интересует. Супер. Давайте теперь вот возьмём и опять эту же функцию через
126: Модель новую прокинем, значит прогоняем также рандомный какой-то тензер. 1 изображение. 3 канала. 224 224. Собственно, опять-таки запустили. Опа. То что надо. Смотрите, мы на выходе получаем как бы каждый раз
127: Будем получать 1 фотографию и 3 каких-то числа. Давайте я уберу слово шей, посмотрим, как это выглядит. Вот видите, смотрите пример. Я вот запускаю какие-то рандомные числа, пролетают через нейронку, и вот мы получаем каждый раз какие-то рандомные значения. Ну вот видно, что если бы это были бы не рандомные
128: Числа какие-то осмысленные, да, то есть это было бы реальное какое-то изображение с каким-то смыслом то что бы мы получили на ответе. Вот мы смотрим и видим, что вот это вот у нас 0 0 2, это вот какой-то знаком минус, а вот это вот число 0 2 9, оно самое большое, поэтому логично, что нейронная сетка
129: Считает, что вот этот вот рандомная фотография, да, это класс под номером, ну то бишь 3, да, то есть 3 класс, ну что у нас будет классом, сейчас посмотрим. Ну, думаю, понятно, да, общая логика, то есть вот какая общая идея. То есть у нас как раз мы получили вот это вот
130: Концовку 3 каких-то вот эти вот абстрактных числа, а потом уже их интерпретируем как там что-либо вот примерно такая логика. Супер сетку загрузили. Давайте теперь попробуем подготовить данные значит как загрузить данные значит все довольно.
131: Просто берём, указываем путь до папочки с трейном, путь до папочки с валидацией. То есть вот, да, вот как раз до этих папочек указываем путь. Далее определяем трансформации. В чем идея. Помните, я говорил, что нужно все фотки, которые у нас есть, привести к определённому внешнему виду, а именно
132: Чтобы размер был 224 на 224, вот собственно я это и делаю, что каждая фотка становится размером 224 на 224 и превращается в torch тензер, то есть она по умолчанию закачалась, а потом стала тензором, потому что как вы заметили ну пайторч работает везде.
133: Поэтому, видите, я тут гнал вот этот вот объект, на самом деле этот объект, если его раскрыть, это какой-то, видите, тензер, то есть это какой-то вот рандомный, ну в данном случае торч тензер, вот с этим примерно работает нейронная.
134: То есть там всегда под капотом, грубо говоря, понимаете, что torch тензер это тоже самое, что нампай рей, то есть это некий нампай рай, который гоняется внутри по нейронной сетки. Только в данном случае это будет творческий нампай рей. Его особенность в том, что внутри него там ещё можно указать, где именно ему находиться на видеокарте.
135: Или на цпу, где, что ему нужно, нужно ли считать по ним градиенты. То есть там, короче, много разных параметров, которые дополнительные позволяют объекту торч тензер быть, ну, скажем так, более полноценным для сдачи компьютерного, ну типа искусственного интеллекта. Супер. Теперь смотрим. Вот.
136: Мы делаем как бы сначала ресайз, а потом превращаем его в тензер. Это мы делаем на трейне, то есть для трейновых, все, что для всех фотографий, которые на трейне, просто проведём эту операцию и также для валидации, значит, для валидации тоже самое, каждую фотку пригоним к этому размеру и
137: Сделаем из этого тензера, значит, дальше загружаем датасет, значит, вот создадим датасет. Давайте я сейчас сначала вот так вот это вот чуть чуть отнесу, вынесу в отдельную строку. Понятно, что вам код потом скину в нормальном виде, но мы же как бы обучающий видеоролик смотрим.
138: Поэтому я буду показывать все подробно. Значит, вот мы запускаем данную штуку, что мы делаем, мы создаём как раз-таки согласно, согласно конкретной папочке датасет трейна и согласно другой папочке, датасет валидации и указываем трансформации, которые необходим
139: Выполнить конкретно для трейна и для валидации возникает вопрос, а зачем нам вообще отделять трансформации для валидации, для трейна? А мы с этим познакомимся чуть попозже. Мы с вами сделаем различные аргументации, увидим, что аргументация это очень полезный, важный инструмент, увеличивающий качество работы.
140: Нейронной сети, то есть благодаря аугментации можно увеличить датасет, сделать его более разнообразным, да, на трейне. То есть трейновые датасет мы очень сильно разнообразим. И благодаря этому мы должны в идеале получить более хорошее качество, то есть как бы сетка не выучит наизусть фотографии, а поймёт,
141: Закономерность, потому что когда мы даём фотографии без каких-либо трансформаций, есть шанс того, что сетка просто выучит фотки, то, что она выучит фотки, это не означает, что она будет хорошо работать. А вот разнообразие добавить с помощью аргументации зачастую полезно. Об этом мы поговорим чуть попозже. Давайте пок.
142: Посмотрим вот на что значит что у нас такое трейн датасет давайте взглянем на train dataset собственно трейн датасет вот мы его загрузили и мы видим что это датасет в котором у нас 711 фотографий судя по всему.
143: Вот, собственно, откуда он взят? Он взят из папочки датасет трейн, да, вот он у нас датасет трейн, вот отсюда он взят, и, собственно, вот трансформация, а именно ресайз, да, при том, там интерполяция Белинина. Не будем, собственно.
144: Это влезть и собственно, ту тензер то есть делаем как бы потом на выходе тензер супер давайте глянем на какой-нибудь объект этого значит пишем трейн, это сет 0. И вот собственно мы вытащили какой-то объект под номером 0 давайте мы вытащим объект под номером 10 то есть помните, у нас тут
145: Куча фотографий. Вот каждая фотография, вот номер 100.
146: Смотрите.
147: Куча фотографий. Вот каждая фотография. Смотрите, вот номер 100.
148: Вот, собственно, видно, что да, у каждой, каждой фотографии какие-то значения тут находятся. Что это за значение? Смотрите, по сути, мы каждую фотографию сейчас с вами перевели из из классической размерности в размерность от нуля до единицы. То есть теперь все фотки лежат от нуля до 1. То есть, по сути, про
149: Поделили как бы наши числа на 256 и получили вот это вот представление от нуля до 1. И вот каждый пиксель, собственно, вот он закодирован. То есть вот мы, мы видим как раз-таки координаты пикселя. Смотрите, а помимо этого ещё у нас тут есть последнее число, это номер
150: То есть, получается, фотка номер 110, это класс номер 0. Возникает вопрос, что такое номер 0? Все довольно легко. Для этого нам необходимо вот эту функцию запустить. Смотрите, трейн датасет, точка классес. Давайте выпишем его и увидим, что
151: В данном случае у нас 0 класс, это адидас 2 это конверс 3 это night, ну типа 0 1, 2, 2 это night. Поэтому когда мы видим здесь 0, получается, что вот эта вот фотография, которую мы сейчас вот тут с вами видим, вот эта фотография, на самом деле, она классом 0.
152: То есть она является классом под названием адидас. Давайте какую-нибудь другую фотку выберем, давайте пусть будет 170. Запускаем и его, собственно, тоже видим, как какой-то тезер, какие-то вот у него числа лежат и значение тоже 0 давайте выберем там, не знаю, 400.
153: И вот у этого уже тензера, вот его какие-то там значения, у него номер 1 класса, поэтому можно взглянуть. Давайте посмотрим. Вот.
154: 0 элемент это будет сам тензер. Вот мы вытащили тензер и давайте взглянем его shape и сейчас мы увидим, что действительно шейп, то есть размерность у него какая? 3 канала rgb 200 двадцатьчетыре 224. То есть видите, мы каждую фотку привели к размерам вот таким вот
155: Вот такая общая идея. То есть мы сейчас с вами притащили все фотографии к 1 общему размеру. Трехканальные вот такие фоточки. Супер. Теперь что нам нужно с вами сделать? Давайте попробуем, скажем так.
156: Понять общую логику, что-то то же самое будет наблюдаться. Валидейшен, это сет выбираем и видно что у него там, там будет сейчас какой там не четырета, там слишком много там, помните, у нас на валидации у нас меньше. Видите, лист аут оф ренж, у нас там меньше данных, там на валидацию. Давайте пусть будет 40.
157: Ну вот 40 фотография, можно глянуть, у неё 40 фотография, помимо самого тензера, у неё что ещё есть? Давайте я вот уберу, у неё есть класс, ну вот класс 1, там, не знаю, например, какая-нибудь фотка. 60, скорее всего, у неё тоже вот класс 1. Ну, думаю.
158: С этим разобрались. То есть у нас валидационный дтс и трейны. Вот какая структура. 2 элемента. 1, сама фотография 2 номер класса, притом именно номер, да, то есть это не слово, а именно номер. То есть, потому что все объекты в математике, они будут числами работать, поэтому нам это важно.
159: Поймём общую суть обучения нейронной сети. Давайте для этого я скажем так, открою новую страницу и попробую показать. Смотрите, вот у нас есть датасет, это, по сути, куча, куча фотографий. Вот допустим, если есть много, много, много фотографий. И вот мы хотим обучить
160: Какую-то нейронную сеть, которую будет эти фотографии классифицировать. Например, эта фотография классом 1, это 0, это 1, это 2, это 1 0 2, 2. Ну не знаю, пусть будет так. Вот мы с вами сейчас сделали некое перемешивание, мы все фотки перемешали. То есть вот у нас есть тепер
161: Куча, куча куча данных в нашем датасете. То есть фотография, да, и к ней же ещё и класс. Теперь давайте попробуем как-то обучить сетку, но суть в том, что сетка на самом деле не сможет принять все фотографии на вход. Ну просто если вы даже
162: Делаете что-то на видеокате, представьте сбе, у вас есть видеокарта, вы на видео карте читаете у вас видеокарта, она не сможет внутри себя вместить очень много фотографий за раз. Представьте себе этот сайт, который размером там, миллиард фотографий. Вы же не сможете за раз миллиард фотографий нейронки показать. Вы можете показать ей фотку.
163: Например, 1 за другой, но это, честно говоря, неоптимально. Куда лучше показывать сразу несколько фотографий, потому что тогда сетка сможет как бы понять общую закономерность. То есть в идеале вы как бы показываете фотки какими-то пакетами, то есть вы как бы формируете некие пакеты и пакет.
164: Подаёте на вход нейронной сети, и тогда сетка как бы каждый раз как бы принимает на вход пакет и сразу выдаёт ответ по всему пакету. То есть что по всем фотографиям она думает, вот такая общая идея. То есть вы делаете некое рандомное перемешивание, да, всех фотографий.
165: А потом формируете пакеты, пакеты. Ну, сами, допустим, давайте сделаем пример. Пакет по 4 фотки, значит, вот мы взяли 4 фотки, потом ещё 4 фотки. Ну и последнее осталось всего 3, поэтому они поддадутся втроём. Вот вам пример. То есть, тем самым мы сформировали 3 пакета.
166: В сфере компьютерного зрения. Ну, вообще, в принципе, в сфере искусственного интеллекта, там торча неважно, это называется батчем. То есть 1 батч это как раз-таки у нас будет 4 фотки. Ну, в нашем случае мы сделали, да, то есть вот мы будем подавать как бы каждый раз
167: 4 фотографии нейронка приняла на вход, 4 фотки, их как бы скушала, пережевала, обработала и, согласно этим 4 фотографиям подкорректировала нейронные свои веса да, эти веса нейронной сети, потом опять получила 4 фотографии, опять их обработала, опять скорректировала веса нейрон.
168: Сети опять получила, опять скорректировала. То есть, понятно, да, у нас градиентные спуски, да, которые постоянно как-то улучшает, дорабатывает значение весов нейронной сети. Они будут каждый раз отрабатывать по батчам. То есть не каждая фотка за фоткой, а вот именно
169: И не сразу все фотки, потому что просто он не сможет столько переживать. Вот это вот общая логика, поэтому обычно формируют пакеты. Мы с вами как раз-таки этим будем заниматься. Значит, отсюда вы, наверное, заметили, я вот тоже акцентировал на этом внимание. Ну, наверное, очень сильно подробн.
170: Смотрите, когда мы гнали что-то через нейронную сетку, я, помните, задавал здесь параметр. 1 число, оно было 1. Возникает вопрос, зачем мне гнать и указывать здесь 1? А все потому, что на самом деле мне ничего не мешает указать, например, и смотрите, тогда у меня сетка
171: Здесь 3.
172: Смотрите, когда мы гнали что-то через нейронную сетку, я, помните, задавал здесь параметр. 1 число, оно было 1. Возникает вопрос, зачем мне гнать и указывать здесь 1? А все потому, что на самом деле мне ничего не мешает указать здесь 3, например. И смотрите, тогда у меня сетка
173: Нейроны наружу выплёвывать сразу для всех 3 фотографий. То есть мы как бы подали 3 фотки разом и получили сразу 3 ответа разом. То есть, по сути, у меня нейронная сетка может, ну, спокойно там переживать. Вот видите, много фотографий.
174: За раз вот это и есть понятие бач. То есть видите, 1 число это butch. То есть размер как бы пакета, вот такая общая логика поэтому, скажем так, если 1 фотку гоним, то указываем вот так вот, если гоним, больше фотографий указываем, скажем так, столько, сколько хо.
175: Прогнать теперь вопрос, а как нам сформировать пакеты? Для этого тоже для нас точ позаботился и сделал готовую функцию, генерирующую пакеты. Значит, для этого есть такое понятие, как дата лоудер. То есть дата лоудер это как раз-таки объект Собира.
176: Пакетами. Наши данные из датасета то есть есть объект вот он, train dataset в нём, как мы уже обсудили, лежит фотография запятая класс фотография запятая класс а теперь давайте сформируем как бы пакетами их вместе значит зачем?
177: Мы указываем параметр бач сайз, то есть количество фоток в 1 пакете. Ну опять-таки выбирайте сами. Это определяется 1 параметром, насколько у вас мощная видеокарта, чем она больше, тем больше можно фоток вместить. Ну и во вторых, определяется аспектом того, скажем так, сколько вы хотите сделать градиент.
178: Спуск. Нужно понимать логику, что чем больше у вас пакетов, да, чем больше раз количество пакетов, ну, данных в 1 пакете, тем дольше нейронная сетка будет обрабатывать 1 прогон через нейронную сеть. Вы, наверное, заметили? Да? Смотрите, вот давайте покажу ещё раз. Вот когда я гоню 1 штуку, видите, как быстро, моментально отрабатывает
179: Я поставлю здесь 100.
180: И смотрите, дольше обрабатывает, да, то есть, ну, как бы, вот тут компромисс, да, чем как бы, больше у вас будет данных, да, чем больше фоток вы за раз гоните через сетку, тем быстрее у вас будет обрабатывать запрос.
181: Вот, поэтому тут как бы тоже надо с этой точки зрения тоже думать. То есть время обучения будет тоже зависеть от размера батча. Ну, обычно старайтесь брать батчи кратные 4. Это такое некое негласное правило. То есть 4, 8, 16, 32, ой, 16, там, 64, ну и так далее, то ест.
182: Вот можете вот по таким вот по логикам идти. То есть все, что кратно 4. Вот я взял 64, например, как вариант, можно взять 128. Неважно.
183: И че я делаю я создаю трейн лоудер и валидейшн лоудер трейн лоудер, значит это будет загрузчик по батчам для трейна, а для валидации будет тоже свой загрузчик и внимание. Есть такой параметр, как шафл ну, shuffle, я думаю уже вы тоже поняли, потик нам показал, что мы тут взяли как бы рандом.
184: Перемешали все фотки, ну вот собственно можно их не перемешивать, но в этом резона нету. Я советую вам как бы на трене всегда делать некий некий некое перемешивание, да, чтобы у вас каждый раз пакеты были разные, то есть каждая эпоха будет заново перемешивать все, все, все фотки и опять
185: Собирать новые пакеты, опять перемешивать фотки и новые пакеты собирать. Теперь давайте по терминам пройдёмся. Вот такая важная фраза. Её часто путают. Вот количество градиентных спусков сильно зависит от размера батча. Вот когда говорят фразу, обучаю сетку, допустим, 2 эпохи.
186: Что значит фраза? Эпоха? Эпоха означает, что мы прогоняем весь датасет. Тот, когда я говорю, я прогнал 2 эпохи, то я, значит, показал нейронной сетки. Все, все, все фотки, которые у меня есть в датасете, если у меня фоток.
187: Миллиард, то, значит, я показал миллиард фотографий, но возникает вопрос, я же не мог их разом показать. Правильно? Не мог. Я их показывал пакетами, то есть батчами. Поэтому логично, что когда мы говорим, произведена 1 эпоха, это означает, что он
188: Прогнал все батчи, которые у него есть в нашем с вами абстрактном примере. У нас всего 3 батча. Поэтому когда у нас будет фраза, 1 эпоха, значит он сделал 3 градиентных спуска. То есть он 3 раза прогнал сквозь себя датки, то есть взял датку.
189: 4 фотки прогнал, обработал, сделал, изменил типа свои веса нейронной сети взял ещё 4 фотки прогнал, получил ответ, обновил веса, опять взял, обновил веса опа, эпоха окончена, то есть количество
190: Эпох зависит от размера батча. Если мы взяли бы бач размером 2, то мы бы как бы, ну, сделали бы больше градиентных спусков за 1 эпоху. То есть это было бы вместо текущих там, да, 3, это стало бы больше. Ну, думаю, вы разобрались в общей
191: Фотки.
192: Эпох зависит от размера батча. Если мы взяли бы бач размером 2 фотки, то мы бы как бы, ну сделали бы больше градиентных спусков за 1 эпоху. То есть это было бы вместо текущих там, да, 3, это стало бы больше. Ну, думаю, вы разобрались в общей
193: Поэтому тут тоже очень важно. Думайте всегда про это. Поэтому как бы количество эпох нужно определять. Вот именно по Такому принципу старайтесь делать градиентных спусков больше. То есть чем больше градиентных спусков, тем лучше. Поэтому если
194: Например, вы сделали бач очень большой, то нужно, наверное, и увеличить количество эпох. Если наоборот, бач очень маленький, то нужно количество эпох снизить. То есть определяйте вот по Такому принципу мы с вами тоже это обсудим, посмотрим на месте. Я вот пытаюсь вам как бы математику эту теорию внедрить в голову, что
195: Было понимание, а то многие думают, что количество эпох это количество спусков градиента. Это не так, значит, с этим, надеюсь, разобрались. Итак, идём дальше, давайте посмотрим, как можно нам посчитать количество обучающего набора данных. Значит, вот у меня есть
196: Готовая функция, готовая ячеечка. Запускаем и вот он нам скажет нам как раз-таки с помощью снс, да, то есть через сиборн отобразит нам сколько данных на трейне и на валидация по каждому классу. Ну у нас, видите, нам повезло, у нас абсолютно одинаковые пропорции на классах, но
197: Такое не всегда зачастую каких-то классов больше каких-то фоток, меньше на каких-то классах. Ну вот собственно это как раз-таки ячеечка поможет вам отобразить и понять вашу, скажем так, закономерность по пропорциям на трейне. Ну видно, что у нас на трейне примерно примерно
198: 250 фотографий на каждый класс приходится, а на валидацию у нас примерно по 30, по моему, 8 фотографий мы смотрели с вами, да, на каждый класс приходится. Ну вот такая вот общая логика. Ну это нормальная пропорция. То есть, видите, да, у нас как раз пропорция получается, там 250 к, там, 30 вось.
199: Ну вот тоже это вполне окей, поэтому всегда на трене должно быть намного больше фотографий. Что ж, с этим, надеюсь, мы разобрались. Ну, давайте ради интереса посмотрим, как выглядит батч. Помните, я говорил, что вот батч, это мы когда формируем пакетик и пакетик отправляем на нейронку, значит, вот так.
200: Нажимаем прокликать. Значит, значит, я сейчас формирую бач. Размер бача 64. Фотографии готово.
201: И давайте отобразим.
202: Вот мы берём и отображаем с вами какие-то фотографии, а именно какие-то вот рандомные фотографии, которые у нас есть в батче. Понятно, что в батче у нас там может больше фотографий, но вот мы взяли, отобразили какой-то набор фотографий.
203: Из этого. А вот тут можно увидеть, вот здесь как раз у нас 64 же, да, фотографии 64, поэтому можно это сколько? Это? 8 на 8, значит, в принципе, можно поставить вот так вот.
204: И вот мы увидим с вами 1 bach, то есть 1 бач это примерно вот столько 64 фотографии он за раз будет выплёвывать сквозь нейронную сетку если мы здесь поставим с вами по меньшее число, да, оставим десь не 64, а bach будет размером ридать 2, то есть он будет по 32.
205: Запустим. Тут, скорее всего, сейчас будет какая-либо ошибка. Ну вот ошибка, он говорит, я не понимаю, как может быть 32. Вот видите, он про, я прошу отображать 64 фотки, а у меня всего 32. Ну правильно, потому что, да, у него бач как раз-таки это количество фоток за раз.
206: Супер. Надеюсь, тоже с этим разобрались. То есть вот примерно как выглядит наш прогон через нейронную сеть. Вот так вот фоточки у нас спаковали ь и пролетели. Притом, видите, каждая фотография, обратите внимание, это прям важное замечание. Вот этот размер его 200. Сколько там
207: 244, 244. Или сколько там надо посмотреть. Сейчас, секундочку, че то уже 200 двацат. 4, 224, да, то есть вот это вот размер как раз-таки, поэтому, Асе, фотки прямоугольные, то есть, если у вас там квадраты, если у вас были б фотки прямоуголные, они бы у вас заресайзи и талибы как раз квадратными, то есть сетк.
208: Будет принимать на вход квадратные фотки супер и видно вот идея, да, я каждый раз запускаю рандомный бач. Вы это видите функции итерации. Я делаю итератор, да, и каждый раз итерируюсь, выхватываю новый бач, показываю новый батч. Ну вот примерно так это выглядит супер. Ну и давайте глянем
209: Сколько у нас вообще, в принципе, бачей? Вот мы узнали, что у нас на трейне 12 бачей, а на валидации 2 бача. То есть получается, вот помните, как, когда мы считали, сколько бачей, то есть сколько суммарно пакетиков у вас получилось собрать, то есть у нас получается, на трейне получилос.
210: 12 пакетов по 64 фотки, а на валидации 2 пакета по 20, по 64 фотографии. Вот такая общая логика. Поэтому давайте сразу интерпретируем человеческим языком. Значит, получается сколько у нас градиентных спусков за
211: 1 эпоху обучения нейронной сети 12, потому что раз у нас бачей 12, значит, он 12 пакетиков прогонит через нейронную сеть, назовёт это 1 1 эпохой. Поэтому вот какая логика. Поэтому давайте посчитаем.
212: Ну, сейчас чуть позже дойдём. Пример. Ну, понятно, это мы уже обсудили, как выглядит трей, да, то есть trace, он как раз выдаёт нам фотографию, выдаёт нам.
213: Типа значение класса у 1 фотки а вот уже когда мы итерируемся по лоудеру, то он нам выплёвывает на выходе смотрите, что более сложный элемент он нам выплёвывает 64 класса, потому что помните, он, он рандомно перемешал фотографии, вот он нам
214: Выплюнул рандомно 64 фотографии и для каждой фотографии свой класс. Поэтому видите, у него сразу же получается лейблы это куча, куча, куча объектов и фотографий у нас тоже сразу не 1, а много можно прям написать. Допустим попросим 0 объект, это будет
215: Фотографии, фотографии. Давайте посмотрим его shape и увидим, что у нас фотографий 64 штуки, да, то есть бач 64 и каждая фотка 3 канала 224 224. Давайте попросим теперь 1, 1. Это у нас уже этот, как его
216: Лейблы. И мы видим, что лейблов у нас 64 штуки получается у Ровно 64 штуки имеется. Вот можно взглянуть на них, увидеть вот как раз. То есть у нас 1 фотка, это класс 1, потом 2, потом 0 0. Ну опять-таки по именам уже обсудили то есть имена вот мы с вами
217: Нас лейблов.
218: Лейблы. И мы видим, что лейблов у нас 64 штуки. Получается у нас лейблов Ровно 64 штуки имеется. Вот можно взглянуть на них, увидеть вот как раз. То есть у нас 1 фотка, это класс 1, потом 2, потом 0 0. Ну опять-таки по именам уже обсудили то есть имена вот мы с вами
219: Раньше получили 1 адидас, конверс, найк. То есть вот это прям сохраним себе и запомним, что в данном случае получается у нас согласно вот этой вот логике,
220: Идёт конверс, найк, адидас, adidas, adidas, converse, adidas ну вот, собственно понятно это рандомное перемешивание и мы сформировали пакетики фух ну надеюсь мы все разобрали, разобрали да все, надеюсь понятно чуть по полочкам.
221: Разлеглось. То есть видно, да, у нас есть датасет, есть дата лоудер это 2 разных атрибута в процессе обучения будем юзать именно дата лоудеры, потому что мы все будем батчами просовывать. Теперь давайте посмотрим. Значит, вот вам пример, как выглядит какой-нибудь прогон через нейронную сеть, когда
222: Мы говорим, я прогнал датасет через нейронную сеть, то, что вот что я делаю. Вот пример вам валидации. То есть что такое валидация? Валидация, это такой этап прогона через нейронную сеть, в процессе которого мы, по сути, не обучаемся, а просто как бы прогоняем через сетку, говорим, вот все, посчитай, посчитай.
223: Ответы и все говорим, типа ничего не надо нам обучать. То есть просто прогонись для этого. Мы что делаем? Переводим модель в режим эвал эвал это эвалюэйшн. То есть режим, когда у тебя, когда модель как бы зафиксируется, больше у неё не будут производиться никакие операции, там связа,
224: Связанные с регуляризацией, просто все зафиксировались. Далее мы переводим модель на девайс. Что такое девайс? Помните, мы уже обсудили, что девайс мы чуть раньше установили это у нас либо видеокарта, либо цпу в зависимости у вас есть. Поэтому вот мы переводим модель, например, на видеокарту.
225: От того, что
226: Связанные с регуляризацией, просто все зафиксировались. Далее мы переводим модель на девайс. Что такое девайс? Помните, мы уже обсудили, что девайс мы чуть раньше установили это у нас либо видеокарта, либо цпу, в зависимости от того, что у вас есть. Поэтому вот мы переводим модель, например, на видеокарту.
227: Случае это видеокарта. И дальше, собственно, считаем сколько корректовка, сколько всего у нас фотографий. И вот он заходит в цикл, где он не считает градиенты и видите, заходит в кдм. То есть, да, счётчик и гоняется в цикле по всем, по всему.
228: Датасету, то есть он ходит батчами, вытянул бач фотографий, батч, лейблов. Дальше он перевёл бач фотографий, бач, лейблов на те же самые девайсы. То есть важно, если у нас нейронная сетка находится на видеокарте, то и фотки, и лейблы должны оказаться тоже на видеокарте, потому что
229: Иначе, как бы, ну, как проводить операции, когда 1 на цпу, другое на видеокарту должно быть все где-то в 1 месте, либо там, либо там. Поэтому, видите, я вот, собственно, этой командой перевожу объекты на нужное место, то есть на нужный девайс и дальше прогоняю, собственно, все изображения.
230: Через модель модель аутпут. Это будет ответ. Вот. И дальше я помню, какой ответ у нас будет. Ответ у нас будет иметь. Давайте я сделаю, собственно, принт.
231: Блин, давайте увидим, какой будет ответ. Аутпут. Значит, output точка. Попробовать догадаться, пока ещё не запустил.
232: Шейп, ну можете.
233: Блин, давайте увидим, какой будет ответ. Аутпут. Значит, output точка шейп. Ну, можете попробовать догадаться, пока ещё не запустил.
234: Опа. И мы видим ответ. 64. 3 53. Почему 64? Ну, понятно. Потому что 1 бач размером 4. Он схватил такой бач размером 64. И, собственно, 3. Почему? Потому что у нас 3 класса. Помните, на выходе нейронка.
235: Какой 60?
236: Опа. И мы видим ответ. Какой? 64, 3 53. Почему 64? Ну, понятно. Потому что 1 бач размером 64. Он схватил такой бач размером 64. И, собственно, 3. Почему? Потому что у нас 3 класса. Помните, на выходе нейронка?
237: Там всегда по 3 числа на каждую фотографию. Поэтому вот он выплюнул на 64 по 3 числа, a2 бач размером 50. Почему? Потому что у нас суммарно фотографий 64 + 50, поэтому 2 бач, он не до конца наполнился, поэтому у нас 2 бач, как бы он чуть меньше.
238: Он 50. Ну, это как бы окей, да, то есть понятно, что я вот с вами, помнишь, пример показывал здесь, я думаю, вы тоже обратили внимание, что вот, вот сейчас, видите, у нас вот тут 2 батча, полных по 4, а последний бач в нём всего лишь 3 фотографии. Ну, так получилось. То есть это
239: Это вполне окей. Вот у нас как раз пример. Тут у нас 64, а тут 50. Смогли напомнить и дальше какая логика? Значит, он делает операцию, Макс. И тем самым он находит, какие на самом деле классы в реальной, он предсказал, у нейронной сети. Давайте вот глянем на это.
240: Смотрите, напишем.
241: Print.
242: Predicted принт predicted и давайте сразу ещё заодно помимо print predicted напишем какие у нас реальные классы, реальные классы у нас лежат вот тут в папочке лейбл. То есть labels это реальные классы, предикт это то, что выдало нейронная сет.
243: Понятно, почему делал Макс, потому что когда мы получили 3 ответа на выходе, мы потом выбираем наибольший, мы же с вами обсуждали, что ответ нейронной сети считается тот класс, которого самый большой. То есть, если, например, у нас есть число, но там, не знаю, 100, 200 и 50000, то ответ, конечно, будет там, где 50 тыся.
244: Этот ответ будет 3. Ну, то есть 2, то есть, да, 0 1, 2. То есть тот самый айдишник, который самое большое значение имеет супер. Давайте напишем то тут лейбл и запускаем. И вот как это примерно выглядит. Смотрите, значит,
245: Это у нас то, как считает нейронная сетка, а это то, что на самом деле вот такие классы, на самом деле, вот что нейронная сеть Вика. Видите, сейчас пока что это просто какой-то рандомайзер, он тут считает, что 1 0, 1, 0 0 2 1 2. То есть ему вообще просто, скорее всего, рандом.
246: Почему? Ну, потому что мы, вспомните, пока с вами ещё нейрон сетку не обучали, мы пока просто её инициализировали весами, которые были хорошие для имиджнет. Это пока ничего не значит. Это по сути, это такой же рандомайзер. То есть он пока просто нам какие-то рандомные ответы выкинул, но это не то, что нам нужно, мы хотим в идеале, чтобы вот ответы, которые
247: Вот здесь вот, да, то, что мы получаем, вот тут соответствовали тому же, что выплёвывает вот здесь сетка. Вот смысл, да, то есть процесс обучения это попытка сделать так, чтобы верхний тензер и нижний тензер как бы сравнялись, да, то есть, чтобы они давали одинаковые ответы. Вот тогда у нас будет высокое качество оценки.
248: Вот смотрите, видите, мы считаем здесь параметр экрос. То есть кероси это количество правильных ответов делить на количество всего. И вот в данном случае мы получили точность 0. Ну, короче, почти 30%. Ну, логично, что, по сути, рандомайзер 30% у нас 3 класса, ну, будем честны, это даже хуже, чем
249: То есть это просто он случайно раздаёт классы, это вообще никакой обучаемости у него нету. Думаю, с этим мы разобрались. То есть общая идея, надеюсь, понятна. Поэтому давайте попробуем обучить алгоритм, чтоб он вместо выплёвывания рандома
250: А именно, да, там 30% этот конфиденс, да, то есть, типа, ну, акерусе свой поднял, там, ну, в идеале до 90 плюс супер. Давайте теперь обучать сетку, значит, как мы обучаем сетку, мы указываем функцию потерь, это у нас будет кроссэнтропия, то есть,
251: Да, для классификации ипользуется кус энтропия. Оптимизатор. Это как раз то, с помощью чего будем гредиенты спуски делать. У нас будет использоваться Адам. Это очень популярный оптимизатор, он очень качественный. Его обычно используют на практике. Лернинг рейт это как раз-таки параметр, с которым можно поиграться. Это параметр, который можно подобрать оптимально. Че?
252: Больше, лернинг рейд, тем быстрее у нас происходит обучение, но зачастую можно и быстрее переобучиться, поэтому тут тоже нужно поиграться. Но вот я поставил такой параметр, почему бы нет? Дальше количество эпох. Сколько у нас будет прогонов целикового тоста? Напомню, значит, 70 я указал
253: Количество эпох. Теперь смотрим, сколько у нас бачи размером. Значит, на трейновой лодере у нас 12 бачей. То есть получается 12 мы умножаем на 70, потому что 70 у меня эпох и получаем 12 * 70 калькулятор.
254: Посчитаю это 840, то есть 840 градиентных спусков мы суммарно сделаем. То есть весь наш процесс обучения это 840 градиентных спусков. Вот мы посчитали как бы уже всю эту идею. Ну и дальше мы переходим в цикл по всем.
255: Похом. Переводим модель в процесс обучения и, собственно, заходим в циклы по всем даталодера, вытягиваем модели изображения и лейблы, переводим их на нужный девайс, то есть на видеокарту, потом не забываем обнулить градиент.
256: И, собственно, прогнать через нейронную сетку прогнали, посчитали функцию потерь и сделали градиентный спуск.
257: То есть, да, посчитали градиенты и сделали градиентный спуск. То есть, видите, да, вот как раз-таки весь код обучения, по сути, вот само обучение. Вытащили фотографии, да, протащили через нейронную сеть, получили ответы, посчитали ошибку, да, то есть функцию потери как раз-таки в нашем случае критерием вот это, да, это вот он, кросс.
258: Los. И потом, согласно ему, сделали как бы бэкворд, да, то есть сделали обратное распространение ошибки, то есть градиентный шаг. Ну, дальше уже снизу это всякие, я считаю. Ну, короче, я просто запоминаю ответы. Считаю, сколько у меня экьюреси, сколько у меня та
259: Lose. То есть это просто чисто я считаю накопившийся лос, накопившийся точность. А потом, в конце, когда я все, все, все фотографии в рамках эпохи прогоню дальше я считаю, какая на самом деле у меня была трейн лосс трейн экьюреси.
260: Вот, и добавляю это в список, чтобы потом можно было графики построить в конце. То есть смотрите, видите какая общая идея. То есть вот мы зашли, и вот мы, собственно, по трейну обучились. Теперь давайте сразу же, как только мы по трейну обучились дальше нужно как бы теперь по валидации оцениться. Значит, вот мы 1 эпоху отучились. Теперь давайте оценимя
261: Как у нас теперь на валидации все это работает, я перевожу модель в режим эволюшен, да, то есть валидации. Как раз-таки далее отключаю градиенты и захожу в цикл, опять-таки по лоудеру, только теперь уже валидационный, вытягиваю фотографии лейблы, прогоняю через нейронную сетку.
262: Считаю, лос, ну и, собственно, также опять-таки сохраняю значение. Сколько у меня правильных ответов, сколько у меня всего ответов. И считаю, как бы los. И вот в конце, как только я прогнал все, все, все батчи валидационного датасета, я
263: Усредняю и получаю значение сколько у меня валидейшен экьюреси, сколько у меня валидейшен лос то есть да, сколько у меня cross entropy loss да значений сколько у меня экьюреси ну и вот собственно в конце, когда я отработал 1 эпоху по ну типа целиком эпоху.
264: Прогнал по Валида, по трейну, также прогнал целиком эпоху. По валидации я выписываю финальный ответ, что вот эпоха под номером там 1, например, имеет трейновой лос такой-то трейновые экеру такой-то валидационный лос такой-то и валидационный экеру такой-то. И дальше вот такая логика.
265: Я уже мате говорил, что мы хотим сохранить такую модель, которая будет иметь лучшие показатели на валидации, то есть не на трейне, а вот именно на валидации. Нам важно, чтобы валидация была самая классная, потому что на трейне можем переобучиться. Можем вообще выучить датасет, нам такой не нужен, нам важно.
266: Чтобы мы на валидации хорошо работали. Поэтому вот я написал такую логику, что сохраняем только ту модель, которая имеет лучшую валидационную точность. То есть если валидационная точность у нас поднялась, то тогда производим сохранение и на всякий пожарный сохраняем в принципе последнюю модель. То есть мы всегда будем
267: Иметь с вами самую актуальную нейронную сетку, да, ту, которая вот последнее обучение и ту, которая самая лучшая у нас будет всегда, вот сохраняться. Здесь 2 нейронки, 1 будет модул бест модал, точка pt аш и lost модул питиа. То есть это будет тем самым сохраниться.
268: 2 файлика в 1 файле, последняя нейронная сеть в другом файле. Это будет, скажем так, лучшая нейронная сеть. Ну, по меркам валидации. И как только все закончится, мы получим сообщение, что все как бы обучение завершено. Давайте тогда запустимся.
269: И посмотрим, как это выглядит. Значит, вот у нас пошло обучение, это видно. Почему 12? Потому что помните, у нас 12 бачей, да, 12, 12 как бы, пакетиков, значит, вот он гонит новые пакеты, обучает сетку. Опа, прогнал дальше, запустил 2 пакета.
270: На валидации и вывел ответ. Да, смотрите, давайте пока глянем на статистику. Значит, 1 эпоха че у нас по 1 эпохе мы видим, что его валидейшен Экер. Если нам важна валидационная точность, уже неплохая. В принципе, это уже 74%. Помните, мы когда просто инициализировал
271: Нейронную сеть вообще без обучения мы получали 30%, а уже сейчас 74, а это всего 1 эпоха. То есть всего было сделано под капотом. Так, то 12 градиентных спусков, и это уже хорошее качество. Дальше смотрим. Лекрус растёт 77.
272: Дальше. Ну, она почему-то упала. Бывает и такое, это нормально. Потом опа, растёт. 81, 81. То есть, видно, да, растёт 86. Оппа 90. Смотрите, мы достигли 90 процентную точность, это на валидации. Тем временем, смотрите, смотрим, что у нас по
273: Train растёт быстрее, трейн это как раз-таки то, на чем мы обучаем. Само собой, трейн он запоминает постепенно, поэтому видим, что он на 1 уже 70% имеет. А вот дальше 93. Видите, какой контраст у нас контраст растёт. То есть стало 93, уже точность на трейне 93.
274: 96, 98 99 видно, да, уже почти идеально выучил. Опа, смотрите, тут вообще у нас уже к эпохе под номером 8 он наизусть выучил трейн.
275: При этом валидация у нас ухудшилась. Смотрите, вот когда он тут чуть раньше на трейне давал 99%, он имел 90% валидейшн акиру, а когда он выучил наизусть, он стал давать 0 82. То есть, видите, да, взаимосвязь не прямая, не нужно думать, что
276: Когда ты имеешь на трейне классные резы, то ты ура, типа имеешь превосходное качество на валидации. Это не так. Вот. Поэтому это к вопросу о том, что нужно сделать разнообразие датасета. Чем разнообразнее датасет, тем больше шансов, что сетка
277: Выучив наизусть, это сет, как бы, ну, поймёт главное, а не, скажем так, просто заучит ответы. Знаете, как, когда готовиться к егэ, можно здесь 2 подхода, можно искать ответы в интернете, просто выучить наизусть ответы. А можно понять суть, да, типа, можно подготовиться к экзамену. Реально прям.
278: Готовиться, сесть там репетиторов, нанять, изучить предмет, сдать его хорошо, а можно просто как бы купить ответы и сами понимаете, как бы вот, собственно, купив ответы, ты умным не станешь. Вот примерно тут тоже самое, он идеально отвечает, но при этом он не является умным. Ну вот, собственно, обучение продолжается, но мы
279: Видим, что у нас почти всегда уже train Кирсе почти под сотку. Ну, как бы, можно сказать, что, честно говоря, уже все, ну, как бы, мы уже тут скорее какой-то уже рандом происходит. Поэтому, когда мы достигаем сотку под трей на трейнере, я бы сказал бы, что уже, в принципе, обучение прошло.
280: Неуспешно. Ну то есть все, уже пора заканчиваться, уже дальше обучаться смысла нет. То есть уже 27 эпоха, а толка как бы 0, потому что мы уже почти идеально отвечаем на трейне. Так что в этом плане, думаю, мы с этим, давайте я сейчас подожду ответ окончания.
281: Обучение. Просто посмотрим, обсудим, че у нас получилось по итогу, но я уже вас предупреждаю, что дело пахнет как бы не очень хорошим результатом, да, потому что train мы заучили, тогда возникает вопрос, а как же нам решить проблему трейн не выучить наизусть, а для этого нам поможет помощь?
282: То есть мы будем каждый раз на трейне подавать фотографии, не прям такие, как они вот лежат у нас в папочке, а будем чуть их менять, например, поворачивать, там, не знаю, удаляться, приближаться. То есть попробуем какую-то вариабельность сделать, какое-то разнообразие, накинуть для того, чтобы каждый раз
283: Pre новом цикле. У нас фотографии были не те же самые, чтобы он не мог их выучить, чтобы он все-таки пытался что-то запомнить, общую идею понять, потому что если мы будем все время фотки, допустим, вращать там, корректировать, то есть шанс того, что он сможет понять лучше закономерность.
284: Итак, обучение подошло к концу. Собственно, вот мы увидели 70 эпоху. Ну, видно, да, у нас в конце обучения 86 качество на валидации, трейн идеально заучен. Ну, как я уже говорил. То есть давайте посмотрим как раз графики и увидим, как у нас происходил процесс обучения. И вот мы видим, чт,
285: Так себе, на самом деле, да, то есть на старте, да, видим, да, вот у нас идёт снижение, снижение лосса, да, то есть los функция уменьшается на трейне, вот на валидации тоже уменьшается, а потом уже началось какое-то просто огромное, огромное колебание, притом уже никакого снижения
286: Явного не видно, оно уже как бы, по сути, практически идеально, да, типа у нуля. И тут уже какое-то уже дикое колебание, при том значение. Видите, экерс на трейне, оно уже к 10 эпохе, даже раньше, наверное, там, к вось.
287: Мой эпохи уже достигла единицы, поэтому дальше уже все это обучение так очень понятие немножко, честно говоря, относительное. Думаю, с этим мы разобрались. Теперь давайте тогда посмотрим. Вот есть готовые функции, тоже говорить не буду. В общем, 1 функция, она как раз так.
288: Нам считает classifications репорт, да, то есть считает как раз-таки ошибку. Ошибки всякие получает матрицу ошибок, classifications репорт, а другая функция отображает этот красивый график давайте запустим и, собственно, вызовем эти функции значит, какая идея.
289: Смотрите, у нас сейчас слева, да, вот тут в панели появилось двое весов. 1 бест модал, да, то есть это та, которая лучшая сетка, которая сохранилась. Давайте узнаем, когда она была. Лучше. Смотрите, давайте листаем и вот увидим, где у нас фраза последнее сохранение. Листаем, листаем, листаем. И вот фраза
290: Last best модул сейф сейчас, секундочку, наверное, там вообще ещё давно, а вот сейт бест модул то есть последнее сохранение произошло на 16 эпохе, то есть потом уже все эти остальные куча эпох были бесполезны, то есть 50 эпох потом было
291: В пустую. Вот это как раз-таки best модул а lost модул та, которая сохранена, самая последняя то есть вот 70 эпоха, это вот lost модул давайте попробуем запустить обе сетки посмотрим, какие качества, значит запускаем как раз-таки загружаем веса лучше сетки в нашу модель.
292: У них.
293: В пустую. Вот это как раз-таки best модул а lost модул та, которая сохранена, самая последняя то есть вот 70 эпоха это вот lost модул давайте попробуем запустить обе сетки, посмотрим, какие у них качества, значит запускаем как раз-таки загружаем веса лучше сетки в нашу модель.
294: И запускаем функцию, значит, переводим, да, модель на девайс, запускаем функцию. И вот и получили результаты. Значит, это у нас как раз-таки classifications репорт. Тут можем увидеть, какой у нас пресижн рекол для каждого из классов. Да, класс, 0, класс, 1 класс, 2. Вот.
295: Собственно f1 score для каждого класса можно разглядеть экси у нас как раз-таки 91% дальше вот как раз-таки взвешенная ну понятно у нас классы сбалансированы, поэтому всякие взвешенные значения будут такие же равнозначные взвешенный реколл вот он, да.
296: Как раз-таки, f1, 0 91. Вот экеру тоже 0 91. Теперь смотрим как раз-таки, да, тест экрус у нас вот точность 0 0 9 1 2 3. И вот наша матрица ошибок. Ну вот мы видим примерно матрицу ошибок.
297: Ну, в принципе, очень классное обучение, то есть true лейбл это настоящий лейбл, да, а это то, что нам предсказала. То есть, получается 30 у нас всего класса 0, то бишь вспомнить, че у нас там давайте ещё раз, я гляну, а то че то я уже, честно говоря, забыл, что у нас
298: Там по номерам, где там номера. Вот, значит, наши номера. 1, адидас, конверт, найк, значит, в таком случае.
299: Давайте я вставлю сюда, чтоб просто я видел перед глазами получается реальный лейбл 32 + 4 + 2. То есть, на самом деле здесь 38 фотографий, да? 38 фотографий, из них 32 угаданы, правильно? 4.
300: Перепутано. То есть сказано, что это для фотографии под названием адидас сказано, что это конверс для фотографии адидас сказано, что это night всего. Ну 2 примера таких, но это опять-таки, не забывайте, мы сейчас оцениваемся по валидационном дату. Будь у нас тестовый цат, было бы вообще прекрасно. То есть
301: Вам советую иметь отдельный ещё тестовый датасет и вот именно на нём уже строить все эти графики ошибок и так далее, потому что это более честно. Ведь мы помните, мы остановили обучение согласно вариационному датасету, а вот оценить в идеале должны на отдельном тестовом датасете. Вот тогда вообще было бы превосходно. Вот.
302: Ну что имеем, то имеем тут сейчас, в моём случае тест это выступает, валидационный идёт да, идём дальше допустим true лейбл класс 1. То есть конверсы, конверсы вообще превосходно смотрите идеально ни 1 ошибки, то есть конверсы он угадывает хорошо. Ну, это понятно, потому что конверсы, в принципе, внешне очень сильн.
303: Отличается, да, то есть в отличие от адидаса и найка, вот конверсы прям они такие особенные внешне это такая высокая обувь. Вот. Ну, если кто-то не видел, то вот конверсы это обычно такие вот
304: Особенно высокие ботинки, поэтому их обычно легко разузнать. Ну и вот, собственно, тут у нас тоже довольно неплохо. Найк, угадан 34 и только 4 ошибки перепутал найк с адидасом. Вот, собственно, как интерпретировать матрицу ошибок супер.
305: Теперь, значит, переходим к идее с аргументацией. Давайте сделаем аргументацию, значит, опять мы загружаем нейронную сеть. Опять-таки, да, вот мы загрузили с вами нейронную сеть, указали стартовые веса, такие как у резнета, да, то есть хорошие веса. Далее используем, уже поменяем только раздел трансформации. Значит, мы делаем трансформа.
306: 1 ресайзим, потом рандомно вращаем от нуля до 10 градусов, да, то есть можно, да, чуть чуть повернуть фотографию, там на 10, допустим, градусов. Далее центр кроп делаем, то есть вырезаем 224 224, потом ещё добавляем рандомный
307: Поворот. Знаете, вот есть такое отображение, знаете, вот как зеркалим фотографию, то есть мы рандомно зеркалим фотографию с вероятностью 50% и ещё делаем некую нормализацию. Это тоже некое правило. Есть нормализации стандартные. Вот это вот известная нормализация от иминета, то есть она тем самым ваш
308: Все фотографии как бы приводят не от нуля к единице, а от 0. У нас будет, короче, это будет колебания от - 1 до 1. По сути, это колебания типа со средним 0 и стд равное единице. Ну и собственно, подобные же аугументации делаем на
309: На валидации, но помним, на валидации нам не нужны никакие рандомные вращения. Никаких нам Поворотов тоже не надо. То есть вот все вот эти вот аргументации, которые увеличивают этосет, нам особо не нужны. Нам нужно в идеале просто привести таким же аргументациям идентичным, но без
310: Поэтому вот собственно вариационные трансформации в данном случае не равны трейновые трейновые добавляют вариабельность, а валидационные как бы её не добавляют давайте сделаем даже random rotation давайте наверное не знаю чуть больше что ли даже сделаем, ну пусть будет до 15 градусов будет.
311: Вращение почему бы нет? Собственно, запускаем и давайте как раз-таки отобразим, как у нас выглядит фотография. Ну вот как выглядит 1 bach. Смотрите, давайте поставим здесь далай
312: Равный фолс и взглянем, как в реальности выглядят данные. Смотрите, в реальности они выглядят вот так вот смотрите, вот так они выглядят, наверное, вас пугают и думают, что за ерунда. Почему так странно выглядит. А все понятно почему? Потому что мы помните, мы сделали нормализацию, то есть мы все фотографии
313: Формировали вот эта вот операция нормализов и меняет внешний вид. Фотографии для нас, для людей кажется, как будто это плохо, но для нейронной сети это лучше. То есть нейронная сеть, особенно если мы используем какую-нибудь готовую, предобученную там стартовые веса имаджнета, лучше делать нормализацию, потому что
314: Она тогда, ну, лучше быстрее будет сходиться. Вот это вот такое некое правило. Поэтому давайте вернём денормативизации, денормализуешь, чтоб мы могли хорошо рассмотреть человеческим видом.
315: Давайте глянем, как это выглядит. Значит, запускаем. И вот пример фотографии можно обратить внимание. Смотрите, видите, тут видно, некие чёрные такие места есть, иногда появляются. Что это значит? Это, видите, вращение. То есть мы фотки вращаем. Давайте я ради интереса поставлю здесь 50, 40 градусов вращ.
316: Это, конечно, слишком сильно, чтобы просто увидели. Смотрите, он каждый раз, прогоняя через это, не просто фотку вставляет, а он ещё её рандомно поворачивает. Видите, смотрите, у нас каждый раз происходит некий рандомный поворот. Вот вам пример фотографии. То есть видно, что у нас-ка
317: Каждый раз фотка случайным образом от нуля до 40 градусов может повернуться. Вот например эта фотография скорее всего даже вообще не вращалась. Вот эти фотки, да, они прям сильно повернулись. Вот эта фотка тоже особо не вращалась. То есть понятная идея это поэтому параметры здесь random. Видите?
318: Типа это random rotation давайте поставим здесь не знаю градусов пусть будет я не знаю там ну 12 думаю сойдёт запускаем.
319: Ну и вот, собственно, примеры таких фотографий даже можно на самом деле поменьше можно вообще поставить 10 просто хотя бы, чтобы минимальная вариабельность у нас какая-то была. Значит вот мы запускаем, у нас некое рандомное вращение тоже есть, можно отсматривать все наши аргументации, вот они добавлены супер. И теперь запускаем
320: Но.
321: Ну и вот, собственно, примеры таких фотографий даже можно на самом деле поменьше можно вообще поставить 10 просто хотя бы, чтобы минимальная вариабельность у нас какая-то была. Значит вот мы запускаем, у нас некое рандомное вращение тоже есть, можно отсматривать все наши аргументации, но вот они добавлены супер и теперь запускаем
322: Опять обучение тут все тоже самое, код абсолютно идентичный, просто мы поменяли просто лишь только 1 момент. Мы просто вот здесь просунули с вами в train dataset новые трансформации, больше ничего мы не поменяли и давайте заново скажем так, запустим процесс обучения, значит
323: Обучение началось. Вот у нас батчи 12 штук обрабатываем и видим, что на старте у нас трейн 0 60 0 6 7 51 валидейшн. Вот такой вот.
324: Видно, что уже, в принципе, неплохо. Да, у нас 89 валидация уже 80 стала, 83. При этом, смотрите, у нас 3 эпоха. 91% на трейне, 95% на трене. Ну, пока хотя бы не сотка, да, то есть хотя бы он пока не выучил.
325: Наизусть. Он все равно ещё в процессе его обучения, потому что мы добавили вариабельность. Помните, мы теперь вращаем фотки? Поэтому, скажем так, ему теперь выучить наизусть трейн стало сложнее реально, но сложнее. Вот. Поэтому в этом плане как раз особенность добавления аргументации.
326: Заставляет его не выучить наизусть, а значит, как бы лучше обучиться в идеале на трейне.
327: Итак, смотрите, уже неплохо на валидации мы достигли 89%, он пока колеблется, конечно же, да. То есть, само собой, тут колебания имеется. Это опять-таки, если хотите лучше обучить, я вас не заставляю делать, как я
328: Можете разные параметры поиграться, там количество эпох, лернинг, рейты, можете разные оптимизаторы поиспользовать. То есть это, пожалуйста, на ваше усмотрение. Можно количество, размер батча, поиграться, можно в аргументациях поиграться. То есть в этом плане, вот видите, допустим, такое даже тоже бывает, что опа.
329: Упала. То есть, вроде бы было 93, стало 94, но при этом валидация у нас вообще взяла и сильно упала. Это тоже даёт особенность того, что у меня, скажем так, дтс очень, очень, не очень аугментации, скорее всего, не так достаточно, чтобы хорошо обучиться. Вот
330: В любом случае, я вам советую без аргументации не работать, потому что аргументация всегда позволяет добавить некую вариабельность, да, в данные лучше, чтоб все сходилось.
331: Итак, последняя эпоха обучения идёт. Значит, можно обратить внимание, что самое главное у нас единица на трейне достигла только лишь на 69 эпохе. Смотрите, вот до этого я отлистаю. Смотрите, тут нигде нету единицы. Ну вот, да, 1 раз только было, это было на 50.
332: 3 эпохи, но до этого все значения они все ниже, чем единица. То есть 95, 93. То есть, в принципе, как раз-таки аргументации дали своё дело. У нас сет наизусть, ну, не выучен, опять-таки, тут нужно тоже варьироваться, играться. Я, мне некогда этим заниматься. Моя цель просто показать общую
333: Куда вас направить в сторону обучения? Вот смотрите, как, как у нас выглядит процесс обучения. Вот что самое главное. О, заметить. Смотрите, у нас постепенно трейн растёт, и также, хоть и дикие колебания происходят, это опять-таки из за своих аспектов. Лернинг рейта чего-то ещё мал.
334: Датасета, возможно, у нас все равно есть некий тренд, да, тренд на увеличение все равно присутствует. Также как и тут. Смотрите, у нас на трейне тренд все равно на снижение есть, он все равно постепенно снижается. Как и тут. Смотрите, трейн этот валидационный
335: Los он тоже имеет некий тренд на снижение. Что важно? То есть все-таки обучение реально работало. В отличие от того примера, давайте посмотрим тут пример. Вот тут смотрите, тут вообще никакого тренда особо нет. У нас просто происходят колебания вокруг какой-то константы, как и тут тоже никакого тренда.
336: Особо мы не увидим. Вот там мы качества достигли с вами случайным образом. Кстати, вот 1 раз вот тут случайно получили большее 90, но почти всегда у нас качество на самом деле было ниже, чем 90. И большой ещё вопрос. На самом деле можно считать данное качество, которое выше, чем 90 объективны.
337: У нас данных на валидации маловато, да, и просто в принципе нет тестового набора, поэтому оцениться сложновато. Вот. Но будем считать, что в большинстве случаев у нас обучение дошло до 90 и не выше. В случае же вот этого примера давайте посмотрим, который сейчас мы обучили. Тут же у нас, смотрите.
338: Выше 90 экьюреси почти всегда было. Вот смотрите, оно почти всегда на валидации стало выше, чем 90, притом ближе там, да, почти 95 доходило. Вот, да, последний момент вообще превосходно сработало. Видно, что у нас лучше.
339: Модель, вот она на последнем эпохе сохранилась на 70. У нас значение 93, почти 94, да, то есть 94%. Вероятность того, что у нас правильно угадывает сетка, это, ну, довольно неплохо, учитывая, что до этого было 91 и вообще, в принцип,
340: Было много вопросов к качеству этой сети значит давайте подгрузим эту модель и отобразим результаты значит вот мы тут видим матрицу ошибок 94. У нас f1 score ну метрика 94 да, экюри, вот собственно все параметры можно
341: Тут их все посмотреть. Тест текер. Ну, понятно. 93, почти 94. И вот так выглядит матрица ошибок. Взгляните, оно, оно реально хорошее, прям реально достаточно хорошее, в разы лучше, чем предыдущая. В данном случае, конечно, у нас, например, в случае с конверсами 1 ошибка.
342: Имеется тут немного в пропорции, да, но видно, что теперь, например, для класса 0 ошибок стало меньше. Смотрите, тут всего 2 1, а до этого давайте посмотрим предыдущее наше обучение. Там у нас ошибок было прям больше 4, 2. То есть видно, да?
343: Ниже качество было для определения класса 0, то есть класса адидас. Думаю, с этим мы разобрались. Давайте теперь последнее, что мы рассмотрим. Давайте возьмём теперь вообще сетку резнёт. Давайте снизим количество обучения. Не хочу так долго ждать. Поставлю здесь не 70.
344: Эпох, а хотя бы там не знаю, 40 просто общий тренд посмотрим, что ну вообще обучается, не обучается, и поставим теперь здесь веса с вами не претрейнд равный true a поставим претрейнд равный фолс, то есть теперь мы запустим рандомными весами, рандомными случайными числами и.
345: Ещё раз запустим обучение, глянем, че получается. Хотя, ладнодавайте, что было честно, the таки поставим 70 with seo. График такой же объективный. Значит, все запустил, также создал датасет, даталодер. Вот давайте отобразим, посмотрим. Да, все нормально. 60.
346: Я это создал.
347: Ещё раз запустим обучение, глянем, че получается. Хотя, ладнодавайте, что было честно, the таки поставим 70 with seo. График такой же объективный. Значит, все, я это запустил, также создал датасет. Даталодер создал. Вот давайте отобразим, посмотрим. Да, все нормально. 60.
348: Фотографии отображается. Запускаем обучение. Давайте подождём. Значит, теперь у нас будет обучение стартоваться вообще с рандомных весов. Поэтому, ну, это такое моё предположение я не проверял. Должно в идеале быть ещё, ну, более долгим обучение более неэффективным. Смотрите, помните, у нас
349: Тогда уже раньше, уже на 1 эпохе, мы валидейшн получали, там чуть ли не 0 7. Смотрите, сейчас мы получаем всего 36 42. Видите, у нас уже 3 эпоха закончилась, а всего лишь на 50% точность на
350: Трейне 61%. То есть видно, да, у нас медленнее происходит обучение. Как раз-таки вот в этом вот удобность, да, когда вы выгружаете готовые веса, у вас шансов на сходимость, во первых, больше и быстрее обучение происходит. Вы стартуете уже с более менее неплохих весов, которые надо чуть чуть подкорректировать, а не
351: Прям полностью. Вот, собственно, давайте подождём конца обучения и тоже взглянем. То есть, чтобы было понятно, эта операция называется файнтюнинг. То есть, да, как бы мы стартуем от хороших весов и дообучим
352: Итак, обучение завершено, все 70 эпох. Давайте построим график, и вот так выглядит наш график, можно сказать. Ну, прям превосходно же, да. Смотрите, прям видно, что вот улучшается, да, вот у нас тоже улучшается, прям как должно быть, да, вот те самые идеальные графики, давайте будем честны, качество.
353: Которая достигла сетка без использования файнтюнинг подхода. Это порядка 70%. То есть он даже не дошёл до 90. У нас только по трейну он смог дойти до 90, а тут он уже все, он уже как бы очень, во первых, большой лаг получается, да, то есть очен.
354: Большое расстояние по качеству видно, что смотрите, вот тут, допустим, идёт у нас обучение, все снижается, снижается лос. А вот тут, смотрите, как будто оно такое вот волной идёт. Раз в том, как будто чуть поднимается. То есть вывод у нас идёт уже чуть ли не переобучение. Вот, то есть настолько хуже, когда у нас рандомная инициализация
355: Поэтому я вот настоятельно советую всегда начинать обучение с предобученных весов, тогда у вас больше шансов на хорошую сходимость, то есть в нашем случае давайте взглянем, какое лучшее качество мы получили. Вот это вот как раньше выглядело confusion matrix, да, было 0 93, а теперь при том же самом подходе.
356: К аргументации, всем остальным по всему тому же, но вот такое качество у нас теперь 74%. Точность, то есть значительно хуже стала ситуация. Особенно это заметно на последнем классе. То есть конверсы ещё нормально отработали, да, вот адидас.
357: Nike они уже так себе отработали ну понятно что это 2 класса реально очень похожих, очень смежных друг с другом что ж, ну думаю с этим мы познакомились, давайте теперь посмотрим такую ситуацию вот вы сетку обучили, а че дальше с ней делать, вот у нас есть.
358: Сетка, все классно. Веса получили класс. Превосходно. Как её использовать на практике. Давайте с вами напишем код, который будет реализовывать использование нашей сетки на практике. То есть такое операция называется инференс. То есть, да, как бы прогон через нейронную сеть с некой такой
359: Обработкой заранее, которая нужно. То есть, что нужно сделать с фоткой, чтобы прогнать чере сетку. Сначала берём фотку, делаем правильные преобразования с ней, то есть приводим её к размеру 224, также нормализуем, как мы нормализовали её на обучении. Помните? Да, мы на обучении, на обучении нормализовали, значит, нужно и на
360: Валидация на использование сетки тоже её нормализовать. Дальше че ещё надо сделать? Нужно, скажем так, прогнать через сетку, найти самый вероятный класс, да, то есть самый вероятный ответ, который самое большое число имеет в идеале ещё сделать софтмакс, операцию, чтоб
361: Получить probability, то есть, да, вероятность то есть из чисел превратить это в вероятности и отобразить наруже что за фотография? Какой у неё класс какая у неё вероятность? Давайте это как раз-таки с вами сделаем. Для этого переходим в раздел инференс модели и сейчас как раз
362: Таки обсудим, как и что тут делается.
363: Итак, я, перед тем, как работать с этим файлом, обновил веса. Сейчас у меня лежат вот best model питиа. Это вот, собственно, веса, которые имеют очень хорошее качество. Вот их, его качество 94 значения экера 7%. Что ж, давайте тогда.
364: Посмотрим, как с этим работать. Значит, вот у вас есть продакшн задание нужно принять фотографию, её обработать. Давайте сделаем отдельную папочку. Вот есть папочка тест, и в ней просто нашёл 3 фотографии в интернете. Просто случайные фотки, их не было ни на трейне, ни на валидации. Просто случайные фотографии.
365: Вот такая фотография конверса. И специально я вот взял фото, которое вообще ни то, ни другое, вообще какая-то другая вот фирма, не имеющая отношения и ко всем классам, которые у нас есть в сети. Итак, давайте посмотрим, как у вас будет работать алгоритм. Значит, вот мы берём, загружаем модель, то есть берём
366: Грузили архитектуру, не забыли у этой архитектуры поменять, собственно, количество слоёв. То есть вот указываем 3 на выходе. То есть вот 1 очередь мы загружаем архитектуру, её полностью конфигурируем, все, архитектура у нас сформирована, притом можно в принципе даже не загружать веса имаджнета. Зачем нам это нужн?
367: Мы все равно потом веса поменяем, поставим те, которые наши, которые мы обучили, собственно, вот и берём, и вгружаем, собственно, в эту же архитектуру наши веса. Если мы не укажем неправильно, давайте вот те пример поставлю здесь 11, сейчас будет конфликт. Почему конфликт? Потому что он говорит, ой, я не понимаю, о че.
368: Вгрузить. Архитектура не соответствует весам, поэтому нужно, чтобы веса и архитектура соответствовали. И вот теперь у меня все, все вгрузилось. Я выбираю девайс, то есть устройство, само собой, на видеокарте будет быстрее, чем на цпу обработка. Дальше модул ту девайс, то есть перевожу
369: Модель в этот на устройство и перевожу модель в evolution, то есть уже не в обучение, а в использование дальше делаю трансформации беру Ровно такие же как у меня были на валидационном датасете, то есть это ресайзы да, централ кроп ту тензер и не забываю.
370: Ировку Ровно такую же, как она была у меня на процессе, процессе обучения, чтобы все было идентично супер. Вот, собственно, загрузили. Это есть. Теперь давайте посмотрим, как работают фотографии. Значит, я беру фотографию некую вот как раз-таки из папочки.
371: Test фото номер 1 я его взял я его взял и загрузил через вот как раз-таки имидж опен открыл изображение дальше прогоняю через препросесинг давайте вот я покажу вам как это работает значит давайте сделаем здесь print и
372: Сделаем, отобразим собственно имидж, значит, отображаем, запускаем. Ну и вот мы видим, значит, вот наша фотография, она как раз-таки нормировалась. Видим, да, у нас есть числа со знаком минус почём потому что мы как раз-таки сделали нормировку, у нас среднее вокруг нуля и значение колеблется в плюс
373: Тензер.
374: Сделаем, отобразим собственно имидж тензер, значит отображаем, запускаем. Ну и вот мы видим, значит, вот наша фотография, она как раз-таки нормировалась. Видим, да, у нас есть числа со знаком минус почём потому что мы как раз-таки сделали нормировку, у нас среднее вокруг нуля и значение колеблется в плюс
375: Минус относительно нуля. Ну вот, собственно, какие значения у нас получились, это мы сделали далее не забываем сделать ански. Что такое ански ан сквиз это операция, которая как раз-таки добавляет бачевой размер. Нам нужно, чтобы у нас. Давайте я сейчас покажу, чтобы было понятно, поставлю здесь скобку с шеей.
376: Shape и вот мы видим, что shape у нас 3 24 на 20 year 224 24 а нам нужно, помните, чтобы перед сеткой, когда мы гоним через сетку, нужно, чтобы размер был 1, запятая 3 204 24 поэтому вот этот вот 1, да, размер батча как раз так.
377: Добавляется параметр ан сквиз 0. То есть добавляем как бы нулевую размерность. Дальше to device не забываем перевести обязательно на устройство. То есть в нашем случае это видеокарта. То есть видите, у нас модель лежит на девайсе и должна и фотка лежать тоже на девайсе. Далее отключа
378: Градиенты. И вот наш инференс, то есть инференс прогон через нейронную сеть, он вот здесь модал и передаём как раз-таки уже тензер, который имеет размерность бачеву, как должно быть. Супер вот наш аутпут. Давайте его отобразим. Принт аутпут
379: И взглянем, значит должна быть размерность 3. Запускаем. И вот наше значение, смотрите, 1 число какое-то вообще отрицательное, потом дальше какое-то число тоже отрицательное, но чуть менее. Да и дальше вообще число большое, положительное. Явно, что ответ будет скорее всего.
380: Вот именно он, то есть максимальное значение у нас это 3 число. Вспоминаем, у нас есть вот это вот класс неймс. 1 у нас идёт адидас конверс, последнее найк. Поэтому логично, что сетка считает, что это night осталось последнее, что сделать. Давайте теперь переведём это все в
381: Вероятности, то есть используем функцию как раз-таки вот софт Макс и передаём её вероятности. Ну и переводим на цпу, чтобы было все на цпу. Ответы. Давайте сделаем принт probabilities. Пробили, и мы как раз должны в идеале увидеть ответ.
382: Уже вероятностях. Вот смотрите, то есть вот наша фотография уберу принт имидж шей, то нам не нужно, значит запускаем и вот это выглядит. Смотрите значит, вот тут у нас числа, которые выдала сетка, а вот операция софтмакс, она перевела нам where
383: Ятности, видим, что мы получили вероятность равную 98 процентам. То есть это как раз-таки операция, которая делает так, что сумма всех чисел должна равняться единице. И вот как раз-таки переводит вероятность. Получается вот наш ответ мы получили действительно, что у нас больше всего загорелся
384: Нейрон номер 3, который, ну то есть номер 2, да, 0 1 2. Если считать, который является найком, значит вот наш класс найк. И вот, собственно, его убеждённость в сети в том, что это night очень неплохо действительно, фотографии, ботинки найк, вот как примерно это все работает. То есть далее как
385: Как раз-таки мы вытянули значение top ка номер 1 да, то есть получили как раз-таки тот, у который самое высокое значение имеет из вероятностей, и далее отобразили изображение, указав в title название класса, который выбран да, то есть выйдите из класса.
386: Мы выбрали номер загоревшегося нейрона, вот, и собственно указали probability, то есть вероятность принадлежности конкретно к этому классу, ну и само собой умножили на 100, чтоб число было не в долях, а в процентах. Ну думаю с этим разобрались то есть вот
387: Как это все работает. Давайте теперь интересно. Другую фотку поставим, ставим теперь изображение номер 2 и запускаем. И вот и выглядит его результат. То есть у него вообще вероятность 100% практически, да, то есть вот можно увидеть, что там
388: Не 100, но там почти 100. То есть видно вот это почти там, типа, чуть ли не 110, минус 7, 10 минус 6. То есть видно там очень низкая вероятность на другие классы. Давайте ради интереса какую-нибудь из валидации возьмём. Давайте вот от фирмы adidas, мы ещё не тестировали какую-нибудь фотку да, она конечно была на валидации наверно.
389: Конечно, не совсем честно, но все же, давайте просто на ней проверимся, просто чтобы было понятно, что в принципе,
390: Вот, видно, да, адидас, вероятность 98 и 9%. То есть вот как он, собственно, получил ответы на выходе сетки, вот как они превратились в софтмакс, да, типа вероятности. И вот мы это все отобразили. Давайте ради интереса теперь покажем, как это выглядит. Вот.
391: Есть возможность отобразить вот так вот вероятность. И вот, собственно, эта как раз функция отображает нам пропаб иис вот такой вот шкале, то есть насколько он уверен в классах. Ну понятно, он считает, что это чуть чуть, ну, где-то примерно там на 1 процентик, на 2 похоже на конверсы. Ну, в принципе, да, потому что
392: Такие высокие. Поэтому, в принципе, может быть даже окей, давайте какую-нибудь другую фотку возьмём ради интереса. Давайте вот такую вот фотографию поставим, запустим тоже считает, что это адидас, притом 100% считает, что это адидас. Ну давайте какую-нибудь другую, че то прям.
393: Как-то слишком хорошо, давайте 3. Ну вот тоже. Он считает, что её 61%. Вот интересно, кстати, а теперь у нас уже не 100%. Мы наконец добились того случая, когда у нас протокол не до конца уверен. Ну, наверное, потому что полоски не особо явные, да, не особо такие прям белые, как он привык, видет.
394: Что ещё он думает, смотрите 2 вариант nike, да, то есть вот у него вероятность высокая, на класс, как раз-таки адидас на night у него, ну вероятность около 40%, ну кондес вообще он даже отбросил ну в принципе согласен, тут можно перепутать с найком чем-то, возможно даже реально похож.
395: Супер. Думаю, с идеей разобрались. Давайте теперь ради интереса. Я вам сейчас пециально покажу, сделаем фотографию номер 3. Это фотка, которая вообще не является никаким из классов. Это надо, чтобы вы понимали идею, что когда мы классифицируем, мы всегда выбираем из вариантов у нас
396: Какой-то из нейронов всегда загорится и это не означает никогда, что, ну то есть если, например, у нас вы берете на фотку человека, например, на вход, а у вас на самом деле классификатор на то, какая обувь то у вас сетка просто наврёт, она выдаст вообще просто вранье.
397: Какой-то, да наверное по какой-то логике она там будет думать что-то, но она все равно должна выбрать класс она не может вам сказать ответ. Я не знаю что это нет такой возможности классификатора. Всегда горит какой-то из классов, да, загорается ну то есть имеется ввиду, типа иннервируется значит давайте выберем собственно фотка номер.
398: Запускаем. И вот смотрим, какое, что нам выдала сетка. Вот, собственно, что он выдал на выходе. Ну и мы это интерпретируем как люди, что о, загорелся нейрон номер 2. Ну, собственно, 98% получили. Ура, конверсы, 98%. Ну, на самом деле реально похоже, да, то есть, логи,
399: Почему сетка так решила потому что высокие ботинки ну это не конверсы, но он это не знает, поэтому действительно выдал очень высокую вероятность. И вот можно увидеть, что вот около считает 98% чуть чуть думает что night, ну прям вообще чуть чуть практически полностью веришь, что это korn?
400: Поэтому будьте внимательны, что классификатор, если, если он принимает на вход фото, которую, которая не является классом, он вам не скажет ничего вот по этому поводу как-то так, поэтому этот вопрос довольно важный. Хорошо, с этим разобрались. Ну давайте.
401: Теперь для аудитории, которые дослушали до конца, которые большие молодцы, все узнали про то, как работать с сетками, как их обучать, как их валидировать. Я вам расскажу о том, как свою собственную архитектуру подсунуть и её обучить. То есть вот свою архитектуру, не какую-то готовую, типа резнета. Понятно, что эт
402: Нужно больше для людей которые там, не знаю ресерчем занимаются которые в универе учатся им нужно, скажем так, уметь писать собственные сетки с помощью пайторча вот, а не брать готовые поэтому давайте покажу вам как это делается значит не забудьте поставить пожалуйста лайк комментарий какой-нибудь оставить на канал подписаться, потому что это vs.
403: Позволяет мне, меня мотивирует делать вам новый контент, снимать, готовиться, потому что, сами понимаете, подготовиться к этому видеоролику, да, 2 часа, что-то говорить. А в итоге не набрать просмотров, конечно, довольно обидно. К тому же я, как бы никого не имею, ни бусти, ни патрион.
404: Я никого, денег, ничего не прошу. Делаю чисто ради собственной. Просто так, по доброте душевной, рассказываю вам контент. Давайте посмотрим, как писать свою собственную сетку. Значит, вот вам пример собственной сети. Мы задаём класс сети, наследуем его от энн модил.
405: Интересный. Итак.
406: Я никого, денег, ничего не прошу. Делаю чисто ради собственной, просто так, по доброте душевной, рассказываю вам контент интересный. Итак, давайте посмотрим, как писать свою собственную сетку. Значит, вот вам пример собственной сети. Мы задаём класс сети, наследуем его от энн модил.
407: И далее, собственно, создаём сетку. Давайте назовём сетку симпл цнн. Почему бы нет? Просто название это любое название придумывать и далее архитектура, значит, архитектура. Помните, рассказывал обычно свёрточный слой, активация, пулинг, свёрточный слой, активация.
408: А потом обычно идут полносвязные слои. Ну вот я сделал, смотрите, значит, 1 идёт у нас свёрточный слой, потом входных каналов 3, потому что у нас rgb, да, то есть трехканальное изображение. Потом дальше я сделал из них шестнадцатиканального, потом дальше я, типа, инициализировал
409: Pulling слой, да, то есть это который уменьшающий слой дальше инициализировал конволюшен. Ещё 1 слой, да, только теперь уже смотрите, он принимает на вход 16 каналов, а выплёвывает 32 и последний, собственно, дальше что я делаю после того?
410: Он прошёл 2 сверочных слоя. Далее мы как бы превращаем в вектор. Помните, такая тема, что мы векторизуем, получаем фичи вытянули фичи. У нас сочей получается 32 на 56, на 56 и собственно делам 1 полносвязный слой, который на выходе 256 нейронов и последние дв.
411: 56 и на выходе 3 у нас, помните, на выходе всегда должно быть 3 нейрона, поэтому вот мы инициализировали такую архитектуру, значит, это просто чисто создание каких-то объектов при инициализации, а вот сама архитектура строится в функции forward вот тут мы уже прописываем.
412: Значит, смотрите, вот у нас на функцию приходит какой-то вектор, точнее не вектор, а тензор помните, да, у него бач сайт запятая, каналы, запятая ширина, там высота вот пришёл он x, мы его прогоняем через conf 1 ну, кон v odin видно это вот наш конволюшен слой.
413: Вот это вот, потом через релу, то есть мы активацию делаем, а потом пулинг. Далее опять-таки проводим его через конволюцию, полученный ответ, потом через релу, потом опять через пуллинг, далее делаем прямыми руками преобразование в
414: Тензер, то есть, да, вытягиваем все, все, все пиксели в длинный длинный вектор, притом вектор будет огромный, размер у него будет 32 на 56, на 56 и далее, собственно, мы его прогоняем через полносвязную сетку дальше
415: Через активацию, релу и далее опять через полносвязную сетку и на выходе получаем x. Ну давайте, собственно, создадим эту архитектуру, значит да, вот пишем модул симпл, нет и ном классо пропихиваем 3, то есть это как раз количество классов, то есть столько, сколько мы подсунем вот сюда, в последний линеал сло.
416: И вот наша архитектура, она очень простая. Вот, собственно, у нас имеется конволюшен слой, пулинг, слой конволюшен пулинг. Ну, понятно, активация там производится вот тут посерединке, после каждого, после каждого прогона, да, через конволюшен, либо через
417: В пуле коннект, у нас есть активация. Ну, кроме последнего слоя под последнем слове, который мы выпихиваем, тут мы никакие активации уже не ставим, это уже просто выход, это уже без, без всяких функций активации. Вот мы получили, тут можно сразу увидеть количество у нас фичей видно, да, у нас на вход при, то есть мы вытащили вектор, который размером 100 тыся.
418: Ну, само собой, это очень оптимально. Максимально неоптимальная архитектура. Ну что есть? То есть это выдуманная архитектура, само собой. Пожалуйста, я даже не буду это вам предоставлять в коде сами свою архитектуру сделайте, посмотрите, поизучайте. Если че, gpt в помощь, он довольно неплохо иногда генерит какие-то архитектур.
419: На ваш запрос, то есть можно как бы, как стартовая дать какой-нибудь от gpt, да, какую-то вот модельку, да, класс модели, а потом сами её подписите под свою задачу, сами придумаете, что вам нужно, сколько слоёв, сколько каналов. То есть, видите, тут столько параметров, что росто, ужас, можно вообще
420: Параметров каждого слоя максимально с ними играться. Количество слоёв, количество поликоне то всяких там нейронов, чего угодно все что угодно меняете. Благодаря этому у вас есть вариации архитектуры но я вам говорю типа советую брать если вы делаете реальный production, кейс
421: Готовые архитектуры, потому что они, скажем так, проверены на практике, в большом количестве компаний, организаций вообще, в принципе, есть, да, целый чемпионат соревнования между лучшими архитектурами как раз-таки имиджнет. Вот. Поэтому лучше брать то, что прям популярно супер
422: Этим разобрались. Вот мы сделали модель. Давайте теперь ради нтереса проверим, что все работает правильно. Мы давайте через нашу модель так же, как мы и тогда делали, прогоним собственно рандомный тензер, значит пишем торч, торч, радн и здесь передаём
423: Butch 1. Далее сколько у нас будет? 3 канала? 224, 224. Проверяем, что у нас все отработает без ошибок. Ну да, супер. На выходе мы получили каких-то 3 числа. То есть как и должно было быть, потому что мы запросили трехклассную классификацию.
424: Ну и давайте тогда теперь запустим обучение, значит я прилетаю наверх, модель мы как бы уже инициализировали, да, теперь все, что нужно просто запустить эту вот этот код, да, потому что он как раз-таки у нас уже, если че, мы чуть ранее с вами вот тут даже можно заново
425: Ещё раз нажать. Вот мы заново с вами инициализировали датасет, дата лоудер. Можно даже отобразить, что да, все правильно. Датасет у нас работает, да, 64 бач. И дальше запускаем обучение, но теперь уже у нас как бы модель будет.
426: Та, которую мы чуть раньше с вами запустили, она будет вот этой архитектуры нашей уникальной видно, да, обучение стало быстрее. Кстати, прям как будто реально быстрее. Почему? Потому что архитектура проще стала, да, поэтому обучается в разы быстрее такая сетка. Ну и качество, конечно, ожидать хорошего тут довольно глупо. Давайте поставим
427: Все-таки реально прям 70, да, количество эпох обучения. Давайте сейчас я поставлю на стоп, запустим все-таки на 70 обучение. Давайте, значит, опять, чтобы сбросить целиком все веса, да, чтобы до рандома сбросить, нужно опять заново инициализировать модель, когда мы
428: Модель, то мы заново загружаем рандомные веса. Вот теперь, собственно можно запускать обучение, значит, где там сейчас, секундочку. Вот оно, да, обучение, раз нажали play. И, собственно, вот у нас началось обучение с нуля. Сейчас давайте проверим, что прям с нуля, с null.
429: Значит, пока у нас трейн, да, 41, да, валидейшн тоже 41. Опа. Смотрите, пока 40, 39, пока как будто не лучше стало. 45, да, уже вот улучшение пошло, да, то есть трейн все-таки улучшается. Валидейшн вообще 50. Да, пока что даже лучш.
430: Чем, трейн? Такое тоже бывает, но обычно рано или поздно трейн все равно обгоняет, чем валидейшен, потому что все-таки валидейшен это скорее оценка качества. А train это то, почему мы конкретно улучшаем? То есть мы должны улучшать в рамках train. Мы же train показываем данные и на нём градиентные спуски делаем поэтому трейн
431: Все равно рано или поздно обгонит валидейшн. Ну вот он уже обогнал, да, 62 54. Давайте подождём, узнаем, че в итоге у нас получится, насколько будет хорошее качество.
432: Итак, обучение подошло к концу. Собственно, давайте запустим построение графиков и увидим результат. Ну, сразу понятно, что у нас прям все печальненько. Почему печальненько? Потому что, во первых, у нас качество зафиксировалось.
433: Примерно на там, 50, 60 процентах. То есть это хуже. Да, помните, мы с вами уже попробовали разное использовали, резнёт. Использовали разные виды аугментаций с предобученным потом отключили предобученный, да, вариант резнета для
434: А обучение тоже получали там порядка 70%. Сейчас вообще мы получили 60%. И самое вот тут прям хорошо видно, чтобы вы прям знали, как это выглядит. Тут мы видим переобучение. Вот смотрите, у нас идёт снижение лернинг рейта, да, то есть как снижении
435: Лоса, а потом по валидации оно пошло вверх. То есть, смотрите, по трейну, она падает, падает, падает, падает, а тут оно растёт, растёт, растёт, растёт. Почему это значит, что он, по сути, не понял взаимосвязь, а он улучшает, скажем так, качество за счёт
436: Выучивание данных, то есть у нас он выучил наизусть. Видите, качество то улучшается на трейне, а вот на валидацию оно падает. Поэтому очень важно строить такие графики, чтоб просто, ну, понять вообще, как у нас там с обучением дела. На самом деле, обучаться обучение нужно было.
437: Если мы хотели бы вот с такой вот странной архитектурой обучаться где-то на 10 эпохе, после 10 эпохи уже пошло все уже пошло деградирование сети. Видите, оно у нас рано или поздно дошло до 100%. То есть, понимаете, у нас сетка на самом деле она очень неглубокая, очень не очень.
438: Так-то говоря, но при этом она дошла до стопроцентной точности почти что, да, на трейне это что значит? Она просто выучила этот сет, даже несмотря на наличие аргументации, все равно она смогла выучить. Вот, а притом как бы вся информативность, вот она где закончилась.
439: То есть на старте вот здесь как раз-таки где то 10 эпохе дальше уже это просто выучивание, которое пошло во вред благодаря вот это вот хорошо видно во вред непосредственно реальности. Давайте вот протестируем как раз-таки эту модель, да то есть вот у вас модель есть давайте
440: Какую-нибудь фотку загрузим и попробуем с помощью неё че то предсказать ну понятно он тут эта фотка вообще какая-то абстрактная да, мы уже с вами обсудили. Давайте, давайте нормальную фотку загрузим. Фотка номер 1. Че он тут думает по поводу этой фотографии? Да, это night 52%.
441: Убеждённость, да, можно посмотреть. Ну вот собственно, night и конверс. Ну вообще странно, да, как бы, ну, хотя нет, он нормально, да, высокие ботинки, возможно, он поэтому путает. Давайте фотку номер 2 попробуем.
442: Тут у нас на фотографии должен быть конверс а он говорит что это night при том убеждён в этом 99% понятно почему так потому что сетка ну честно говоря так себе в общем надеюсь все понятно у вас пазл сложился теперь понятно как использовать pytorch с вами сегодня?
443: Много что разобрали и архитектурные моменты и как как писать код на пайторче надеюсь было очень полезно если что код у вас находится в описании к видео там ссылка на zip. Архив скачайте, поиграйтесь, посмотрите, там же и dataset тоже лежит, если что вам если интересн.
444: Эти разные датасеты на эту тему, то все очень легко. Нужно всего лишь то перейти на кегл и, собственно, на кегле поискать разные датасеты по классификации. Там их очень много, например, да, вот classifications, можно свою какую-то задачку порешать. Просто чисто что
445: Научиться приобрести какой-то опыт, открываете классификационные датасеты и тут есть classifications, только не текст, а нам нужно имаджес, имаджес, classifications. И вот, например, and docks можно классифицировать. Вот, допустим,
446: Виды грибов можно классифицировать. Ну, короче, много, много всего на самом деле, чтобы вы понимали, я тоже взял сет сегодня, который в примере показывал отсюда. Вот on shoes. Classifications моему, это он так? Нет, наверное, не он, но можете как раз-таки его тоже. Видите, то здесь
447: Тапочки, ботинки, да, разные кроссовки. Короче, все что угодно можно брать готовые. Обычно, если в работаете в какой-то большой компании, там есть свои какие-то уникальные задачи, которые вы решаете благод с помощью классификации. Опять-таки, когда говорят по вопросу классификации, зачастую используют
448: Сами пишут свою сеть, то есть проще типа использовать pytorch, прям нативно обучать его, её там потому что, ну как бы у вас есть очень большая гибкость, можно делать все, что хотите, разные. Попробовать схемы обучения, подходы к обучению. Все очень удобно. Вот. А когда мы говорим там про детекцию, например,
449: Инстанс сегментацию, какие-то большие, сложные тяжёлые задачи зачастую используют готовые архитектуры, готовые, скажем так, фреймворки для обучения, например, у ультралитературное ультра литекс есть прям вот целый, да, вот туториал, например, если делать детекцию, пожалуйста, вот вам, да,
450: Туториал, как обучать детектор. Делаете какую-нибудь инстанс сегментацию? Вот вам туториал по instant сегментации. У меня это тоже все это на YouTube есть. Если что, можете посмотреть мой, мой канал. Вот есть там оценка, например, детекция точек основных тоже пожалуйста, повёрнутых баундинг боксов.
451: Пожалуйста, вот вам целиком туториал, и у них даже есть по классификации, почему я сейчас так акцентирую внимание. У ultra литис есть, собственно, возможность обучать классификатор. Это вообще легко делается. Вы просто, по сути, запускаете вот 1 строчку. То есть, представляете, вот настолько легко вам просто нужно взять
452: И указать 1 строчку, выбрать какую архитектуру модели вам нужно. То есть вот есть разные архитектуры, есть модель, например, нано смол медиум лардж икс в зависимости от размера у вас будет скорость разная. То есть вот можно взглянуть на скорость, да, сколько? Миллисекунд 1.
453: Производится вот. Так что, пожалуйста, можете использовать, в принципе, их вообще тогда 1 строчка. Нажали enter готово, сетку обучили, но у вас нет гибкости, вы теряете ту самую гибкость, которую я вам показал, где вы можете разные штуки попробовать и поэкспериментировать. Вот. Но, в принципе, если вам нужно быстрый ресерч, быстр,
454: Что-то обучить, можно использовать готовые вот от ultra литекса примеры, так что тут все это подробно описано. Можно даже потом конвертнуть готовую сетку в разные форматы пайто тезарфлоу типа оникс и куча куча всего. То есть в этом плане, да
455: Действительно, используйте, но я скажу вам по факту, я никогда пока что вот в своей жизни не встречался с тем, чтобы люди использовали классификацию от ultra литекса. То есть обычно классификаторы обучают руками. Вот, да, то есть, используя pytorch.
456: Так же, как и задачи семантической сегментации тоже обучают обычно с помощью, там, допустим, пайторч сегментейшн специальной библиотеки, а вот ultra Литик зачастую используют именно в задачах инстанс, сегментации, детекции, там, оценки, позы повёрнутых баудинг боксов, вот там, да, действительно, юзаю
457: Ultra притом очень активно юзает, потому что у них очень все удобно, понятно и главное очень быстро в рилтайме все работает, но вот для детекции, для классификации, честно говоря, в моём понимании очень сомнительно, но все же посмотрите, может быть вас это тоже заинтересует рассказать про это. Я вам все так.
458: Должен был всем удачи.