ResNet18推理踩坑记录
本文记录了将pytorch的resnet18预训练模型使用C进行前向推理的踩坑过程,主要工作是对接软件部分训练出来的浮点权重,使用C模拟网络的运行情况,并做16位均匀量化。
一.单独读取权重文件数据:局部变量过大导致程序崩溃
分析:
二进制文件读写的代码中使用了函数内的数组作为存储的缓冲区,属于局部变量,存放在栈上,
而栈的默认大小为1M,若定义过大的局部变量则会导致栈溢出,
后果包括但不限于程序崩溃,无关变量被改写等。
解决办法:
1.增大栈大小。
2.使用堆内存。
3.使用静态区内存【全局变量或者静态变量】。
综上所述,当读取的数据较多时,用于存储的buffer应该定义为全局!
二.权重文件的一些事
1.权重文件里有什么
该文件里存放着所有训练好的网络数据,根据不同网络稍有不同。以resnet为例,网络中包括CONV,BN,FC等操作,文件中则包含了CONV层的卷积核权重,BN的四个参数(均值,方差,γ,β),FC层的卷积核权重与偏置。
ps:采用bn的网络中,卷积层的输出并不加偏置
如何知道文件中具体有什么数据?这就涉及到权重文件的生成。
2.权重文件的生成
以pytorch的预训练模型为例,下载的.pth文件并不能在