这是使用ptflops测试得到的FLOPS和参数量
FLOPS: 128.69 GMac
Parameters: 4.38 M
这是使用thop的profile测试得到的FLOPS和参数量
FLOPS: 128.40 GFLOPS
Parameters: 216.40 M
二者计算出的模型参数量差异较大的原因可能在于:
-
计算方式的不同:
ptflops
可能只计算了模型中可训练参数的数量(requires_grad=True
的参数),这意味着冻结的模型部分(如已冻结的编码器self.encoder
)的参数未包含在统计中。因此,冻结的参数不会影响ptflops
统计的参数量。thop
通常会统计整个模型的参数量,不论是否可训练。因此冻结的编码器参数也会被包含在统计中,从而导致统计出的参数量大大增加。
-
冻结部分的编码器:
在您的代码中,SAM2UNet
的编码器self.encoder
是加载的预训练模型,并且所有权重已冻结。ptflops
可能在计算时自动排除了该部分,而thop
则会将整个模型的参数统计在内,无论这些参数是否被冻结。 -
库的计算标准不同:
两个库在统计 FLOPS 和参数量时,可能遵循不同的实现方式或标准。例如,ptflops
的统计方式可能更专注于可训练参数,而thop
更关注完整模型的结构,因此导致差异。
解决方法
为了确保两者计算出一致的参数量,可以使用一致的计算方式,例如,确保 编码器的冻结部分被统计或不被统计,具体方法是将模型中的冻结参数设置为不包含在统计内,或者将 thop
中冻结的参数排除。