pytorch-CNN、BatchNorm、残差网络

import torch
from torch.nn import functional as F #导入函数
from torch import nn #神经网络

layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=0)
layer

在这里插入图片描述

x = torch.rand(1, 1, 28, 28)
x

在这里插入图片描述

out = layer.forward(x)
print("stride=1,padding=0:out.shape = ",out.shape)
layer = nn.Conv2d(1, 3, kernel_size=3, stride=1,padding=1)
out = layer.forward(x)
print("stride=1,padding=1:out.shape = ",out.shape)
layer = nn.Conv2d(1, 3, kernel_size=3, stride=2,padding=1)
out = layer.forward(x)
print("stride=2,padding=1:out.shape = ",out.shape)
print("-----Inner weight $ bias -----")
print("layer.weight = \n", layer.weight)
print("layer.weight.shape=",layer.weight.shape)
print("layer.bias.shape=",layer.bias.shape)

在这里插入图片描述

print("-----F.conv2d-----")
w = torch.rand(16, 3, 5, 5)
b = torch.rand(16)
x = torch.randn(1, 3
<think>好的,我需要回答用户关于如何在CNN中应用迁移学习以及与残差网络相关的实现方法和教程的问题。首先,我得回顾一下用户提供的引用内容,看看哪些信息可以直接使用。 用户提到了引用[1]和[2],里面讲到了迁移学习的基本概念和ResNet的结构,特别是残差结构和批次归一化。引用[3]和[4]讨论了ResNet在医学检测中的应用和Batch Normalization的细节。我需要将这些信息整合起来,分步骤解释实现方法。 首先,应该解释迁移学习在CNN中的一般步骤,比如预训练模型、微调等。然后,结合残差网络,比如ResNet的结构,说明如何利用其解决梯度问题。接着,可能需要给出一个具体的代码示例,比如使用PyTorch加载预训练的ResNet模型,并修改最后的全连接层进行微调。 同时,用户要求生成相关问题,我需要想几个相关的问题,比如迁移学习的优势、ResNet的核心结构、Batch Normalization的作用等。确保问题覆盖用户可能感兴趣的方面。 在写作过程中要注意使用正确的中文表达,数学公式用$$...$$,行内公式用$...$。比如提到残差结构时,公式$F(x) = H(x) - x$需要用正确的LaTeX格式。代码部分要使用代码块,并确保语法正确。 还需要检查引用标记是否正确添加,比如在提到批次归一化时引用[4],在讨论残差结构时引用[2]和[3]。确保每个引用都对应正确的内容,并且自然地融入回答中。 最后,保持结构清晰,分步骤讲解实现方法,让用户能够逐步理解和应用。可能需要分成几个部分,如迁移学习步骤、残差网络实现、代码示例等,每个部分下再详细说明。</think>### CNN迁移学习与残差网络实现方法分步解析 #### 一、迁移学习在CNN中的应用步骤 1. **预训练模型选择** 选择与目标任务相近的ImageNet预训练模型(如ResNet18/50),其底层特征提取能力已通过大规模数据验证[^2]。数学表达式描述特征映射过程: $$F(x) = W \ast x + b$$ 其中$\ast$表示卷积操作,$W$为卷积核权重。 2. **特征提取器复用** 冻结前N层卷积层参数(通过`requires_grad=False`实现),保留其通用特征提取能力。例如ResNet18包含17个卷积层+1个全连接层,可冻结前10层[^3]。 3. **分类器改造** 替换原全连接层,新结构需匹配当前任务类别数。示例代码(PyTorch): ```python import torchvision.models as models model = models.resnet18(pretrained=True) for param in model.parameters(): # 冻结所有层 param.requires_grad = False model.fc = nn.Sequential( # 修改最后一层 nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, num_classes) ) ``` 4. **微调策略** - 初始阶段:仅训练新添加的分类层(学习率0.001-0.01) - 中期解冻:逐步解冻部分卷积层(如后3层)参与训练 - 参数更新:使用更小的学习率(原1/10)优化解冻层[^1] #### 二、残差网络核心实现 1. **残差结构数学表达** 基础残差单元满足: $$H(x) = F(x) + x$$ 其中$F(x)$为残差映射,通过两个3×3卷积实现[^2]。 2. **批次归一化实现** 每个卷积层后插入BN层,标准化公式: $$\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$ $$y_i = \gamma \hat{x}_i + \beta$$ 其中$\mu_B$为批次均值,$\sigma_B^2$为批次方差[^4]。 3. **残差模块代码实现** ```python class BasicBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super().__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, 3, stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.conv2 = nn.Conv2d(out_channels, out_channels, 3, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.shortcut = nn.Sequential() if stride != 1 or in_channels != out_channels: self.shortcut = nn.Sequential( nn.Conv2d(in_channels, out_channels, 1, stride, bias=False), nn.BatchNorm2d(out_channels) ) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out += self.shortcut(x) return F.relu(out) ``` #### 三、完整训练流程示例 ```python # 数据准备 from torchvision import transforms train_transforms = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 模型训练配置 import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD([ {'params': model.fc.parameters(), 'lr': 0.01}, {'params': model.layer4.parameters(), 'lr': 0.001} ], momentum=0.9) # 训练循环 for epoch in range(10): for inputs, labels in train_loader: outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青灯有味是儿时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值