Как работает тренировка по обнаружению объектов при обратном распространении?

Я использую tenorflow для обучения модели f-rcnn inception v2.

Допустим, у меня есть 6000 изображений:

  • от 1 до 3000: на каждом изображении есть и собака, и кошка, но я пометил только собаку.

  • от img 3001 до 6000: на каждом изображении есть и собака, и кошка, но я пометил только кошку.

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

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

Мои вопросы:

  1. Влияет ли порядок изображений на результат? Изменится ли это, если я сначала создам набор данных с собаками, а затем с кошками? Будет ли это иначе, если я перетасую данные, чтобы смешать кошек и собак?

  2. При обратном распространении влияет ли на результат тот факт, что я не пометил кошек, а пометил собаку и наоборот? Модель не обучена, потому что у меня есть собаки и кошки без маркировки? Получу ли я такой же результат, как при наличии 3000 изображений с пометкой как собаки, так и кошки для каждого изображения?

  3. Причина, по которой я не обозначаю как собак, так и кошек на каждом изображении, заключается в том, что у меня есть изображения фиксированной камеры, где иногда вы видите, как разные собаки или одна и та же собака движутся вокруг, когда кошка спит. Поэтому каждый раз помечать спящего кота будет означать наличие одного и того же изображения на входе несколько раз. (и, конечно, это занимает много времени для маркировки). Как я мог решить это? Должен ли я обрезать изображение перед созданием набора данных? Достаточно ли хорошо, если я создаю набор данных eval, в котором на каждом изображении помечены как собаки, так и кошки, а также набор данных поезда, где у меня есть только метка объекта (собаки), а не кошка?

Спасибо

1 ответ

Решение

1- Да, порядок изображений влияет на результат [1], и, что более важно, он влияет на скорость, с которой ваш алгоритм будет учиться. По сути, ваш алгоритм пытается выучить конфигурацию весов, которые минимизируют вашу функцию потерь для всех примеров, которые вы ей показываете. Это достигается путем размещения этих весов в конфигурации, которая обнаруживает те особенности в данных, которые различают кошек и собак. Но он делает это только с учетом одной партии входов за раз. Каждое изображение в пакете рассматривается индивидуально, и подпорка решает, как следует изменить вес, чтобы алгоритм лучше обнаруживал кошку / собаку на этом изображении. Затем он усредняет все эти изменения для каждого изображения в пакете и выполняет эту настройку.

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

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

С точки зрения общего результата: во время тренировочного процесса вы по существу пересекаете многомерное пространство оптимизации, следуя его градиенту, пока конфигурация весов не достигнет локального минимума в этом пространстве, из которого величина барьера для преодоления превышает допустимую. по вашей скорости обучения. Отображение одного класса, а затем другого приведет к более извилистому пути к глобальному минимуму и, таким образом, увеличит вероятность застрять в неоптимальном локальном минимуме. [2]


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

  • Удваивает размер вашего набора данных (больше данных = лучшие результаты).
  • Предотвращает ложное наказание модели за точное обнаружение собаки на изображениях, где вы не пометили собаку.
  • Предотвращает алгоритм от обнаружения несвязанных функций на изображениях.

Удвоение размера вашего набора данных хорошо по очевидным причинам. Но показывая входные данные, которые содержат собаку, без маркировки этой собаки, вы по сути говорите своему алгоритму, что на этом изображении нет собаки [3]. Что является ложным. Вы, по сути, меняете шаблоны, которые вы просите, чтобы алгоритм обнаруживал, из тех, которые могут отделить кошку / собаку от без кошки / собаки и кошку против собаки, от которой можно отделить помеченных собак от немаркированных собак, которые не являются полезными функциями. для вашей задачи.

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


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

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

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

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


TLDR:

  • 1 ДА, перемешайте их.
  • 2 ДА, маркируйте их всех.
  • 3 Получите лучшие данные. Или: предварительная подготовка, упорядочение и приумножение данных.

[1] Это зависит от размера пакетов, в которые вы вводите свои данные в модель.

[2] Это основано на моей собственной интуиции, и я рад, что меня здесь исправили.

[3] Это в некоторой степени зависит от того, как ваша функция потерь обрабатывает изображения, в которых нет собаки.

Другие вопросы по тегам