在pytorch中,我想使用预先训练的模型并训练我的模型来向模型结果中添加一个增量,即:
╭----- (pretrained model) ------ result ---╮
input------------- (my model) --------- Δresult --+-- final_result
以下是我所做的:
load_state_dict
加载预训练模型的参数requires_grad = False
但经过训练后,当我检查result
(预训练模型的输出)时,发现它与原始预训练模型的输出不匹配。我仔细比较了预训练模型的参数,唯一的变化是BatchNorm2d
的running_mean
、running_var
和num_batches_tracked
(因为我设置了所有预训练模型的参数requires_grad = False
),当我将这三个参数改为原始的参数时,result
匹配原始预训练模型的输出。
我不想改变预先训练过的模式。那么有什么方法可以修复running_mean
、running_var
和num_batches_tracked
呢?
发布于 2021-12-07 23:11:39
我偶然发现了同样的问题,因此我调整了这个回购中的上下文管理器,如下所示:
@contextlib.contextmanager
def _disable_tracking_bn_stats(self):
def switch_attr():
if not hasattr(self, 'running_stats_modules'):
self.running_stats_modules = \
[mod for n, mod in self.model.named_modules() if
hasattr(mod, 'track_running_stats')]
for mod in self.running_stats_modules:
mod.track_running_stats ^= True
switch_attr()
yield
switch_attr()
作为另一种选择,我认为通过在eval
模块上调用BatchNorm可以获得类似的结果:
for layer in net.modules():
if isinstance(layer, BatchNorm2d):
layer.eval()
虽然第一种方法更有原则。
https://stackoverflow.com/questions/70259900
复制相似问题