pretrained=True的底层逻辑:
1. pretrained=True的真正作用
当你调用resnet50(pretrained=True)时,torchvision的源码里会做两件事:
- 第一步:初始化一个空的 ResNet50 模型结构;
- 第二步:自动调用
model_zoo.load_url(model_urls['resnet50'])------ 也就是去下载官方权重文件,并加载到模型中。
这就是为什么只要设pretrained=True就会触发下载 ------ 这是torchvision内置的逻辑,和你后续手动加载本地权重无关,哪怕你手动加载了,pretrained=True还是会先触发下载流程。
2. 改成pretrained=False的影响
把pretrained=True改成pretrained=False,仅会关闭 "自动下载 + 自动加载官方权重" 这一步,不会影响模型本身的结构,也不会影响你后续手动加载本地权重的操作。
简单说:
pretrained=True:模型结构 + 自动下载并加载官方权重;pretrained=False:仅初始化模型结构(空参数),但你后续手动加载了本地的官方权重,最终模型的参数和pretrained=True是完全一样的,不会影响项目其他部分。
如果不改False,哪怕你写了加载本地权重的代码,程序还是会先去尝试下载官方权重(这就是你之前遇到下载中断的原因),下载失败后才会执行你后续的代码(甚至可能直接报错终止,根本走不到你加载本地权重的步骤)。