DeepSchool
9.67K subscribers
74 photos
1 video
1 file
413 links
Это канал школы deepschool.ru. Здесь мы будем:
- напоминать вам теорию ML/DL в виде коротких постов,
- задавать вопросы с собеседований,
- рассказывать про полезные фреймворки
- и делиться советами, которые помогут вам в работе.

@deepschool_support
Download Telegram
​​Задачка на подумать:

Пусть вам нужно дедуплицировать фотографии. Причем дедупликация должна быть умной. Если есть фотка и такая же фотка, но сдвинутая/повернутая/засвеченная, то нужно считать их дублями.

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

В итоге может получиться такой словарик (рис. 1):

{
'img1': {'img2', 'img10', 'img15'},
'img2': {'img1', 'img10', 'img15', 'img20'},
...
}

Где ключ - это картинка, а значение - это множество картинок, которые мы посчитали дублями по расстоянию между эмбеддингами.

В таком подходе возникнет следующая проблема: получившееся отношение дублируемости не транзитивно. Это значит, что по расстоянию между эмбеддингами может получиться что-то такое (рис. 2):

{
'img1': {'img2', 'img3'},
'img2': {'img1'},
'img3': {'img1'},
}

т.е. img2 и img3 дублируют img1, но не дублируют друг друга. Кажется, в такой ситуации мы хотим сказать, что все картинки (img1, img2, img3) являются дубликатами друг друга. Ситуацию, при которой из-за такого подхода мы начнем даже очень непохожие картинки называть дублями, мы не рассматриваем, она малореалистична.

Как этого достичь?

Ответ опубликуем завтра
🤔17👍4😁211🤯1
​​Решение

Первое решение, которое может прийти в голову: для каждой картинки в словаре пройдемся по ее дубликатам. И объединим множество дубликатов картинки с множествами дубликатов для каждого дубликата этой картинки. Но такое решение будет работать долго и неправильно. Долго потому что операция объединения множеств имеет линейную сложность, т.е. мы получим итоговую квадратичную сложность. А неправильно потому что может быть такая ситуация (рис. 1):

# input
{
'img2': {'img1'},
'img3': {'img1', 'img4'},
'img1': {'img2', 'img3'},

}

# output
{
'img2': {'img1', 'img3'},
'img3': {'img1', 'img4', 'img2'},
'img1': {'img2', 'img3', 'img4'},

}

Т.е. для картинки img2 нужно было не просто объединить ее множество с множеством картинки img1, а еще и провалиться в множество картинки img1 и взять оттуда все множества дубликатов. Думаю, вы поняли, что здесь запахло рекурсией… поэтому забудем про это решение.

Корректное и быстрое решение можно сделать при помощи структуры данных система непересекающихся множеств (Disjoint-set). Библиотечка для python. Но там буквально несколько строк, можно и самим написать.

В этой структуре данных все объекты хранятся в непересекающихся множествах.

У нее есть две операции:

- get(x) — возвращает некоторого представителя из множества, которому принадлежит объект x
- union(x, y) — объединяет два множества, в которых лежат объекты x и y

Разберем на примере. Пусть была такая система множеств:

{img1, img2, img3}, {img4, img5}, {img6, img7}

get(img1) вернет нам одно из значений из множества {img1, img2, img3}. Т.е. некоторого представителя этого множества
union(img2, img4) преобразует систему множеств к такому виду:

{img1, img2, img3, img4, img5}, {img6, img7}

Обе операции работают почти за О(1). В сложности фигурирует обратная функция Аккермана, но ее можно принять за небольшую константу в реальных задачах. Вообще, есть даже работы, которые утверждают, что нашли ошибку в выводе классической оценки и она может быть улучшена.

Приспособить эту структуру данных под нашу задачу можно следующим образом (рис. 2).
Вот и все. В итоге у нас получится система множеств картинок-дубликатов, которую мы хотели получить изначально.
👍275🤔4🔥2
MobileNet v1-v3

