- 在src/parser.c的load_weights_upto函数中可以看出darknet在加载权重前会先读取4个数值。
- 前3个分别是int型的major,minor,revision,如果(major * 10 + minor) >= 2,第四个数值会按照uint64_t读取,否则按照uint32_t读取。
- 因此,在转darknet时,如果前三个数值都是0的话,第四个数值是uint32_t类型,即在权重之前写入4个int32。
- 一般用darknet训练得到的模型(major * 10 + minor) >= 2,所以在转darknet时,我们可以令前三个数值分别是0,2,0,第四个数值是uint64_t类型,即在权重之前写入5个int32。
- 代码如下:
fprintf(stderr, "Loading weights from %s...", filename);
fflush(stdout);
FILE *fp = fopen(filename, "rb");
if(!fp) file_error(filename);
int major;
int minor;
int revision;
fread(&major, sizeof(int), 1, fp);
fread(&minor, sizeof(int), 1, fp);
fread(&revision, sizeof(int), 1, fp);
if ((major * 10 + minor) >= 2) {
printf("\n seen 64");
uint64_t iseen = 0;
fread(&iseen, sizeof(uint64_t), 1, fp);
*net->seen = iseen;
}
else {
printf("\n seen 32");
uint32_t iseen = 0;
fread(&iseen, sizeof(uint32_t), 1, fp);
*net->seen = iseen;
}
*net->cur_iteration = get_current_batch(*net);
printf(", trained: %.0f K-images (%.0f Kilo-batches_64) \n", (float)(*net->seen / 1000), (float)(*net->seen / 64000));
int transpose = (major > 1000) || (minor > 1000);
int i;
for(i = 0; i < net->n && i < cutoff; ++i){