Pull to refresh

Comments 30

train — 19 мая — 17 июля
validation — 18, 19, 20 июля
test — 21, 22, 23 июля

А почему не рандомизация и разбиение в нужном соотношении? Оно же в таком виде получается смещённое по всякой погоде и т. п.

На эту проблему ещё намекает accuracy на validation выше чем на train.

То, что accuracy на train ниже чем на validation — это следствие использования dropout для регуляризации.
  • Идеологически мы как раз и хотим консервативную оценку, то есть смещённую по погоде и всему остальному.
  • Камера делала снимки с высокой частотой, поэтому очень много практически одинаковых картинок, а иметь одинаковые картинки в train/val/test — это плохо. Data Leak => Overfitting
  • А по факту именно для этой задачи как именно разбивать в принципе не важно. Картинки очень похожи друг на друга, любой тип разбиения даёт примерно одинаковое распределение. Мне просто хотелось получить большую точек в том графике, на которому мы сравниваем предсказания с правильным ответом.

Частично как раз интересность в том, что освещение постоянно меняется (и будет меняться как минимум до 22 декабря), поэтому может быть плохо предсказывать "прошлое", обучаясь на данных из "будущего". По крайней мере на простой линейной модели я попадал на эту граблю.

Были бы данные и за осень я бы может и по-другому делил. Чисто случайное разделение мне в этой задаче не нравится. Смежные картинки в train/val/test — это плохо и неправильно.

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

Были б данные за осень — я б не просыпался ночью с мыслью о том, не надо ли online-дообучение доделать к роботу :-)


К сожалению, архивы живут на железках, к которым камеры подключены непосредственно, и канал там довольно слабый — поэтому архивных данных мне не доступно. По сети их не вытянуть, и с HDD не дойти.


Смежные картинки в train/val/test — это плохо и неправильно

Но, кажется, это лучшее, что доступно.

Спасибо за пост. Ради интереса пошел смотреть код для seaborn, но как-то крайне странно он выглядит. Вообще на Python не похоже. Не претендую, впрочем на профессионализм, конечно. Я чисто прикладные вещи пишу для научных задач.
Например, вот софт для анализа гистохимии по фотографиям. Нужно все же попробовать самые простые нейросети. Часто нужно искать сложные структуры на срезах, которые обычной пороговой сегментацией не вытащить.
Хорошая статья, правда мост тут скорее как пример использования, так как задача с мостом вполне решаема без нейросетей средствами OpenCV.
Как-то это нелогично: писать нейронку, изучать theano, юзать сuda, обсчитывать всё на видяхе — никто не будет это делать, когда простые алгоритмы на питоне в несколько строк решат эту задачу быстрее и со схожей точностью.
Хорошо для повышения навыка работы с нейронками, но не для первого изучения — все-таки MNIST гораздо эффективнее и интереснее для этого.

MNIST — скучно. И дело не в том, что я живу в Питере и мне эта боль с разводными мостами близка — я поговорил с товарищем, который учится в ШАДе, он теперь тоже озадачен тем, чтоб найти красивую и не суперсложную задачу из "реального мира", которую можно решить методами машинного обучения :)

Безусловно заморачиваться с установкой библиотек(cuda, theano, keras) и штудировать туториалы по keras чисто для этой задачи с мостами, резона нет. Тем более, что шутдироваться будет как раз примеры по MNIST. И данную задачу я рассмотрел как пример.

Но!
  • Для меня нейронные сети это один из стандартных инструментов и на написание кода, который, собственно, и отвечает за нейронные сети ушло минут 15. А пытаться разбираться с тем как призаки извлекать из изображений вручную, у меня бы ушло гораздо больше времени просто потому, что это не очень знакомая для меня тема(Я знаю теорию, но не использую их на практике по работе или для соревнований на kaggle.com). А у кого-то наоборот, они уже знают эти методы, но не большого опыта разботы с нейронными сетями. Поэтому для кого-то «дёшево и сердито» — это несколько строк на питоне, а для кого-то это вбросить всё в нейронную сеть и дать ей самой разобраться.
  • Если задачу усложнить и дать 20 мостов, для которых изображения с 1000 камер, и камеры ещё и движутся вышеописанный код, практически не изменится, потому что признаки излекаются автоматически. А вот методы, где признаки извлекаются вручную из несколько строк на питоне скорее всего превратятся во что-то большое злое.


В общем под разные задачи — разные инструменты. И в данной задаче можно запросто справится и без нейронных сетей. Да и классический PCA для извлечения признаков с последующим применением SVM тоже скорее всего замечательно сработает.

