关于pytorch转darknet,各种模型转darknet后没有结果的分析

文章详细阐述了Darknet在加载权重文件时,如何根据前三个int型数值(major,minor,revision)判断第四数值的类型,如果是uint64_t则表示训练过程已更新。转换模型到Darknet时,可以设定前三个数值为0,2,0来确保正确解析权重。代码示例展示了这一过程。
  • 在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){
  • 这里讲了darknet自己保存模型的情况
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值