Разобрали для вас сразу три статьи в одной! В ней мы рассказали про революционное семейство архитектур MobileNet и выписали все трюки, которые использовали авторы в каждой из версий архитектуры.

Как можно догадаться из названия, MobileNet — отличная архитектура для инференса на мобильных устройствах. Статьи о ней принесли в мир CV несколько ключевых идей по ускорению и облегчению сетей. Многие из этих идей используются до сих пор и наследуются в других работах (в той же EfficientNet). Поэтому очень сложно переоценить важность этих архитектур.

Очень рекомендуем к прочтению! Изложили все идеи простым языком и подчеркнули несколько интересных нюансов.

Например, вы знали, зачем в MobileNet v2 убрали нелинейность между некоторыми свертками? Или помните почему свертки 1х1 считаются быстрее других (даже с поправкой на кол-во параметров)? Если нет и хотите узнать или вспомнить, читайте нашу новую статью: https://telegra.ph/MobileNet-v1-v3-11-24 🔥
🔥478👍62❤‍🔥1
Вспоминаем статистику!

Начинаем серию постов про проверку статистических гипотез.

В новой статье рассказали о том, что такое статистические тесты и зачем они вообще нужны. Напомнили что значит «репрезентативная выборка», стат. критерий, стат. значимость, ошибки первого/второго рода и другое.
Читайте подробнее в статье: https://telegra.ph/Proverka-statisticheskih-gipotez-Vvedenie-12-05
🔥474🥰4👍3
Что такое attention?

Раньше CV инженерам можно было оправдаться, почему они не могут ответить на этот вопрос.
Но трансформеры все глубже проникают в компьютерное зрение и оправдания вроде “я же не нлп-шник!” уже точно не сработают :)

Чтобы напомнить вам какие бывают механизмы внимания в CV, мы готовим для вас отдельный материал. Но пока давайте вспомним/узнаем что же вообще такое attention!

Читайте нашу короткую, но очень полезную статью: https://telegra.ph/CHto-takoe-attention-12-09 — и больше не придется оправдываться)
🔥46👍14🥰4🤔42
Основные компоненты AWS

Давайте представим, что вам понадобилось обучиться на датасете размером в несколько ТБ. На вашей рабочей машинке всего RTX - 3070, а кластера у вас нет🙁 Или даже машинки нет.

Что делать? Надо переезжать в облако! Если вы планируете переезжать или просто хотите узнать как работают в облаке, то читайте нашу новую статью Основные компоненты AWS. В ней мы познакомим вас с основными терминами и дадим несколько советов.

https://telegra.ph/Osnovnye-komponenty-AWS-12-14
👍182❤‍🔥2
​​Прогресс развития механизма внимания в CV

Продолжаем про аттеншн в CV. Предыдущий пост.

Теперь у вас есть понимание, что по большому счету механизм внимания - это просто умный (обучаемый) способ что-то перевзвесить. Давайте рассмотрим классификацию механизмов внимания в компьютерном зрении, а также историю их развития. На рисунке представлена временная линия с метками, подчеркивающими знаковые статьи того времени.

Весь прогресс развития может быть грубо разделен на 4 периода:

1. Первый период начинается с архитектуры RAM. В ней авторы предложили комбинировать глубокие сети с механизмом внимания. Механизм внимания рекуррентно предсказывал “важные” участки изображений и обновлял веса сети с помощью обучения с подкреплением. Главной отличительной особенностью работ этого периода является то, что для реализации механизмов внимания всегда использовали RNN;

2. Второй период начался с архитектуры STN. В STN авторы использовали подсеть, которая предсказывает аффинные преобразования для локализации (за счет растяжения и обрезки) и трансформации (сдвиг, поворот) “важной” области изображения. Затем через сеть пропускается только преобразованная важная область входной картинки. Главной отличительной особенностью второго периода является то, что важные области входных данных предсказывались отдельной подсетью, которая училась вместе с классификатором.

3. Третий период начался с SENet, которая предложила поканальный вариант механизма внимания. В нем адаптивно (обучаемо) выделяются потенциально важные признаки. SE-блоки используются например в EffNet и MobileNet архитектурах.

