У вас есть два варианта:
- Использовать предварительно обученные веса для всего детектора (бэкэнд + внешний интерфейс, т.е. сеть классификации + детектор).
- Использовать предварительно обученный только для бэкэнда.
Все объяснено ниже https://github.com/experiencor/keras-yolo2#2 -edit-the-config-file по указанной вами ссылке.
В код, загрузка предварительно обученных весов для всей модели производится здесь . Это необязательно.
Предварительно обученные веса для бэкэнда обязательны (в соответствии с руководством), в коде это делается здесь (пример для полного Yolo). Обратите внимание, что вы должны были загрузить веса бэкэнда перед созданием модели, как указано в учебном пособии или в начале файла .
Редактировать 1
Если ваше число При изменении классов количество фильтров в части детектора (входной интерфейс) будет меняться при изменении размера вектора классификации. Однако бэкэнд (экстрактор функций, то есть магистраль) остается прежним, даже если количество классов меняется.
Вы можете использовать предварительно обученные любые предварительно обученные веса, которые соответствуют размеру для магистрали, но для всей сети вы не можете, если количество классов варьируется. Например, вы не можете использовать веса Racoon для детектора собак и кошек.
Вы не можете использовать исходные веса YoloV2 для инициализации этой сети, потому что формат отличается между Dar knet и Keras, сначала вы должны перевести их в формат Keras.
Хорошо, если у вас достаточно тренировочных данных, можно использовать только предварительно обученные веса для магистралей.
Обратите внимание, что существует дополнительная опция, называемая трансферным обучением. Если у вас есть предварительно обученные сети (магистраль и интерфейс), вы можете извлечь веса магистрали и использовать их для инициализации магистрали сети.
Редактировать 2
Нет, интерфейс и Бэкэнд не является строго говоря двумя отдельными сетями: это две сети. Фактически в большинстве сред глубокого обучения, таких как PyTorch, Keras или Tensorflow, любой слой можно рассматривать как сеть (Fully Connected, Convolutive, MaxPool, ...).
«Сети» - это просто объект которая представляет собой произвольную сложную математическую функцию, отображающую входы на выходы, к которым может применяться дифференцирование Automati c (необходимо определить прямое и обратное распространение).
В детекторе объекта одиночного выстрела, таком как Yolo, это более актуально для воспринимайте всю сеть как цепочку из двух сетей: магистраль и детектор . Это представление позволяет использовать более обобщенную c конструкцию и более широкий спектр настроек (т. Е. Использовать более производительную магистраль или облегченную).
Да, вы правы, регрессия ограничивающего прямоугольника и классификация меток произошли в самом конце целых сетей, следовательно, во внешнем интерфейсе.
Внешний интерфейс может иметь произвольное количество уровней, единственным ограничением является его последний уровень, который должен соответствовать указанному c размеру канала (т.е. заданное количество фильтров), которое всегда ограничено количеством классов, которые вы хотите классифицировать.
Обычно количество каналов в последнем выходном слое должно быть numberOfClasses + 4
, где numberOfClasses
включает класс фона и где число 4 представляет четыре координаты ограничительной рамки. Этот пример сильно упрощен, я советую вам прочитать статьи Йоло, чтобы лучше понять структуру сети.
Похоже, что существует только один обучаемый слой (2D Conv здесь ) в сети детекторов. Обратите внимание на размер вывода, который ограничен числом классов: self.nb_box * (4 + 1 + self.nb_class)
.
Затем параметры этого слоя инициализируются со случайным распределением.
Что касается вашего последнего вопроса, я думаю, что вы исправить порядок переноса обучения, который должен работать.