PyTorch | Урок #0 | От А до Я: классификатор MNIST

Поделиться
HTML-код
  • Опубликовано: 18 сен 2024
  • Подробный урок с объяснением теории.
    Простой классификатор на PyTorch
    Поддержать меня рублем: www.tinkoff.ru...
    Наше сообщество в Telegram: t.me/+EzeAPkue...
    Сервер в Discord: / discord
    Github: github.com/mag...

Комментарии • 103

  • @imtes177
    @imtes177 Год назад +8

    00:00 - введение
    03:42 - скачивание датасета с Kaggle
    13:20 - метод обучения с учителем
    20:05 - пайплайн обучения нейросети
    Реализация пайплайна в коде:
    24:09 - подготовка данных для обучения
    40:50 - реализация архитектуры нейронной сети
    1:00:39 - функция потерь и оптимизатор
    1:14:33 - цикл обучения
    1:39:27 - проверка работоспособности нейросети на кастомных изображениях

  • @K7Alexander
    @K7Alexander Год назад +18

    Долго подходил к этому курсу)) Вы говорите, что много теории, но как по мне - то даже мало, приходится много гуглить))
    Видео отличное и полезное, большое спасибо за труд!

    • @magorokhoov
      @magorokhoov  Год назад +1

      Спасибо за отзыв

  • @Sorsha_go
    @Sorsha_go Год назад +7

    Огромный респект за данное видео ! Фактически твой видос , это является для меня вхождением в нейросеть)) Благодарю за труды , старания и разъяснения !

    • @magorokhoov
      @magorokhoov  Год назад

      Спасибо, приятно, успехов вам в изучении нейросетей!

  • @АндрейКадетов-н3р
    @АндрейКадетов-н3р 10 месяцев назад +5

    Спасибо тебе, добрый человек, за столь толковое объяснение!
    Прохожу курс на степике, там в лекциях берут готовый ноутбук с кодом и бегло комментируют его, после этого остается куча вопросов. А здесь очень круто то, что ты пишешь код с нуля и комментируешь свои действия, после таких лекций не остается вопросов🙂👍

    • @magorokhoov
      @magorokhoov  10 месяцев назад +2

      Спасибо за добрый отзыв, успехов вам!
      Забавно, но часто считается, что лекции на 2 часа - это неэффективно.

    • @arti5946
      @arti5946 День назад

      А че за курс?

  • @Dj-xs3gt
    @Dj-xs3gt 5 месяцев назад +3

    это лучший урок на который я случайно наткнулась, реально, понимание появилось только после просмотра ! спасибо, очень круто
    самое главное что все сразу на примере объясняется, да приходится гуглить что то самой, но
    это исключительно из-за недостатка личных знаний
    в дис теперь тоже добавилась)

    • @magorokhoov
      @magorokhoov  5 месяцев назад

      Спасибо за добрый отзыв 🙏

  • @loo9126
    @loo9126 10 месяцев назад +4

    Огромное спасибо за видео, нет воды, все по делу

    • @magorokhoov
      @magorokhoov  10 месяцев назад

      Благодарю 🙏

  • @Dina-sc5ks
    @Dina-sc5ks Год назад +5

    Супер спасибо что делитесь знаниями 👍👍👍

    • @magorokhoov
      @magorokhoov  Год назад +2

      Во благо! Успехов Вам!

  • @alexeykulikov5274
    @alexeykulikov5274 Год назад +5

    Михаил! Шикарное видео! Лучшее, что я видел по основам CV, PyTorch. Продолжай! Спасибо!

  • @Саня-й3й3э
    @Саня-й3й3э Год назад +3

    Очень интересно и понятно, продолжай в том же духе. Спасибо)

  • @user-ob1jz8yl6x
    @user-ob1jz8yl6x Год назад +1

    Чел, спасибо большое! По ГРАДИЕНТАМ объяснил как боженька, наконец я понял какая функция имеется ввиду, что за холмы описываются везде)

  • @ДаниэльДарбеков
    @ДаниэльДарбеков 9 месяцев назад +1

    Очень классные видео у вас, но многие вещи требуется гуглить по типу различии между функциями активации и почему можно или где нужно использовать сигмовидную или релу и в чем их преимущества и недостатки. Курс немного не для новичка, а для того кто уже немного понимает Pytorch. Если вы добавите теории то уверен что ваш курс будет невероятно популярен. В любом случае я благодарен вам за курс, видео очень полезное. Очень много раз пересматривал вас и каждый раз нахожу что то новое. Миллион раз спасибо вам! Успехов!

    • @magorokhoov
      @magorokhoov  9 месяцев назад

      Спасибо! Учту.
      Насчет активации - прям глобальной разницы нету, в начальных нейросетях. Можно хоть синус использовать. Лишь была нелинейность, а нейросеть разберется, как пользоваться этой нелинейностью.
      Но в более глубоких слоях возникла проблема затухающего градиента. Ее пофиксили (довольно хорошо) с помощью ReLU и семейства таких функций (Leaky ReLU, PReLU, SiLU, GELU, ELU и тд). Я в своих проектах использовал GELU, в генерации рисунков она мне показалась мягче, чем ReLU и LReLU.
      У ReLU есть проблема - мертвые градиенты (потому что при x < 0 градиентов нету, т.е они равны 0). Ее пофиксили Leaky ReLU, который при x < 0, вернет 0.2x.
      Если текст выше был сложен, то просто используйте во всех внутренних слоях GELU и все будет ок.

    • @ДаниэльДарбеков
      @ДаниэльДарбеков 9 месяцев назад +1

      @@magorokhoov Большое спасибо за ответ. Наоборот, ваш текст очень прост для понимания. Я мало использовал другие функции активации (пока), хотя почитав об этом Leaky Relu мне кажется одним из эффективнейших (возможно ошибаюсь так как я только учусь). Там кстати 0.1x выдает при меньше 0
      Еще раз спасибо вам, удачи!

  • @vasav9407
    @vasav9407 7 месяцев назад +1

    спасибо, то что нужно, очень крутые уроки

  • @72s78
    @72s78 11 месяцев назад +1

    спасибо большое за такое емкое введение в DL, будучи человеком который в первые прикоснулся к теме нейронок смог буквально за два - три часа разобраться в основах, желаю продолжать в том же духе ^^

    • @magorokhoov
      @magorokhoov  11 месяцев назад

      Спасибо вам большое за добрые слова!

    • @fiftyfridays
      @fiftyfridays 9 месяцев назад

      в основах за 3 часа не разобраться)) почитай хоть как в принципе работают нейросети под капотом

    • @72s78
      @72s78 9 месяцев назад

      @@fiftyfridays с ума сойти, прошёл уже месяц, и я таки действительно пошёл и прочитал как это всё работает под капотом, тяжело, но думаю справлюсь)

    • @fiftyfridays
      @fiftyfridays 9 месяцев назад

      @@72s78 советую книжку "грокаем глубокое обучение", там все понятно объясняют + там в конце книги показывают, как можно аналог торча написать)))

  • @flurixoww
    @flurixoww Год назад

    Спасибо тебе огромное сначало был прошёл курс по tensorflow от google ничего не понял там было всё сжато и не понятно но после просмотра видео разобрался что и как. Спасибо огромное!

  • @fiftyfridays
    @fiftyfridays 9 месяцев назад +3

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

  • @AlexanderLeontiev-v9g
    @AlexanderLeontiev-v9g Год назад +6

    Нужно было на черном фоне рисовать белые цифры, тогда сеть сработала бы

    • @magorokhoov
      @magorokhoov  Год назад +1

      Да, точно. Спасибо

    • @ВячеславПеревышин
      @ВячеславПеревышин Год назад +2

      Я тоже сначала обратил внимание, почему автор рисует на белом фоне? Может он потом инвертирует цвета? А потом забыл и тоже не мог понять почему сеть не распознает семёрки))

  • @vilovnok1238
    @vilovnok1238 7 месяцев назад

    Классный курс по cnc :)

    • @magorokhoov
      @magorokhoov  7 месяцев назад

      пж, во благо 🙏

  • @hottabych137
    @hottabych137 7 месяцев назад +1

    Ничего не понятно что происходит в цикле, но было очень интересно 😃 Что там делается под капотом - не понятно. Чёрная коробка. 😄

  • @KromlechKannabikus
    @KromlechKannabikus Год назад +6

    Благодарю сердечно за внятные разъяснения с практикой.
    А можно ли вывернуть задачу наизнанку? Например обучить нейронку так, чтобы когда ей будет задано, например, число 9, она должна будет нарисовать картинку девятки. Отобразить, так сказать, усредненный вариант всех каракулей, содержащихся в обучающем сэте.
    Было бы очень любопытно поглядеть на результат

    • @magorokhoov
      @magorokhoov  Год назад +6

      Спасибо 🙏🏻
      Воу, это уже задача, связанная с ганами. Они же GAN, Generative Adversarial Network.
      Они тоже будут на канале. Быть может после Unet

    • @KromlechKannabikus
      @KromlechKannabikus Год назад +1

      @@magorokhoov благодарю, буду ждать

  • @emperr_r661
    @emperr_r661 Год назад +2

    После долгих проб стали понятны две причины, почему сеть не работает:
    1) нужно инвертировать цвета, так как она учится по белым цифрам на чёрном фоне
    2) нужно конвертировать изображения из матрицы 24x24 в одну строку 784 и уже тогда кормить этим нейросеть (в том числе при обучении)

    • @magorokhoov
      @magorokhoov  Год назад

      Первое верно.
      Второе - сеть внутри имеет слой flatten, она сама это сделает

    • @emperr_r661
      @emperr_r661 Год назад +1

      @@magorokhoov А тут да, я видимо упустил момент, как его добавили

  • @duming3076
    @duming3076 Год назад +1

    like

  • @mazhorovilia
    @mazhorovilia Год назад +1

    Здравствуйте, хотелось бы узнать актуально ли сейчас изучать машинное зрение и нейронки по вашим видео? Или они уже устарели?

    • @magorokhoov
      @magorokhoov  Год назад +3

      Приветствую!
      Они будут актуальны ещё лет 3-5 минимум. Это база, это основы, это фундамент. Фундамент очень медленно стареет.
      Может устареть PyTorch. Код может перестать быть рабочим, из-за новых версий.
      На данный момент не устарели.
      На видео я больше разбираю DL, глубокое обучение, чем ML, машинное обучение.
      Да, строго говоря, DL входит в ML, но чаще под ML имеют в виду классические алгоритмы машинного обучения

  • @Dina-sc5ks
    @Dina-sc5ks Год назад +2

    Очень бы хотелось с medical images

    • @magorokhoov
      @magorokhoov  Год назад +2

      Меня просили записать видео про семантическую сегментацию и Unet.
      Это будет следующее видео, 9 урок.
      Значит, возьму медицинский датасет

    • @Dina-sc5ks
      @Dina-sc5ks Год назад +1

      Спасибо большое ☺️

    • @magorokhoov
      @magorokhoov  9 месяцев назад +1

      После защиты диплома - я практически не прикасался к нейронным сетям и к программированию в целом. Хотя много обещал и обещал, но к программированию охладел, нет интереса, чтобы работать в этой сфере. Кто-то мог подумать, что я погрузился в работу в N-ой компании, но нет, я не работаю программистом / ML-щиком. Я хотел бы другими вещами заниматься.
      Так как моя голова была пуста, в ней нету мыслей по нейронкам, то ничего не записывал.
      Последнюю неделю вновь пробую некоторые нейросетевые эксперименты с GAN. И, возможно, я запишу еще несколько видео по нейросетям.
      В плане будущих видео на канале, я хотел бы вернуться к школьным темам, объяснить их красиво и живо.
      Кстати, почему бы программистам из крупных IT компаний не по записывать видео на тему создания и сбора своего датасета, или целые видеокурсы вроде моего?
      Короче, ответ на ваш вопрос: очень возможно, что на новогодних запишу что-то подобное. Вы можете вступить в наш дискорд сервер. Ссылка в описании.

    • @magorokhoov
      @magorokhoov  9 месяцев назад

      Вполне.

    • @Dina-sc5ks
      @Dina-sc5ks 9 месяцев назад

      @@magorokhoov Здравствуйте! Рада что Вы вновь здесь 👏🙏

  • @_tesbek_7668
    @_tesbek_7668 6 месяцев назад

    Привет, завтра ко мне приедет новый SSD. Вопрос:
    хочу установить винду, но Pytorch нужен линукс. Можно ли в гугл коллабе работу всю делать с пайторчем?

    • @magorokhoov
      @magorokhoov  5 месяцев назад

      Для PyTorch линукс не обязателен. Он хорошо на винде должен идти.
      Еще вариант, поставить Dual Boot,, т.е Linux рядом Windows.
      Запомните, если хотите ставить dual boot, то сначала Windows, а потом Linux! Win убивает загрузчики Linux

  • @shemich3000
    @shemich3000 Год назад +1

    Смотреть было интересно, получил общее представление. Жаль, что по итогу тестовая выборка не работает((

    • @magorokhoov
      @magorokhoov  Год назад

      Спасибо, что посмотрел!
      А какую ошибку пишет?

    • @shemich3000
      @shemich3000 Год назад

      @@magorokhoov я про то, что он неправильно распознаёт число с тестовых изображений. Вы сказали, что это из-за того, что сеть переобучена. Но как это исправить не понятно...

    • @magorokhoov
      @magorokhoov  Год назад

      То есть на validation/test (из их датасета), плохо считает?
      Я на видео проверял на своих цифрах, цифре 7.
      Есть разные варианты предотвращения. Одна из обширных техник, это регуляризация (не помню сейчас, что точно это значит, я видел разные определения, но как я понимаю, ограничение нейросети, добавление дополнительного штрафа, например, за большие веса. Лучше закруглить). Можно добавить dropout, размывать фотографию, добавить шум.
      Это должно помочь

  • @hikoop5090
    @hikoop5090 Год назад +2

    А зачем нужен метод detach ?

    • @magorokhoov
      @magorokhoov  Год назад

      Он удаляет граф вычислений (как бы историю) с тензора. Отвязывает.
      Back propagation не будет идти дальше этого тензора.
      (грубая аналогия - сделать из теоремы аксиому)

  • @wylysypydystyshky
    @wylysypydystyshky 2 месяца назад

    У меня такой же почерк.

  • @AlexanderLeontiev-v9g
    @AlexanderLeontiev-v9g Год назад

    Маленький вопрос. Разве сигмоида не предпочтительнее была бы на выходе в данном случае? Все таки софтмакс обычно для мульти лейбл классификации применяется, а здесь обычная классификация.

    • @magorokhoov
      @magorokhoov  Год назад

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

    • @AlexanderLeontiev-v9g
      @AlexanderLeontiev-v9g Год назад

      @@magorokhoov Понял, значит неправильно запомнилось. Большое спасибо!

  • @getrekt6198
    @getrekt6198 Год назад +1

    Мне кажется у тебя такой плохой результат на своих рукописных цифрах из-за того, что ты брал белый фон и черную цифру, а в датасете наоборот

    • @magorokhoov
      @magorokhoov  Год назад

      Да, именно так. Моя ошибка.
      Хорошо, что вы можете заходить ошибки, это оочень помогает в разработке

  • @maxosad9926
    @maxosad9926 20 дней назад

    А какая у вас видеокарта, что 100 ит в секунду делает ?

    • @magorokhoov
      @magorokhoov  20 дней назад

      3060RTX. Покупал на алиэкспресс летом 2022

  • @relax_FM_1
    @relax_FM_1 Год назад

    51:36 - Не должно быть еще +b в формуле? Мы же еще используем некий баис(смещение рандомное)

    • @magorokhoov
      @magorokhoov  Год назад

      Строго говоря, да, его стоит указать.
      Иногда при объяснении его можно отбросить, допустив, что в векторе x есть еще одно число, всегда равное 1, и соответственно несколько расширить W.
      Будет аналогично xW + b.

  • @user-zd6he3zd5j
    @user-zd6he3zd5j Год назад

    Добрый день. Спасибо за урок.
    При вызове 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)

    • @magorokhoov
      @magorokhoov  Год назад

      В accuracy нужно передать label как массив вероятностней, такой же, как и accuracy.
      Если же label как из датасета (не one-hot vector), но нужно убрать второй .argmax(1)

  • @a_lexAnd_r
    @a_lexAnd_r 9 месяцев назад

    Ругается на строку с :
    pred = model(img)
    IndexError: Demission out of range(expected to be in range of [-4, 3], but got 784

    • @magorokhoov
      @magorokhoov  9 месяцев назад

      Можете ли вы приложить полный вывод ошибки?

    • @a_lexAnd_r
      @a_lexAnd_r 9 месяцев назад +1

      @@magorokhoov всё исправил.. банальная невнимательность - опечатка в коде...

  • @tarkhidden
    @tarkhidden 8 месяцев назад

    С каких пор оператор == возвращает число с плавающей запятой? Создатели фреймворка перегрузили оператор? Выглядит просто дико и вводит в заблуждение.

    • @magorokhoov
      @magorokhoov  5 месяцев назад

      Не помню код. В какой момент это происходит?

    • @tarkhidden
      @tarkhidden 5 месяцев назад

      @@magorokhoovв функции accuracy. Всё ещё пугает, если честно.

  • @VrChes
    @VrChes 11 месяцев назад

    Ошибка notImplementederror, помоги пожалуйста 😢

    • @magorokhoov
      @magorokhoov  11 месяцев назад

      Добрый день, перейдите в наш дискорд сервер для оперативности. Пришлите ваш код

  • @exxas-lu5rx
    @exxas-lu5rx 4 месяца назад

    всё понятно но немного растянуто

    • @magorokhoov
      @magorokhoov  4 месяца назад

      Спасибо. Ок, в следующие разы постараюсь быть лаконичнее

  • @bohdans.1479
    @bohdans.1479 2 месяца назад

    1:28:02 швиряет?) У меня ошибка в 2000%))))

  • @vvoooov
    @vvoooov 8 месяцев назад

    Погоди, ты же в МАИ учился?

    • @magorokhoov
      @magorokhoov  8 месяцев назад

      Верно, учился

  • @duming3076
    @duming3076 Год назад

    optimizer = torch.optim.SGD(model.parameters(), lr= 1e-3, momentum = 0.9)
    ValueError: optimizer got an empty parameter list
    1:07:55 мне пустой список почему то приходит (

    • @magorokhoov
      @magorokhoov  Год назад +1

      Как выглядит архитектора нейросети?

    • @duming3076
      @duming3076 Год назад

      @@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

    • @magorokhoov
      @magorokhoov  Год назад +2

      Здесь в коде опечатка, в forward. В linear1,2 нужно подавать out.
      Также нужно добавить прогон через self.flat.
      Act нужен после linear1, после linear2 не нужен

    • @duming3076
      @duming3076 Год назад

      @@magorokhoov Спасибо за ответ. Нашёл ошибку, вместо:
      "__init__"
      написал
      "_init_",
      только в документации pytorch заметил это, не думал что это ключевое слово)

    • @magorokhoov
      @magorokhoov  Год назад +1

      Ой, а это я не заметил. Хорошо, что вы нашли ошибку!
      Хотите перейти в наш дискорд сервер? Там мы оперативно отвечаем на вопросы

  • @iegorshevchenko8365
    @iegorshevchenko8365 19 дней назад +1

    +++++++++++++++

  • @Dina-sc5ks
    @Dina-sc5ks Год назад +1

    Unet

  • @hikoop5090
    @hikoop5090 Год назад +1

    Почему у датасета 4 размерности ?

    • @magorokhoov
      @magorokhoov  Год назад +1

      BCHW - batches channels height width. Батчи каналы высота ширина.
      Батч - грубо говоря, пачка. Размер батча - количество фоток в пачке.
      У каждой фотографии есть каналы, обычно их 3 (RGB, red green blue). У нас фото чб, поэтому только один канал.
      В полносвязанных слоях только 2 размерности, BC, батчи и каналы.
      Поэтому мы преобразуем (16, 1, 28, 28) в (16, 784) с помощью слоя Flatten.
      Вам понятен ответ?

    • @hikoop5090
      @hikoop5090 Год назад +1

      ​@@magorokhoov более чем , спасибо !
      Оперативно , однако

    • @magorokhoov
      @magorokhoov  Год назад

      Во благо 🙏🏻

  • @drunkdiente7033
    @drunkdiente7033 6 месяцев назад

    Здравствуйте, возникла такая ошибка:
    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.

    • @magorokhoov
      @magorokhoov  6 месяцев назад

      Добрый день!
      Узнайте из чего состоит label.
      label.shape() - узнаем размерность
      print(label) - узнаем состав label
      Результаты напишите сюда в комментарии.
      Также напишите, как создался label

    • @drunkdiente7033
      @drunkdiente7033 6 месяцев назад +1

      @@magorokhoov Оказалось, что опечатался, оттого и ошибка. Тем не менее, большое спасибо за ваш ответ!