7.4 含并行连接的网络GooLeNet

在2 0 1 4 ImageNet 图像 识别 挑战赛 只能够 一个 名叫 G o o g l e N e t 网络架构 大放异彩 吸收了 N i N 串联 网络 思想 基础上 作了改进 解决了 多大 卷积核 最合适 问题 以前 流行 网络 使用 1 x 1 大到 1 1 x 1 1 卷积核 有时候 使用 不同 大小 卷积核 组合式 有利

7.4.1 Inception

GoogleNet基本的卷积块称为Inception可能得名于电影盗梦空间因为电影有一句台词我们需要走的

7-5所示Inception4并行路径组成3路径使用窗口大小1x1,3x35x5卷积层从不同空间大小提取信息中间2路径输入执行1x1卷积减少通道数从而降低模型复杂度4路径使用3x3最大汇聚层然后使用1x1卷积层改变通道数4路径使用合适填充使得输入输出高度宽度一致最后我们每条路径输出通道维度合并构成Inception输出Inception通常调整参数每层输出通道数

1x1卷积层 通道合并

3x3 卷积层 填充1 5x5卷积层 填充2 1x1卷积层

1x1卷积层 1x1卷积层 3x3最大汇聚层 填充1

输入

7-5 Inception架构

import torch

from torch import nn

from torch.nn functional as F

from d2l import torch as d2l

class Inception(nn.Module)

#c1 --c4每条路径输出通道数

def __init__(self, in_channels, c1,c2,c3,c4, **kwargs):

super(Inception, self).__init__(**kwargs)

#路径11x1卷积层

self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)

#路径21x1卷积3x3卷积层

self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_szie=1)

self.p2_1 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)

#路径3 1x1卷积层5x5卷积层

self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)

self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_szie=3, padding=2)

#路径4 3x3最大汇聚层1x1卷积层

self.p4_1 = nn.MaxPool2d(kernel_szie=3,stride=1,padding=1)

self.p4_2= nn.Conv2d(in_channels, c4, kernel_szie=1)

def forward(self, x):

p1 = F.relu(self.p1_1(x))

p2=F.relu(self.p2_2(F.relu(self.p2_1(x))))

p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))

p4 = F.relu(self.p4_2(self.p4_1(x)))

#通道维度连接输出

return torch.cat(p1,p2,p3,p4), dim=1

那么为什么googleNet 这个网络如此有效考虑一下滤波器组合可以各种滤波器尺寸探索图像意味着不同尺寸滤波器可以有效识别不同范围图像细节同时我们可以不同滤波器分配不同数量参数

7.4.2 GoogleNet模型

如图7-6所示GoogleNet一共使用9Inception全局平均汇聚层堆叠生成估计值Inception之间最大汇聚层可以降低维度第一个模块类似于AlexNetLeNet Inception组合VGG继承全局平均汇聚层避免在最后使用全连接层

现在我们逐一实现GoogleNet每个模块第一个模块使用64通道7x7卷积层

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_szie=7, stride=2, padding=3),

nn.ReLU(),

nn.MaxPool2d(kernel_size=3, stirde=2,padding=1))

第二个模块使用两个卷积层第一个卷积64通道1x1卷积层第二个卷积使用通道增加33x3卷积层这对英语Inception 的第二条路径

b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_szie=1),nn.ReLU(),

nn.Conv2d(64, 192, kernel_szie=3,padding=1),

nn.RelU(),nn.MaxPool2d(kernel_szie=3, stride=2, padding=1))

全连接层

全局平均汇聚层

2X

3x3最大汇聚层

5x

3x3最大汇聚层

2x

3x3最大汇聚层

3x3卷积层

1x1卷积层

3x3最大汇聚

7x7卷积层

第三个模块串联两个完整Inception第一个Inception 块的输出通道数64+128+32+32 = 2564路径输出通道之比64:128:32:32 = 2:4:1:1/第二条第三条路径首先输入通道数分别减少96/192 = 1/12然后连接第二个卷积层第二个Inception 块的输出通道数增加到128 + 192 + 96 +64 = 4804路径输出通道之比128:192:96:64 = 4:6:3:2第二条路径第三条路径先将输入通道数分别减少128/256=1/232/256=1/8

b3 = nn.Sequential(Inception(192, 64, (96, 128), (16,32), 32),

Inception(256,128,(128,192),(32,96), 64),

nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

第四个模块更加复杂串联了5Inception输出通道数分别是192 + 208 + 48 + 64 + 512, 160 + 224 + 64 + 64 = 512, 128 + 256 + 64+64=512, 112+288+64+64=528256+320+128+128=832 这些路径通道数分配第三个模块类似首先输出通道数最多3x3卷积层第二条路径其次含有1x1卷积层第一条路径最后含有5x5 卷积层第三条路径3x3最大汇聚层第四条路径其中第二条路径第三条路径都会按比例减少通道数这些比例各个Inception略有不同

b4 = nn.Sequential(Inception(480,192,(96,208),(16,48),64), Inception(512,160,(112,224),(24,64),64),

Inception(512,128,(128,256),(24,64),64),

Inception(512,112,(144,288),(32,64),64),

Inception(528,256,(160,320),(32,128),128),

nn.MaxPool2d(kernel_size=3, stride=2,padding=1))

第五个模块包含输出通道数256 + 320 + 128 + 128 = 832384 + 384 + 128 + 128 = 1024两个Inception其中每条路径通道数分配思路第三个模块第四个模块一致只是具体数值有所不同需要注意的是第五个模块后面紧跟输出层该模块NiN一样使用全局平均汇聚层每个通道高度宽度变成1最后我们输出变成二维数组连接一个输出个数标签类别全连接层

b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),

Inceotion(832, 384, (192, 384), (48, 128), 128),

nn.AdaptiveAvgPool2d(1,1),

nn.Flatten())

net = nn.Sequential(b1,b2,b3,b4,b5,nn.Linear(1024,10))

GoogleNet模型计算复杂而且不如VGG那样便于修改通道数为了使FashionMNIST训练短小精悍我们输入高度宽度224降低96这简化计算下面演示各个模块输出形状变化

X = torch.rand(size(1,1,96,96))

for layer in net:

X = layer(x)

7.4.3 训练模型

和之前一样我们使用FashionMNIST 数据集训练模型在训练之前我们将图像分辨率转换96像素x96像素

lr, num_epochs, batch_szie = 0.1, 10, 128

tran_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)

d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值