在 pytorch 中修改预训练模型时,旧的权重会重新初始化吗?

Posted

技术标签:

【中文标题】在 pytorch 中修改预训练模型时,旧的权重会重新初始化吗?【英文标题】:When modifying a pre-trained model in pytorch, does the old weight get re-initialized? 【发布时间】:2021-10-02 20:25:16 【问题描述】:

我正在 pytorch 中修改一个预训练的高效网络模型。我正在按顺序执行以下操作:

    创建默认模型,加载 imagenet 权重。

    然后,改变第一层的通道数,删除几层,增加几层。

from efficientnet_pytorch import EfficientNet
from efficientnet_pytorch.utils import Conv2dStaticSamePadding

PATH = "../input/efficientnet-pytorch/efficientnet-b0-08094119.pth"
model = EfficientNet.from_name('efficientnet-b0')
model.load_state_dict(torch.load(PATH))

# augment model with 4 channels

model._conv_stem = Conv2dStaticSamePadding(4, 32, kernel_size = (3,3), stride = (2,2), 
                                                             bias = False, image_size = 512)

model._fc = torch.nn.Linear(in_features=1280, out_features=2, bias=True)

我的问题是:我加载的原始砝码会怎样?它会在那里还是所有模型都会被随机初始化?

【问题讨论】:

【参考方案1】:

如果您正在重新定义某些层,您似乎正在使用 model._conv_stemmodel._fc。然后,是的,这些将被随机初始化,这意味着加载的权重将不再用于这些层。模型的其余部分当然会保持不变,并将使用加载的权重。

【讨论】:

以上是关于在 pytorch 中修改预训练模型时,旧的权重会重新初始化吗?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch自定义加载预训练权重

Pytorch修改ResNet模型全连接层进行直接训练

如何加载部分预训练的 pytorch 模型?

如何使用 Pytorch 中的预训练权重修改具有 4 个通道作为输入的 resnet 50?

如何从 python 中的预训练模型中获取权重并在 tensorflow 中使用它?

为啥新层在修改后的预训练 pytorch 模型中被忽略?