智能数字图像处理:ResNet代码(pytorch)之model.py解读

本文详细解读了ResNet模型的pytorch代码,包括卷积、批量归一化、ReLU激活、下采样等关键部分,以及18、34、50、101、152层结构的构建过程。通过迁移学习,ResNet利用残差块解决了深层网络中梯度消失的问题,允许网络变得更深。

涉及到迁移学习:

 

 1.self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel, kernel_size=3, stride=stride, padding=1, bias=False)-》第一层输入通道数和输出通道数由调用函数传参决定。

2.self.bn1 = nn.BatchNorm2d(out_channel)-》卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定。

3.self.relu = nn.ReLU()-》进行一次激活。

4.self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,kernel_size=3, stride=1, padding=1, bias=False)-》再进行一次卷积,stride=1则不改变输入 图像的大小。

5.self.bn2 = nn.BatchNorm2d(out_channel)-》归一化。

6. self.downsample = downsample-》定义下采样方法,默认为None。

前向传播模块:

1.if self.downsample is not None:
            identity = self.downsample(x)-》》判断下采样不是None则对输入矩阵进行下采样。

2.然后进行卷积正则化Relu激活卷积正则化->输出加上下采样输出求和作为下一层Relu激活函数输入。作用:防止梯度消失。使网络可以变得更深。

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)

        out += identity
        out = self.relu(out)

3.最后return out输出参差网络的处理结果。

接下来定义50层、101层和152层的参差结构:

输入56x56x256

1.self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
                               kernel_size=1, stride=1, bias=False)  # squeeze channels
        self.bn1 = nn.BatchNorm2d(out_channel)->卷积层一和第一层正则化和原来一样。卷积核数量是128,输出56x56x128。深度缩小一半。

2.self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
                               kernel_size=3, stride=stride, bias=False, padding=1)
        self.bn2 = nn.BatchNorm2d(out_channel)-》卷积层二kernel_size=3则处理后的图像长宽缩小一半。卷积核数量是128,输出28x28x128。长宽缩小一半。

3.self.conv3 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel*self.expansion,
                               kernel_size=1, stride=1, bias=False)  # unsqueeze channels
        self.bn3 = nn.BatchNorm2d(out_channel*self.expansion)->卷积层三卷积核大小1x1不改变图像大小,但卷积核数量变成4倍。作用是增加图像的深度。卷积核数量是128x4=512,输出28x28x512。深度增加4倍。

4.     