4. Четвертый период начался с адаптации работы Attention is all you need к работе с изображениями, породив архитектуры под общим названием “visual transformers”.
👍24❤‍🔥5🤯31🔥1
​​Типы механизмов внимания

В целом механизмы внимания в компьютерном зрении можно разделить на следующие категории:

1. Поканальный механизм внимания (Channel attention - НА ЧТО обращать внимание);
2. Пространственный механизм внимания (Spatial attention - КУДА обращать внимание);
3. Временной (эволюционный) механизм внимания (Temporal Attention - КОГДА обращать внимание);
4. Блочный\веточный механизм внимания (Branch attention - ЧТО должно обратить внимание).

Также существуют архитектуры, которые являются представителями нескольких категорий механизмов внимания одновременно.
Рисунок 1 представляет диаграмму категоризации механизмов внимания в компьютерном зрении.

Формула 1 обобщает практически все существующие реализации механизмов внимания. Эту формулу стоит запомнить как для общего развития, так и для ответов на собеседованиях.

Формула 2 — известный вам из предыдущего поста self-attention .

Формула 3 — SE-блок.
👍20🤯7🔥42
Как ускорить разметку при помощи CVAT и Fiftyone

Задача: разметить тысячи изображений быстро и дешево, чтобы не тратить время на простые кейсы. Решение: предразметить картинки, выбросить мусор и размечать самые полезные. В идеале решить задачу без костылей, чтобы переиспользовать решение в будущих задачах.

В новой статье-туториале вы узнаете как с нуля поднять у себя сервис для разметки CVAT и познакомитесь с Fiftyone — сервисом, который ускорит работу с датасетом.

Рассказываем про сервисы на примере задачи детекции. Читайте подробнее в телеграфе: https://telegra.ph/Razmechaem-dannye-Bystro-nedorogo-12-27
🔥33👍322
Всем доброго новогоднего утра!⭐️

От всей команды DeepSchool желаем вам прекрасного года! Чтобы лоссы падали, метрики росли, но главное: чтобы вы получали от этого удовольствие💙

Спасибо, что читаете нас! Ценим ваше внимание и благодарим за ваши реакции) В следующем году будем еще больше радовать вас полезным контентом!
65🎉111
Channel Attention

Всех с первым рабочим днем!🧑‍🔬🧑‍🎨🧑‍💻

Решили не нагружать вас постами в праздники, чтобы не отвлекать от отдыха)
Начнем год с короткой статьи в телеграфе. Продолжаем про Attention в CV (прошлый пост из серии тут). Рассмотрим поканальный механизм внимания и в частности Squeeze-and-Excitation блок, который используется в семействах MobileNet и EffNet.

Переходите по ссылке, чтобы узнать подробнее: https://telegra.ph/Channel-Attention-12-28
🔥19👍71🤯1
Дешево считаем в облаке, если нет GPU

Когда у студентов нашего курса возникают проблемы с их машинами, мы выдаем кредиты на аренду GPU в сервисе vast.ai.

Чтобы было проще познакомиться с сервисом и настроить удаленную работу, мы написали туториал. В нем мы рассказали как выбрать машину, настроить удаленное подключение и работать в VSCode так, будто GPU стоит на вашем компьютере.

Если вы тоже можете платить криптой или зарубежной картой и ищете дешевую машину для краткосрочных проектов, то наш туториал будет полезен и вам.

Читайте и сохраняйте на будущее: https://telegra.ph/Deshevo-schitaem-v-oblake-esli-net-GPU-vastai--VSCode-01-14 😉
🔥302👏21
​​Чем заменить CSV, если у вас очень много данных

Одна из основных проблем формата CSV — размер файлов. В нем мы храним данные в виде строк, соответственно, число 0.0123456789 будет занимать 12 байт. В то же время, это float число, которое должно занимать 4 байта. Мы видим разницу в 3 раза для каждого числа. А их могут быть миллионы! Более того, большой размер файла еще и замедляет скорость его считывания с диска.

