Я пытаюсь эффективно преобразовать модель 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) при выборе якорей?