YOLOv3 的加载权重 Object-detection-with-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()
最佳答案
它正在解析权重文件,该文件以 Darknet framework 使用的格式保存(source code)。据我所知,在实际框架代码之外的任何地方都没有正式指定这种格式。相关部分在文件中 src/parser.c
, 函数 save_weights_upto
和 load_weights_upto
.您可能会说,那段 Python 代码似乎是相应 C 代码的直接翻译。
看起来文件格式以三个32位整数开头(虽然C代码使用了sizeof(int)
,不一定是32位,但随便)对应于major,文件格式版本的次要和修订值。然后是网络的 seen
属性,根据文件版本,它可以是 int
或 size_t
,通常表示 32 位或 64 位。然后,transpose
是一个 bool 值,取决于主要版本和次要版本是否大于 1000。主要、次要和修订字段的用法至少可以说是非正统的。
在 Python 代码中,既没有使用 seen
也没有使用 transpose
。 transpose
被读入一个变量,但是那个变量没有被使用。不过理论上应该如此。我想代码适用于帖子中链接的文件,但如果 transpose
恰好为真,则权重的加载应该不同,如您在 load_connected_weights
中所见。 .
无论如何,所有这些都是与该示例中使用的 Darknet 文件格式相关的非常具体的问题。除非您想明确兼容来自 Darknet 模型的多个不同权重文件,否则您可能不需要过多担心该代码,只要它适用于该情况即可。
关于python-3.x - 主要,次要,修订,转置在tensorflow中加载权重是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60563246/