Как сбросить классы при сохранении весов, специфичных для класса, в TensorFlow Object Detection API - PullRequest
2 голосов
/ 12 апреля 2019

В настоящее время я использую API обнаружения объектов TensorFlow и пытаюсь настроить предварительно обученный Faster-RCNN из модельного зоопарка.В настоящее время, если я выберу количество классов, отличное от числа, используемого в исходной сети, оно просто не будет инициализировать веса и смещения из SecondStageBoxPredictor/ClassPredictor, поскольку теперь оно имеет размеры, отличные от исходного ClassPredictor.Однако, поскольку все классы, на которых я хотел бы обучить сеть, являются классами, которые исходная сеть была обучена идентифицировать, я хотел бы сохранить веса и смещения, связанные с классами, которые я хочу использовать в SecondStageBoxPredictor/ClassPredictor, и обрезать вседругие, а не просто инициализируют эти значения с нуля (похоже на поведение этой функции ).

Возможно ли это, и если да, то как мне изменить структуру этого слоя в Оценщике?

nb Этот вопрос задает аналогичную вещь, иих ответ - игнорировать нерелевантные классы из выходных данных сети - однако в этой ситуации я пытаюсь настроить сеть и предполагаю, что наличие этих избыточных классов усложнит процесс обучения / оценки?

1 Ответ

1 голос
/ 12 апреля 2019

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

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

fine_tune_checkpoint_type: 'detection'
load_all_detection_checkpoint_vars: True

в поле train_config из файла конфигурации конвейера.

Наконец, глядя на график вычислений, можно увидеть, что форма SecondStageBoxPredictor/ClassPredictor/weights зависит от количества выходных классов. enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...