А как была выбрана именно эта архитектура СNN? И что делает ZeroPadding cлой?
  • ZeroPadding добавляет нули по краям изображения.
  • Какая архитектура для этой задачи будет хорошо работать? => пачка слоёв которые отвечают за извлечение признаков. Часто это бутерброд из ZeroPadding => Convolution => MaxPool, за которыми следует бутерброд из Dense и Dropout, которые по этим извлечённым признакам и пытаются ответить на вопрос(в нашем случае это разведён мост или нет).
  • На практике, я просто взял сеть с которой работал последние пару месяцев, и упростил, утоньшив бутерброды слоёв описанные выше.
замечал несколько раз что онлайн камеры могут не только выключаться, но и смещаться, поворачиваться.

эта сеть находит мост на картинке? или её нужно сразу давать только мост и ничего более?
более простые алгоритмы будут работать на ура

Ох. Спасибо, я б точно не дождался, если б прогон одного цила обучение-валидация занимал 10 минут на GPU (которого у меня нет). Простым задачам — простые решения. :)


Стоит мне, конечно, посмотреть и по этой теме какой-нибудь курс и книжку и освежить понимание топологий, т.к., кажется, тут что-то сложнее MLP. А не только кроп+параметры подбирать на валидации, сидя в обнимку с бокалом сидра и ноутом на коленке =)


Что-то я промазал тредом и написал ответ вместо комментария. Видать, сидр хороший. :)

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

Подход 1:
Скармливать сети необрезанные картинки и дать сети разобраться самой к чему => могут быть проблемы со сходимостью и итоговой точностью. (В этой задаче скорее всего проблем не будет, но надо прверять)

Подход 2, двуступенчатый:
  1. Вручную отметить координаты моста на нескольких картинках.(100+) Для этого есть специальные инстументы, которые этот процесс упрощают.
  2. Натренировать сеть, которая будет находить мост на картинках (Задача локализации)
  3. Натренировать вторую сеть, которая будет классифицировать состояние моста по найденным на предыдущем шаге мостам(Задача классификации)


Какой подход выбрать? Надо пробовать оба. Скорее всего первый будет хорошо работать и заморачиваться на двуступенчатую схему не надо. Хотя бывают задачи, где только второй способ будет давать адекватную точность. Пример: классификация китов по фотографиям с вертолёта, где воды на картинке много, кита мало, все фотографии с различных углов и высот, да и киты статично ну позируют. И ко всему прочему фотографий мало.
потому что камера не работала

Я в телеграмном боте выкидываю jpeg-и, где нет баннера с камеры (видеопоток развалился). Благо, баннер статичный и определяется тривиальной маской.

И даже действительно применив к задаче нейросети, на вопрос из заголовка вы повторяете шутку из статьи darkk? А ведь вопрос размера сети (количества нейронов) действительно интересный и малоосвещённый.
Про один нейрон — это не шутка. Неросеть с одним нейроном это логистическая регрессия. darkk и использовал логистическую регрессию.
То есть оценка снизу — один.

Оценка сверху — чёрт его знает. Сеть с 10^8 нейронами я для этой задачи создать смогу так что она не будет оверфитить. Наверно можно и больше. Но зачем?

Название я выбрал похожее на название поста darkk чтобы подчеркнуть преемственность.
Поправка.

Про оценку сверху не то сказал. Обычно, когда говорят про нейронные сети говорят про число весов — потому, что их количество важно в силу того, что именно они являются свободными параметрами, которые надо натренировать. То есть оценка сверху не 10^8 нейронов, что очень много, а 10^8 весов, что тоже очень много, но осязаемо. Так что в если мерить сложность сеть в нейронах — пусть будет: «Я могу для это задачи нарисовать сеть с 10^4 нейронами и которая не будет на этой задаче оверфитить.» (При большем числе она у меня в пямять GPU не влезет.)
Логистическая регрессия не составляла всё решение, поэтому ни вопрос, ни ответ там не мог быть серьёзным. Возможно, и без Canny взвешенной суммы пикселей как-то хватило бы, вот тогда была бы нижняя оценка, но мы этого пока не знаем.
Спасибо. Это я не учёл. На неделе дойдут руки и я проверю как логистическая регрессия будет работать на самих изображениях, без Canny.
UFO just landed and posted this here
И использую python. Есть актуальные библиотеки под R, C++

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

Но вообще это не очень важно. При работе с нейронными сетями задача не как код под это дело написать, а как задачу поставить, как данные подготовить, какую архитектуру сети и функцию потерь выбрать и как именно тренировать — а это общие задачи, которые от языка хоть и зависят, но не сильно.
UFO just landed and posted this here
UFO just landed and posted this here
Если начинающий — тогда однозначно python с библиотекой Keras. Море туториалов, грамотная документация, человеческий интерфейс, активно развивается и замечательно работет из коробки.
UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.

Articles