<think>我们被要求解决一个AssertionError:文件"./resnet34-pre.pth"不存在的问题。根据引用[3]中的类似问题,当使用`--resume`参数时,如果指定的检查点文件不存在,就会抛出类似的错误。在我们的代码中,我们试图加载一个预训练权重文件,但该文件在指定路径不存在。解决方案:1.确保文件确实存在于指定路径。检查路径字符串是否正确(注意拼写和扩展名)。2.如果文件不在当前工作目录,需要提供正确的相对路径或绝对路径。3.如果文件确实不存在,需要先下载该文件。根据引用[2]和引用[4],我们可能是在使用ResNet34模型,预训练权重文件可能需要从网上下载。步骤:1.检查当前目录下是否有"./resnet34-pre.pth"文件。如果没有,我们可以尝试寻找官方提供的预训练权重。2.PyTorch中,我们可以使用`torchvision.models.resnet34(pretrained=True)`来自动下载预训练权重,但我们这里需要的是加载本地文件。如果我们需要本地文件,应该先下载它。根据引用[2]中的代码,他们使用了"./resnet34_pre.pth"(注意下划线),而我们这里是"./resnet34-pre.pth"(中划线)。所以可能是文件名不一致。因此,我们可以:-检查文件名是否拼写错误(中划线还是下划线?)-如果文件名应该是下划线,则修改代码中的字符串。-或者,将下载的文件重命名为代码中使用的文件名。另外,引用[1]中演示了如何加载VGG16模型,其中预训练权重文件名为"vgg16-397923af.pth",这表明预训练权重的文件名中可能包含中划线。所以,我们可能需要确认正确的文件名。如果确实没有这个文件,我们可以:1.PyTorch官方下载ResNet34的预训练权重。官方通常通过`pretrained=True`参数自动下载,但有时我们需要手动下载。2.手动下载:我们可以找到该模型对应的预训练权重URL,然后下载到当前目录。如何获取官方ResNet34的预训练权重URL?在PyTorch中,我们可以通过查看`torchvision.models.resnet.model_urls`来获取。示例代码获取URL:```pythonfromtorchvision.models.resnetimportmodel_urlsprint(model_urls['resnet34'])```然后我们可以使用`urllib`或`requests`下载。但更简单的方法是:我们直接使用`torchvision.models.resnet34(pretrained=True)`,然后保存权重到本地,这样下次就可以直接加载。例如:```pythonimporttorchimporttorchvision.modelsasmodels#下载预训练模型model=models.resnet34(pretrained=True)#保存权重torch.save(model.state_dict(),'resnet34_pre.pth')```注意:这样保存的文件名是'resnet34_pre.pth'(下划线)。如果我们的代码中需要的是'resnet34-pre.pth'(中划线),我们可以重命名文件,或者修改代码中的路径字符串。因此,解决步骤总结如下:1.检查文件路径和文件名是否正确。特别注意中划线和下划线。2.如果文件不存在,则下载预训练权重文件,并确保放在正确的路径下。根据引用[3]的类似问题,错误是由于文件不存在导致的,所以我们要确保文件存在。代码修改建议:在加载之前,先检查文件是否存在,如果不存在则尝试下载(或者提示用户下载)。我们可以这样修改代码(参考引用[2]的代码):原代码:```pythonmodel_weight_path="./resnet34-pre.pth"assertos.path.exists(model_weight_path),"file{}doesnotexist.".format(model_weight_path)```修改为:方法1:自动下载(如果文件不存在)```pythonimportosimporttorchimporttorchvision.modelsasmodelsmodel_weight_path="./resnet34-pre.pth"ifnotos.path.exists(model_weight_path):#如果文件不存在,则下载预训练模型并保存model=models.resnet34(pretrained=True)torch.save(model.state_dict(),model_weight_path)print("Downloadedpretrainedweightsandsavedto:",model_weight_path)else:print("Pretrainedweightsfound.")#然后继续加载...```但是注意:官方模型文件名通常是下划线(resnet34_pre.pth),而这里我们使用的是中划线(resnet34-pre.pth)。为了避免混淆,我们可以统一使用下划线。方法2:修改文件名(推荐统一使用官方风格的下划线)将代码中的路径改为"./resnet34_pre.pth",然后确保文件名为这个。如果已经有一个中划线文件名的文件,那么我们可以重命名它,或者修改代码中的路径字符串。所以,具体解决方案取决于我们想要的文件名。根据用户提供的错误信息,路径是"./resnet34-pre.pth",我们可以选择:1.将文件名改为"resnet34_pre.pth"(下划线),然后修改代码中的路径字符串。2.或者,下载一个文件并命名为"resnet34-pre.pth"(中划线)。由于在引用[2]中,他们使用的是"resnet34_pre.pth"(下划线),所以可能是用户代码中写错了。因此,建议将代码中的路径改为"resnet34_pre.pth",然后下载预训练权重到该文件名。因此,最终代码修改如下:将`model_weight_path="./resnet34-pre.pth"`改为`model_weight_path="./resnet34_pre.pth"`然后,如果文件不存在,则下载:```pythonmodel_weight_path="./resnet34_pre.pth"ifnotos.path.exists(model_weight_path):#下载并保存model=models.resnet34(pretrained=True)torch.save(model.state_dict(),model_weight_path)```这样,我们就能确保文件存在。但是,注意:在引用[2]的代码中,他们使用的是`resnet34(num_classes=100)`,然后只加载部分权重。如果我们的模型结构有改变(比如分类类别数不是1000),那么直接加载预训练权重可能会在最后一层不匹配。这时,我们需要像引用[2]那样,删除全连接层(fc)的权重,然后加载。然而,用户的问题只是文件不存在,我们先解决文件路径问题。结构不匹配的问题可能需要另外处理。总结:解决AssertionError:filedoesnotexist的方法:1.确认文件路径和文件名正确(检查拼写,特别是中划线和下划线)。2.如果文件不存在,则下载预训练权重文件到该路径。我们提供修改后的代码示例:</think>### 解决 AssertionError: file ./resnet34-pre.pth does not exist 问题 这个错误发生在 PyTorch 加载预训练权重时,表示系统找不到指定路径的权重文件。以下是详细解决方法: #### 1. **验证文件路径和名称** - 检查文件名拼写:PyTorch 官方模型通常使用下划线命名(如 `resnet34_pre.pth`),而非中划线 - 确认文件位置:使用绝对路径更可靠 ```python import os model_weight_path = "./resnet34_pre.pth" # 注意下划线 print("文件存在:", os.path.exists(model_weight_path)) # 验证路径 ``` #### 2. **正确下载预训练权重** - **方法1:自动下载** ```python import torchvision.models as models # 自动下载并加载官方权重 model = models.resnet34(pretrained=True) torch.save(model.state_dict(), "resnet34_pre.pth") # 保存到本地 ``` - **方法2:手动下载** 1. 从官方源下载:[ResNet34 预训练权重](https://download.pytorch.org/models/resnet34-333f7ec4.pth) 2. 保存到项目目录并重命名 #### 3. **处理自定义模型结构** 当模型结构与预训练权重不完全匹配时(如修改了全连接层),需选择性加载权重: ```python import torch import torch.nn as nn from torchvision.models import resnet34 # 初始化模型(假设修改了分类层) net = resnet34(num_classes=10) # 自定义类别数 # 选择性加载权重 pretrained_dict = torch.load("resnet34_pre.pth") model_dict = net.state_dict() # 过滤不匹配的权重 pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict and "fc" not in k} # 加载匹配的权重 model_dict.update(pretrained_dict) net.load_state_dict(model_dict) ``` #### 4. **路径问题排查技巧** - 打印当前工作目录: ```python import os print("当前工作目录:", os.getcwd()) ``` - 使用路径拼接确保正确性: ```python base_dir = os.path.dirname(__file__) # 脚本所在目录 weight_path = os.path.join(base_dir, "weights", "resnet34_pre.pth") ``` #### 5. **常见错误场景** - **文件扩展名错误**:`.pth` 而非 `.pt` 或 `.pth.tar` - **文件未完整下载**:验证文件大小(ResNet34 约 85MB) - **权限问题**:在 Linux 系统使用 `chmod` 修改文件权限 > **关键提示**:PyTorch 官方模型的预训练权重应使用 `torchvision.models` 模块的 `pretrained=True` 参数自动获取,避免手动路径管理[^2][^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值