Давайте представим: у нас есть датасет размерности (100000000,10) и мы хотим обучить нейросетку. Загрузить в оперативную память такой датасет не получится. Следовательно, нам нужно будет считывать куски с диска. Если в батч мы захотим положить элемент с индексом 1000, то в CSV нам придется пройти все предыдущие 1000 строк (если вы не гуру memory mapping’а). Это очень долго и неэффективно.

Одно из решений перечисленных проблем — хранение данных в формате Hdf (Hierarchical Data Format). В этом посте мы расскажем вам только о нем, а если тема интересна, можно еще погуглить parquet.

Данные в hdf5 хранятся в бинарном формате. Это значит, что 0.0123456789 будет занимать ровно 4 байта. В hdf5 для таблиц есть специальная сущность dataset. Данные в ней хранятся кусками — чанками. В то же время, индексы этих чанков хранятся в B - дереве. Таким образом, у нас получится очень быстро получить доступ к любому чанку. В нашем случае мы возьмем чанк размера (1,10) и сможем очень быстро читать строки.

Можем даже исхитриться и использовать чанк размера (k, 10) и в батч класть данные не по одному элементу, а по k. У нас не будет обычного уровня случайности. Но если k достаточно мало — этим можно пожертвовать в сторону скорости (особенно если bottlneck - чтение с диска)!

Пара интересных фичей hdf5:

1) Сжатие данных (на прикрепленной ниже картинке мы представили пример, во сколько раз может сжать hdf5).

2) Возможность хранения мета-информации. Например, в ней можно хранить описание данных.

3) Возможность хранения нескольких датасетов в одном файле. Например, можно train, test и val хранить в одном файле!

4) А главное, все это поддерживается в pandas! Важно не забыть pip install pytables. Ну а если у вас действительно большие данные, то лучше напрямую работать с h5py.

У читателей может возникнуть вопрос: почему бы не использовать sqlite? Там тоже самое B-дерево, также есть разные типы данных, но еще и доступ произвольный не к чанку, а к элементу… Главная причина — скорость. В большинстве случаев hdf5 просто быстрее. Подробнее можно почитать, например, в этом исследовании.
🔥33👍73🤔1
Self-attention в Computer Vision

Продолжаем серию постов про attention в CV. Ранее мы рассказывали про поканальный механизм внимания, теперь перейдем к пространственному (здесь мы писали про различные типы). В частности, проведем ликбез по Self-Attention, чтобы в следующей части уже перейти к ViT!🚀

Читайте нашу новую статью, чтобы лучше разобраться в attention в CV
🔥31👍54❤‍🔥1
Visual Transformer (ViT)

Вот и кульминация серии постов про attention🚀 Разобрали первый трансформер для изображений ViT. Это очень полезный материал, который поможет вам разобраться в трансформерах.

Прочитав нашу большую статью, вы узнаете/вспомните:
- из каких частей состоит ViT и что делает каждая из них;
- почему в ViT перепутаны слои энкодера; *интрига*
- что такое Multi-Head Self-Attention;
- зачем нужен [cls]-токен;
- чем отличается BatchNorm от LayerNorm.

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

Читайте и делитесь с коллегами, приятного чтения: https://deepschool-pro.notion.site/ViT-a6854b69af4945a89870cfc497654bf1
🔥46👍7❤‍🔥64
Функции активации

#этобаза!👨‍🦳 Даже в знакомых темах можно узнать что-то новое или закрыть пробел в знаниях. В новой статье напоминаем популярные функции активации: их плюсы и минусы, формулы и графики.

Вспомнили:
- зачем нужны активации;
- сигмоиду;
- гиперболический тангенс;
- ReLU, PReLU, Leaky ReLU;
- Swish.

Переходите по ссылке, чтобы прочесть :)
👍51🔥96🍌4
EfficientNet

Продолжаем ликбез по архитектурам! В новой короткой статье рассказываем про семейство EffNet:
- почему EfficientNet получили такое название;
- из чего состоит и как подбирали B0;
- как масштабировали B0 в B1-B7.

