Comments 30
train — 19 мая — 17 июля
validation — 18, 19, 20 июля
test — 21, 22, 23 июля
А почему не рандомизация и разбиение в нужном соотношении? Оно же в таком виде получается смещённое по всякой погоде и т. п.
На эту проблему ещё намекает accuracy на validation выше чем на train.
- Идеологически мы как раз и хотим консервативную оценку, то есть смещённую по погоде и всему остальному.
- Камера делала снимки с высокой частотой, поэтому очень много практически одинаковых картинок, а иметь одинаковые картинки в train/val/test — это плохо. Data Leak => Overfitting
- А по факту именно для этой задачи как именно разбивать в принципе не важно. Картинки очень похожи друг на друга, любой тип разбиения даёт примерно одинаковое распределение. Мне просто хотелось получить большую точек в том графике, на которому мы сравниваем предсказания с правильным ответом.
Частично как раз интересность в том, что освещение постоянно меняется (и будет меняться как минимум до 22 декабря), поэтому может быть плохо предсказывать "прошлое", обучаясь на данных из "будущего". По крайней мере на простой линейной модели я попадал на эту граблю.
Скорее всего делил бы по дням. Не последовательно, как в посте, а случайным образом.
Были б данные за осень — я б не просыпался ночью с мыслью о том, не надо ли online-дообучение доделать к роботу :-)
К сожалению, архивы живут на железках, к которым камеры подключены непосредственно, и канал там довольно слабый — поэтому архивных данных мне не доступно. По сети их не вытянуть, и с HDD не дойти.
Смежные картинки в train/val/test — это плохо и неправильно
Но, кажется, это лучшее, что доступно.
Например, вот софт для анализа гистохимии по фотографиям. Нужно все же попробовать самые простые нейросети. Часто нужно искать сложные структуры на срезах, которые обычной пороговой сегментацией не вытащить.
Хорошо для повышения навыка работы с нейронками, но не для первого изучения — все-таки MNIST гораздо эффективнее и интереснее для этого.
MNIST — скучно. И дело не в том, что я живу в Питере и мне эта боль с разводными мостами близка — я поговорил с товарищем, который учится в ШАДе, он теперь тоже озадачен тем, чтоб найти красивую и не суперсложную задачу из "реального мира", которую можно решить методами машинного обучения :)
Но!
- Для меня нейронные сети это один из стандартных инструментов и на написание кода, который, собственно, и отвечает за нейронные сети ушло минут 15. А пытаться разбираться с тем как призаки извлекать из изображений вручную, у меня бы ушло гораздо больше времени просто потому, что это не очень знакомая для меня тема(Я знаю теорию, но не использую их на практике по работе или для соревнований на kaggle.com). А у кого-то наоборот, они уже знают эти методы, но не большого опыта разботы с нейронными сетями. Поэтому для кого-то «дёшево и сердито» — это несколько строк на питоне, а для кого-то это вбросить всё в нейронную сеть и дать ей самой разобраться.
- Если задачу усложнить и дать 20 мостов, для которых изображения с 1000 камер, и камеры ещё и движутся вышеописанный код, практически не изменится, потому что признаки излекаются автоматически. А вот методы, где признаки извлекаются вручную из несколько строк на питоне скорее всего превратятся во что-то большое злое.
В общем под разные задачи — разные инструменты. И в данной задаче можно запросто справится и без нейронных сетей. Да и классический PCA для извлечения признаков с последующим применением SVM тоже скорее всего замечательно сработает.
- ZeroPadding добавляет нули по краям изображения.
- Какая архитектура для этой задачи будет хорошо работать? => пачка слоёв которые отвечают за извлечение признаков. Часто это бутерброд из ZeroPadding => Convolution => MaxPool, за которыми следует бутерброд из Dense и Dropout, которые по этим извлечённым признакам и пытаются ответить на вопрос(в нашем случае это разведён мост или нет).
- На практике, я просто взял сеть с которой работал последние пару месяцев, и упростил, утоньшив бутерброды слоёв описанные выше.
эта сеть находит мост на картинке? или её нужно сразу давать только мост и ничего более?
более простые алгоритмы будут работать на ура
Ох. Спасибо, я б точно не дождался, если б прогон одного цила обучение-валидация занимал 10 минут на GPU (которого у меня нет). Простым задачам — простые решения. :)
Стоит мне, конечно, посмотреть и по этой теме какой-нибудь курс и книжку и освежить понимание топологий, т.к., кажется, тут что-то сложнее MLP. А не только кроп+параметры подбирать на валидации, сидя в обнимку с бокалом сидра и ноутом на коленке =)
Что-то я промазал тредом и написал ответ вместо комментария. Видать, сидр хороший. :)
Подход 1:
Скармливать сети необрезанные картинки и дать сети разобраться самой к чему => могут быть проблемы со сходимостью и итоговой точностью. (В этой задаче скорее всего проблем не будет, но надо прверять)
Подход 2, двуступенчатый:
- Вручную отметить координаты моста на нескольких картинках.(100+) Для этого есть специальные инстументы, которые этот процесс упрощают.
- Натренировать сеть, которая будет находить мост на картинках (Задача локализации)
- Натренировать вторую сеть, которая будет классифицировать состояние моста по найденным на предыдущем шаге мостам(Задача классификации)
Какой подход выбрать? Надо пробовать оба. Скорее всего первый будет хорошо работать и заморачиваться на двуступенчатую схему не надо. Хотя бывают задачи, где только второй способ будет давать адекватную точность. Пример: классификация китов по фотографиям с вертолёта, где воды на картинке много, кита мало, все фотографии с различных углов и высот, да и киты статично ну позируют. И ко всему прочему фотографий мало.
потому что камера не работала
Я в телеграмном боте выкидываю jpeg-и, где нет баннера с камеры (видеопоток развалился). Благо, баннер статичный и определяется тривиальной маской.
То есть оценка снизу — один.
Оценка сверху — чёрт его знает. Сеть с 10^8 нейронами я для этой задачи создать смогу так что она не будет оверфитить. Наверно можно и больше. Но зачем?
Название я выбрал похожее на название поста darkk чтобы подчеркнуть преемственность.
Про оценку сверху не то сказал. Обычно, когда говорят про нейронные сети говорят про число весов — потому, что их количество важно в силу того, что именно они являются свободными параметрами, которые надо натренировать. То есть оценка сверху не 10^8 нейронов, что очень много, а 10^8 весов, что тоже очень много, но осязаемо. Так что в если мерить сложность сеть в нейронах — пусть будет: «Я могу для это задачи нарисовать сеть с 10^4 нейронами и которая не будет на этой задаче оверфитить.» (При большем числе она у меня в пямять GPU не влезет.)
В перспективе знаю, но пусть будет python, потому что у всех основных библиотек кроме Torch, есть его поддержка.
Но вообще это не очень важно. При работе с нейронными сетями задача не как код под это дело написать, а как задачу поставить, как данные подготовить, какую архитектуру сети и функцию потерь выбрать и как именно тренировать — а это общие задачи, которые от языка хоть и зависят, но не сильно.
Сколько нужно нейронов, чтобы узнать, разведён ли мост Александра Невского?