Что означает мажор, минор, ревизия, транспонирование в весах нагрузки в тензорном потоке? - PullRequest
2 голосов
/ 06 марта 2020

Веса загрузки YOLOv3 Обнаружение объекта с помощью yolov3-in-keras

Может кто-нибудь сказать, что здесь происходит с весами загрузки и значением выражения транспонирования

with open(weight_file, 'rb') as w_f:
        major,  = struct.unpack('i', w_f.read(4))
        minor,  = struct.unpack('i', w_f.read(4))
        revision, = struct.unpack('i', w_f.read(4))
        if (major*10 + minor) >= 2 and major < 1000 and minor < 1000:
            w_f.read(8)
        else:
            w_f.read(4)
        transpose = (major > 1000) or (minor > 1000)
        binary = w_f.read() 

1 Ответ

1 голос
/ 06 марта 2020

Это файл весов, который сохраняется в формате, используемом Dar knet framework ( исходный код ). Насколько я могу судить, этот формат формально не указан нигде, кроме реального кода платформы. Соответствующие части находятся в файле src/parser.c, функции save_weights_upto и load_weights_upto. Как вы, вероятно, можете сказать, этот фрагмент кода Python, кажется, является прямым переводом соответствующего кода C.

Казалось бы, формат файла начинается с трех 32-битных целых чисел (хотя В коде C используется sizeof(int), который не обязательно является 32-битным, но каким бы то ни было), соответствующим основным, второстепенным и ревизионным значениям версии формата файла. Затем следует атрибут seen для сети, который в зависимости от версии файла может быть int или size_t, что обычно означает 32 или 64 бита. Тогда transpose - это логическое значение, зависящее от того, являются ли старшая и младшая версии больше 1000. Использование полей major, minor и revision, по меньшей мере, неортодоксально.

В Python код, ни seen, ни transpose не используются. transpose считывается в переменную, но эта переменная не используется. Теоретически так и должно быть. Я предполагаю, что код работает для файла, на который есть ссылка в посте, но если transpose оказалось правдой, загрузка весов должна быть другой, как вы можете видеть в load_connected_weights.

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

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