Как работает реализация Tensorflow MobileNetV1 SSD Coco - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь эффективно преобразовать модель Tensorflow ssd_mobilenet_v1_coco в модель PyTorch, поэтому я получил все слои тензорного потока и сопоставил их со слоями предопределенного класса MobileNetV1_SSD.

Класс был взят из https://github.com/qfgaohao/pytorch-ssd и относился к стандартной архитектуре SSD MobileNetV1, определенной в официальном документе.Проблема в том, что когда я отображал слои из TF в PyTorch, у меня возникали некоторые несоответствия размеров слоев, например, если были некоторые изменения по сравнению с исходной архитектурой.Приспосабливая класс в соответствии с загруженной моделью, я получил это:

extras = ModuleList([
    Sequential(
        Conv2d(in_channels=1024, out_channels=256, kernel_size=1),
        ReLU(),
        Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=2, padding=1),
        ReLU()
    ),
    Sequential(
        Conv2d(in_channels=512, out_channels=128,kernel_size=1),
        ReLU(),
        Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, padding=1),
        ReLU()
    ),
    Sequential(
        Conv2d(in_channels=256, out_channels=128, kernel_size=1),
        ReLU(),
        Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, padding=1),
        ReLU()
    ),
    Sequential(
        Conv2d(in_channels=256, out_channels=64, kernel_size=1),
        ReLU(),
        Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2, padding=1),
        ReLU()
    )
])

regression_headers = ModuleList([
    Conv2d(in_channels=512, out_channels=3 * 4, kernel_size=1, padding=1),
    Conv2d(in_channels=1024, out_channels=6 * 4, kernel_size=1, padding=1),
    Conv2d(in_channels=512, out_channels=6 * 4, kernel_size=1, padding=1),
    Conv2d(in_channels=256, out_channels=6 * 4, kernel_size=1, padding=1),
    Conv2d(in_channels=256, out_channels=6 * 4, kernel_size=1, padding=1),
    Conv2d(in_channels=128, out_channels=6 * 4, kernel_size=1, padding=1), 
])

classification_headers = ModuleList([
    Conv2d(in_channels=512, out_channels=3 * num_classes, kernel_size=1, padding=1),
    Conv2d(in_channels=1024, out_channels=6 * num_classes, kernel_size=1, padding=1),
    Conv2d(in_channels=512, out_channels=6 * num_classes, kernel_size=1, padding=1),
    Conv2d(in_channels=256, out_channels=6 * num_classes, kernel_size=1, padding=1),
    Conv2d(in_channels=256, out_channels=6 * num_classes, kernel_size=1, padding=1),
    Conv2d(in_channels=128, out_channels=6 * num_classes, kernel_size=1, padding=1),
])

OK : перевод между моделями не дает мне ошибок

FAIL : У меня просто проблема, когда мне нужно оценить модель PyTorch, потому что размеры ядра и некоторые in_channels и out_channels в extras / классификация / регрессия не соответствуют исходным спецификациям архитектуры

RuntimeError: Размертензор a (2781) должен соответствовать размеру тензора b (3000) при не синглетонном измерении 1

ВОПРОС Кто-нибудь знает что-то о том, как разработчики Tensorflow реализовали эту модель?Так как же они справились с уменьшением вывода в первом слое (с 6 * num_classes до 3 * num_classes) при выборе якорей?

...