PyTorch | Урок #0 | От А до Я: классификатор MNIST
HTML-код
- Опубликовано: 18 сен 2024
- Подробный урок с объяснением теории.
Простой классификатор на PyTorch
Поддержать меня рублем: www.tinkoff.ru...
Наше сообщество в Telegram: t.me/+EzeAPkue...
Сервер в Discord: / discord
Github: github.com/mag...
00:00 - введение
03:42 - скачивание датасета с Kaggle
13:20 - метод обучения с учителем
20:05 - пайплайн обучения нейросети
Реализация пайплайна в коде:
24:09 - подготовка данных для обучения
40:50 - реализация архитектуры нейронной сети
1:00:39 - функция потерь и оптимизатор
1:14:33 - цикл обучения
1:39:27 - проверка работоспособности нейросети на кастомных изображениях
Долго подходил к этому курсу)) Вы говорите, что много теории, но как по мне - то даже мало, приходится много гуглить))
Видео отличное и полезное, большое спасибо за труд!
Спасибо за отзыв
Огромный респект за данное видео ! Фактически твой видос , это является для меня вхождением в нейросеть)) Благодарю за труды , старания и разъяснения !
Спасибо, приятно, успехов вам в изучении нейросетей!
Спасибо тебе, добрый человек, за столь толковое объяснение!
Прохожу курс на степике, там в лекциях берут готовый ноутбук с кодом и бегло комментируют его, после этого остается куча вопросов. А здесь очень круто то, что ты пишешь код с нуля и комментируешь свои действия, после таких лекций не остается вопросов🙂👍
Спасибо за добрый отзыв, успехов вам!
Забавно, но часто считается, что лекции на 2 часа - это неэффективно.
А че за курс?
это лучший урок на который я случайно наткнулась, реально, понимание появилось только после просмотра ! спасибо, очень круто
самое главное что все сразу на примере объясняется, да приходится гуглить что то самой, но
это исключительно из-за недостатка личных знаний
в дис теперь тоже добавилась)
Спасибо за добрый отзыв 🙏
Огромное спасибо за видео, нет воды, все по делу
Благодарю 🙏
Супер спасибо что делитесь знаниями 👍👍👍
Во благо! Успехов Вам!
Михаил! Шикарное видео! Лучшее, что я видел по основам CV, PyTorch. Продолжай! Спасибо!
Очень интересно и понятно, продолжай в том же духе. Спасибо)
Чел, спасибо большое! По ГРАДИЕНТАМ объяснил как боженька, наконец я понял какая функция имеется ввиду, что за холмы описываются везде)
Во благо 🙏🏻
Очень классные видео у вас, но многие вещи требуется гуглить по типу различии между функциями активации и почему можно или где нужно использовать сигмовидную или релу и в чем их преимущества и недостатки. Курс немного не для новичка, а для того кто уже немного понимает Pytorch. Если вы добавите теории то уверен что ваш курс будет невероятно популярен. В любом случае я благодарен вам за курс, видео очень полезное. Очень много раз пересматривал вас и каждый раз нахожу что то новое. Миллион раз спасибо вам! Успехов!
Спасибо! Учту.
Насчет активации - прям глобальной разницы нету, в начальных нейросетях. Можно хоть синус использовать. Лишь была нелинейность, а нейросеть разберется, как пользоваться этой нелинейностью.
Но в более глубоких слоях возникла проблема затухающего градиента. Ее пофиксили (довольно хорошо) с помощью ReLU и семейства таких функций (Leaky ReLU, PReLU, SiLU, GELU, ELU и тд). Я в своих проектах использовал GELU, в генерации рисунков она мне показалась мягче, чем ReLU и LReLU.
У ReLU есть проблема - мертвые градиенты (потому что при x < 0 градиентов нету, т.е они равны 0). Ее пофиксили Leaky ReLU, который при x < 0, вернет 0.2x.
Если текст выше был сложен, то просто используйте во всех внутренних слоях GELU и все будет ок.
@@magorokhoov Большое спасибо за ответ. Наоборот, ваш текст очень прост для понимания. Я мало использовал другие функции активации (пока), хотя почитав об этом Leaky Relu мне кажется одним из эффективнейших (возможно ошибаюсь так как я только учусь). Там кстати 0.1x выдает при меньше 0
Еще раз спасибо вам, удачи!
спасибо, то что нужно, очень крутые уроки
спасибо большое за такое емкое введение в DL, будучи человеком который в первые прикоснулся к теме нейронок смог буквально за два - три часа разобраться в основах, желаю продолжать в том же духе ^^
Спасибо вам большое за добрые слова!
в основах за 3 часа не разобраться)) почитай хоть как в принципе работают нейросети под капотом
@@fiftyfridays с ума сойти, прошёл уже месяц, и я таки действительно пошёл и прочитал как это всё работает под капотом, тяжело, но думаю справлюсь)
@@72s78 советую книжку "грокаем глубокое обучение", там все понятно объясняют + там в конце книги показывают, как можно аналог торча написать)))
Спасибо тебе огромное сначало был прошёл курс по tensorflow от google ничего не понял там было всё сжато и не понятно но после просмотра видео разобрался что и как. Спасибо огромное!
Видео было полезным и интересным, но хотелось бы добавить, что вы использовали только тренировочную выборку, от чего нейросеть будет склонная к переобучению
Нужно было на черном фоне рисовать белые цифры, тогда сеть сработала бы
Да, точно. Спасибо
Я тоже сначала обратил внимание, почему автор рисует на белом фоне? Может он потом инвертирует цвета? А потом забыл и тоже не мог понять почему сеть не распознает семёрки))
Классный курс по cnc :)
пж, во благо 🙏
Ничего не понятно что происходит в цикле, но было очень интересно 😃 Что там делается под капотом - не понятно. Чёрная коробка. 😄
Благодарю сердечно за внятные разъяснения с практикой.
А можно ли вывернуть задачу наизнанку? Например обучить нейронку так, чтобы когда ей будет задано, например, число 9, она должна будет нарисовать картинку девятки. Отобразить, так сказать, усредненный вариант всех каракулей, содержащихся в обучающем сэте.
Было бы очень любопытно поглядеть на результат
Спасибо 🙏🏻
Воу, это уже задача, связанная с ганами. Они же GAN, Generative Adversarial Network.
Они тоже будут на канале. Быть может после Unet
@@magorokhoov благодарю, буду ждать
После долгих проб стали понятны две причины, почему сеть не работает:
1) нужно инвертировать цвета, так как она учится по белым цифрам на чёрном фоне
2) нужно конвертировать изображения из матрицы 24x24 в одну строку 784 и уже тогда кормить этим нейросеть (в том числе при обучении)
Первое верно.
Второе - сеть внутри имеет слой flatten, она сама это сделает
@@magorokhoov А тут да, я видимо упустил момент, как его добавили
like
Здравствуйте, хотелось бы узнать актуально ли сейчас изучать машинное зрение и нейронки по вашим видео? Или они уже устарели?
Приветствую!
Они будут актуальны ещё лет 3-5 минимум. Это база, это основы, это фундамент. Фундамент очень медленно стареет.
Может устареть PyTorch. Код может перестать быть рабочим, из-за новых версий.
На данный момент не устарели.
На видео я больше разбираю DL, глубокое обучение, чем ML, машинное обучение.
Да, строго говоря, DL входит в ML, но чаще под ML имеют в виду классические алгоритмы машинного обучения
Очень бы хотелось с medical images
Меня просили записать видео про семантическую сегментацию и Unet.
Это будет следующее видео, 9 урок.
Значит, возьму медицинский датасет
Спасибо большое ☺️
После защиты диплома - я практически не прикасался к нейронным сетям и к программированию в целом. Хотя много обещал и обещал, но к программированию охладел, нет интереса, чтобы работать в этой сфере. Кто-то мог подумать, что я погрузился в работу в N-ой компании, но нет, я не работаю программистом / ML-щиком. Я хотел бы другими вещами заниматься.
Так как моя голова была пуста, в ней нету мыслей по нейронкам, то ничего не записывал.
Последнюю неделю вновь пробую некоторые нейросетевые эксперименты с GAN. И, возможно, я запишу еще несколько видео по нейросетям.
В плане будущих видео на канале, я хотел бы вернуться к школьным темам, объяснить их красиво и живо.
Кстати, почему бы программистам из крупных IT компаний не по записывать видео на тему создания и сбора своего датасета, или целые видеокурсы вроде моего?
Короче, ответ на ваш вопрос: очень возможно, что на новогодних запишу что-то подобное. Вы можете вступить в наш дискорд сервер. Ссылка в описании.
Вполне.
@@magorokhoov Здравствуйте! Рада что Вы вновь здесь 👏🙏
Привет, завтра ко мне приедет новый SSD. Вопрос:
хочу установить винду, но Pytorch нужен линукс. Можно ли в гугл коллабе работу всю делать с пайторчем?
Для PyTorch линукс не обязателен. Он хорошо на винде должен идти.
Еще вариант, поставить Dual Boot,, т.е Linux рядом Windows.
Запомните, если хотите ставить dual boot, то сначала Windows, а потом Linux! Win убивает загрузчики Linux
Смотреть было интересно, получил общее представление. Жаль, что по итогу тестовая выборка не работает((
Спасибо, что посмотрел!
А какую ошибку пишет?
@@magorokhoov я про то, что он неправильно распознаёт число с тестовых изображений. Вы сказали, что это из-за того, что сеть переобучена. Но как это исправить не понятно...
То есть на validation/test (из их датасета), плохо считает?
Я на видео проверял на своих цифрах, цифре 7.
Есть разные варианты предотвращения. Одна из обширных техник, это регуляризация (не помню сейчас, что точно это значит, я видел разные определения, но как я понимаю, ограничение нейросети, добавление дополнительного штрафа, например, за большие веса. Лучше закруглить). Можно добавить dropout, размывать фотографию, добавить шум.
Это должно помочь
А зачем нужен метод detach ?
Он удаляет граф вычислений (как бы историю) с тензора. Отвязывает.
Back propagation не будет идти дальше этого тензора.
(грубая аналогия - сделать из теоремы аксиому)
У меня такой же почерк.
😁😎
Маленький вопрос. Разве сигмоида не предпочтительнее была бы на выходе в данном случае? Все таки софтмакс обычно для мульти лейбл классификации применяется, а здесь обычная классификация.
Софтмакс для одного лейбла. Сумма всех выходов будет равна 1.0
Выходы при сигмоиде независимы, и поэтому она больше подходит для мультилейбла
@@magorokhoov Понял, значит неправильно запомнилось. Большое спасибо!
Мне кажется у тебя такой плохой результат на своих рукописных цифрах из-за того, что ты брал белый фон и черную цифру, а в датасете наоборот
Да, именно так. Моя ошибка.
Хорошо, что вы можете заходить ошибки, это оочень помогает в разработке
А какая у вас видеокарта, что 100 ит в секунду делает ?
3060RTX. Покупал на алиэкспресс летом 2022
51:36 - Не должно быть еще +b в формуле? Мы же еще используем некий баис(смещение рандомное)
Строго говоря, да, его стоит указать.
Иногда при объяснении его можно отбросить, допустив, что в векторе x есть еще одно число, всегда равное 1, и соответственно несколько расширить W.
Будет аналогично xW + b.
Добрый день. Спасибо за урок.
При вызове accuracy(pred, label), выдает ошибку "axis 1 is out of bounds for array of dimension 1" в строке answer = F.softmax(pred.detach()).numpy().argmax(1) == label.numpy().argmax(1)
Есть идеи.
Пробовал запускать с гита на jupute-notebook (1D target tensor expected, multi-target not supported) на loss = loss_fn(pred, label)
В accuracy нужно передать label как массив вероятностней, такой же, как и accuracy.
Если же label как из датасета (не one-hot vector), но нужно убрать второй .argmax(1)
Ругается на строку с :
pred = model(img)
IndexError: Demission out of range(expected to be in range of [-4, 3], but got 784
Можете ли вы приложить полный вывод ошибки?
@@magorokhoov всё исправил.. банальная невнимательность - опечатка в коде...
С каких пор оператор == возвращает число с плавающей запятой? Создатели фреймворка перегрузили оператор? Выглядит просто дико и вводит в заблуждение.
Не помню код. В какой момент это происходит?
@@magorokhoovв функции accuracy. Всё ещё пугает, если честно.
Ошибка notImplementederror, помоги пожалуйста 😢
Добрый день, перейдите в наш дискорд сервер для оперативности. Пришлите ваш код
всё понятно но немного растянуто
Спасибо. Ок, в следующие разы постараюсь быть лаконичнее
1:28:02 швиряет?) У меня ошибка в 2000%))))
Погоди, ты же в МАИ учился?
Верно, учился
optimizer = torch.optim.SGD(model.parameters(), lr= 1e-3, momentum = 0.9)
ValueError: optimizer got an empty parameter list
1:07:55 мне пустой список почему то приходит (
Как выглядит архитектора нейросети?
@@magorokhoov
class Neural_numbers(nn.Module):
def _init_(self):
super()._init_()
self.flat = nn.Flatten()
self.linear1 = nn.Linear(28*28, 100)
self.linear2 = nn.Linear(100, 10)
self.act = nn.ReLU()
def forward(self, x):
out = self.linear1(x)
out = self.linear2(x)
out = self.act(x)
return out
Здесь в коде опечатка, в forward. В linear1,2 нужно подавать out.
Также нужно добавить прогон через self.flat.
Act нужен после linear1, после linear2 не нужен
@@magorokhoov Спасибо за ответ. Нашёл ошибку, вместо:
"__init__"
написал
"_init_",
только в документации pytorch заметил это, не думал что это ключевое слово)
Ой, а это я не заметил. Хорошо, что вы нашли ошибку!
Хотите перейти в наш дискорд сервер? Там мы оперативно отвечаем на вопросы
+++++++++++++++
Unet
Почему у датасета 4 размерности ?
BCHW - batches channels height width. Батчи каналы высота ширина.
Батч - грубо говоря, пачка. Размер батча - количество фоток в пачке.
У каждой фотографии есть каналы, обычно их 3 (RGB, red green blue). У нас фото чб, поэтому только один канал.
В полносвязанных слоях только 2 размерности, BC, батчи и каналы.
Поэтому мы преобразуем (16, 1, 28, 28) в (16, 784) с помощью слоя Flatten.
Вам понятен ответ?
@@magorokhoov более чем , спасибо !
Оперативно , однако
Во благо 🙏🏻
Здравствуйте, возникла такая ошибка:
RuntimeError Traceback (most recent call last)
in ()
2 optimizer.zero_grad()
3
----> 4 label = nn.functional.one_hot(label, 10).float()
5 pred = model(img)
6
RuntimeError: one_hot is only applicable to index tensor.
Добрый день!
Узнайте из чего состоит label.
label.shape() - узнаем размерность
print(label) - узнаем состав label
Результаты напишите сюда в комментарии.
Также напишите, как создался label
@@magorokhoov Оказалось, что опечатался, оттого и ошибка. Тем не менее, большое спасибо за ваш ответ!