Pytorch深度学习(深度学习(4)) — BN层及层及ResNet + DenseNet实现实现
Pytorch深度学习(深度学习(4)) — BN层及层及ResNet + DenseNet实现实现1.批量归一化(BN)2.ResNet2.1 残差块2.2 ResNet 模型实现结构:3.DenseNet 稠密连接网络3.1 稠密块
(DenseBlock)3.3 过滤层(transition_block)3.4 DenseNet模型总实现
1.批量归一化批量归一化(BN)
nn.BatchNorm2d(6) — 卷积层使用,超参数为输出通道数
nn.BatchNorm1d(120) – 全连接层使用,超参数为输出单元个数
2.ResNet
2.1 残差块残差块
输入为X + Y,因而X Y的输出通道要一致
可以用1*1的卷积层来调整通道的大小
class Residual(nn.Module):
#可以设定输出通道数、是否使用额外的1x1卷积层来修改通道数以及卷积层的步幅。
def __init__(self, in_channels, out_channels, use_1x1conv=False, stride=1):
super(Residual, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=stride)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
if use_1x1conv:
self.conv3 = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride)
else:
self.conv3 = None
self.bn1 = nn.BatchNorm2d(out_channels)
self.bn2 = nn.BatchNorm2d(out_channels)
def forward(self, X):
Y = F.relu(self.bn1(self.conv1(X)))
Y = self.bn2(self.conv2(Y))
if self.conv3:
X = self.conv3(X)
return F.relu(Y + X)
2.2 ResNet 模型实现模型实现
结构:结构:
卷积(64,7×7,3)
批量一体化
最大池化(3×3,2)
残差块x4 (通过步幅为2的残差块在每个模块之间减小高和宽)
全局平均池化
全连接
net = nn.Sequential(
nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
def resnet_block(in_channels, out_channels, num_residuals, first_block=False):
if first_block:
assert in_channels == out_channels # 第一个模块的通道数同输入通道数一致
评论0