Pytorch什么时候初始化参数?
When does Pytorch initialize parameters?
我现在正在用 Pytorch 编写自己的网络。我想在我的网络中使用预训练模型。这是我覆盖的 init() 代码:
class Generator(nn.Module):
def __init__(self) -> None:
super(Generator, self).__init__()
model_path = "somedir"
chekpoint = torch.load(model_path)
h_model = H_model()
h_model.load_state_dict(chekpoint['model'])
# 设置为测试模式
h_model.eval()
self.H_model = h_model
self.unet = UNet(enc_chs=(9,64,128,256,512), dec_chs=(512, 256, 128, 64), num_class=3, retain_dim=False, out_sz=(304, 304))
在这里,h_model 是从我训练好的检查点加载的。
我的问题是,初始化后,h_model中的参数是否会改变(预训练参数vaule是否被某个函数修改?)?以及为什么(我的意思是Pytorch在初始化参数时如何处理自定义层?Pytorch何时初始化参数?)
对于基本层(例如,nn.Conv
、nn.Linear
等),参数由层的__init__
方法初始化。
例如,查看 class _ConvNd(Module)
的源代码(所有其他卷积层都源自 class)。在其 __init__
的底部,它调用 self.reset_parameters()
来初始化权重。
因此,如果你的nn.Module
没有任何“独立”nn.Parameter
s,只有子nn.Module
s内的可训练参数,当你构建你的网络时,所有权重子模块在构造子模块时被初始化。
也就是说,一旦您调用 h_model = H_model()
,h_model
的权重就已经初始化为其默认值。调用 h_model.load_state_dict(...)
会将这些值覆盖为所需的 pre-trained 权重。
我现在正在用 Pytorch 编写自己的网络。我想在我的网络中使用预训练模型。这是我覆盖的 init() 代码:
class Generator(nn.Module):
def __init__(self) -> None:
super(Generator, self).__init__()
model_path = "somedir"
chekpoint = torch.load(model_path)
h_model = H_model()
h_model.load_state_dict(chekpoint['model'])
# 设置为测试模式
h_model.eval()
self.H_model = h_model
self.unet = UNet(enc_chs=(9,64,128,256,512), dec_chs=(512, 256, 128, 64), num_class=3, retain_dim=False, out_sz=(304, 304))
在这里,h_model 是从我训练好的检查点加载的。 我的问题是,初始化后,h_model中的参数是否会改变(预训练参数vaule是否被某个函数修改?)?以及为什么(我的意思是Pytorch在初始化参数时如何处理自定义层?Pytorch何时初始化参数?)
对于基本层(例如,nn.Conv
、nn.Linear
等),参数由层的__init__
方法初始化。
例如,查看 class _ConvNd(Module)
的源代码(所有其他卷积层都源自 class)。在其 __init__
的底部,它调用 self.reset_parameters()
来初始化权重。
因此,如果你的nn.Module
没有任何“独立”nn.Parameter
s,只有子nn.Module
s内的可训练参数,当你构建你的网络时,所有权重子模块在构造子模块时被初始化。
也就是说,一旦您调用 h_model = H_model()
,h_model
的权重就已经初始化为其默认值。调用 h_model.load_state_dict(...)
会将这些值覆盖为所需的 pre-trained 权重。