Если не знакомы с архитектурой или путались в методе масштабирования EffNet, то читайте статью, поможем разобраться: https://deepschool-pro.notion.site/EfficientNet-edd3125d0f314a24a77376a17072ca56
🔥32👍133🎉2
Unet

Кажется, первое слово, которое ассоциируется с сегментацией у большинства инженеров и ресерчеров – Unet. Возможно, у кого-то уже сложилась похожая ассоциация и с диффузионными моделями. Ведь в них также используются U-образные архитектуры.

Поэтому про Unet важно знать и можно вспоминать 🙂 Мы разобрали архитектуру 2015 года, а также соотнесли ее с современным положением дел. А именно рассказали:
- какая идея кроется за Unet;
- какие решения были до этой архитектуры;
- какие идеи в статье уже не актуальны;
- что можно использовать в качестве upsampling;
- и как можно улучшить результат Unet.

Читайте, чтобы освежить знания и узнать новое: https://deepschool-pro.notion.site/Unet-bf1d734f847e4bfd8d8c795cdfa6bbc6
🔥47👍86
Приходите пообщаться

UPD: Спасибо всем, кто заполнил форму!💙 До конца недели свяжемся с каждым из вас. Собрали достаточное количество ответов, поэтому форму закрыли.


Привет! Меня зовут Тимур, я один из основателей проекта DeepSchool. 2 года назад мы загорелись идеей создать курс повышения квалификации в Computer Vision. Но перед составлением программы решили провести интервью с добровольцами из слака ODS, чтобы понять как принести пользу большему числу людей.

Мы постоянно улучшаем наш курс, и хотим снова сверить наше виденье с сообществом, поэтому предлагаем обмен :) Если вы хотите обсудить вопрос, спросить совет на любую около DL/CV-тему и вам кажется, что разговор с нами вам поможет, приходите пообщаться.

Воспринимайте это как встречу в онлайн-баре с коллегами по цеху🍻 Вопрос может быть любой: "какие курсы изучить" , "на работе однотипные проекты, как развиваться", "как мне, тимлиду, поднять настроение в команде" – что угодно. Мы постараемся вам помочь и подготовимся заранее ко встрече. А взамен позадаем вопросы, которые помогут нам улучшить продукт. На встрече буду я и один человек из нашей команды.

Если вас заинтересовало такое предложение, заполните, пожалуйста, гугл-форму. Не стесняйтесь писать, даже если вопрос кажется вам незначительным. Мы выберем 10 человек с разными проблемами и встретимся в ближайшие 2 недели. Остальным подарим утешительный бонус :) После 30 ответов закроем форму.
🔥27👍2
DeepSchool
Приходите пообщаться UPD: Спасибо всем, кто заполнил форму!💙 До конца недели свяжемся с каждым из вас. Собрали достаточное количество ответов, поэтому форму закрыли. Привет! Меня зовут Тимур, я один из основателей проекта DeepSchool. 2 года назад мы загорелись…
Спасибо всем, кто заполнил форму!💙 До конца недели свяжемся с каждым из вас. Собрали достаточное количество ответов, поэтому форму закрыли.

А теперь продолжаем серию постов про статистику)
7👍1
Сравнение метрик двух моделей

Представьте, что вы обучили две модели и хотите выбрать из них лучшую. На кросс-валидации значения метрик довольно близки друг к другу. Но если усреднить метрику по фолдам, то первая модель лучше — можно ли доверять такому тесту и отдать предпочтение первой модели?

На этот вопрос мы и ответим в новой статье. Из нее вы узнаете:
- можно ли в лоб сравнивать усредненные метрики двух моделей,
- какие есть тесты,
- и в каких случаях можно использовать каждый из них.

Чтобы детальнее разобраться в выборе лучшей модели, читайте нашу новую статью:
https://deepschool-pro.notion.site/73fa46f62c7d44fb8685f1ba6f004496
👍42🤔54🔥4