通过flag_struct来判断数据类型的,但是不知道在哪里有对应的代码,为啥要这么做可以判断数据类型。。
union
{
struct
{
unsigned char f0;
unsigned char f1;
unsigned char f2;
unsigned char f3;
};
unsigned int tag;
} flag_struct;
nread = d->dr.read(&flag_struct, sizeof(flag_struct));
if (nread != sizeof(flag_struct))
{
NCNN_LOGE("ModelBin read flag_struct failed %zd", nread);
return Mat();
}
unsigned int flag = flag_struct.f0 + flag_struct.f1 + flag_struct.f2 + flag_struct.f3;
if (flag_struct.tag == 0x01306B47)
猜测:
- 量化模型之后,在写入每个预训练权重的时候,会在权重参数的最前面插入4个字节的
flag_struct
实际
这里在写入每个data的时候,会首先写入一个tag
int ModelWriter::fwrite_weight_tag_data(const ncnn::Mat& data, FILE* bp, float a, float b)
{
int p0 = ftell(bp);
ncnn::Mat data_flattened = data.reshape(data.w * data.h * data.c);
if (gen_random_weight)
Randomize(data_flattened, a, b);
if (data_flattened.elemsize == 4)
{
if (storage_type == 1)
{
const int tag = 0x01306B47; // fp16 magic
fwrite(&tag, sizeof(int), 1, bp);
ncnn::Mat data_flattened_fp16;
ncnn::cast_float32_to_float16(data_flattened, data_flattened_fp16);
fwrite(data_flattened_fp16.data, data_flattened_fp16.elemsize, data_flattened_fp16.w, bp);
}
else
{
const int tag = 0; // fp32 magic
fwrite(&tag, sizeof(int), 1, bp);
replace_denormals_with_zero(data_flattened, data_flattened.w);
fwrite(data_flattened.data, data_flattened.elemsize, data_flattened.w, bp);
}
}