山东省建设部网站官网南宁做网站的公司有哪些
news/
2025/9/26 13:49:21/
文章来源:
山东省建设部网站官网,南宁做网站的公司有哪些,国外c2c平台,wordpress静态页404【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解前言GoogLeNet(InceptionV1)讲解Inception结构InceptionV1结构1x1卷积的作用辅助分类器 GoogLeNet(Inceptio…【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解前言GoogLeNet(InceptionV1)讲解Inception结构InceptionV1结构1x1卷积的作用辅助分类器 GoogLeNet(InceptionV1)模型结构GoogLeNet(InceptionV1) Pytorch代码完整代码总结 前言
GoogLeNet(InceptionV1)是由谷歌的Szegedy, Christian等人在《Going Deeper With Convolutions【CVPR-2015】》【论文地址】一文中提出的模型主要特点是提高了网络内部计算资源的利用率允许增加网络的深度和宽度同时保持计算预算不变。 GoogLeNet(InceptionV1)讲解
此前传统的方式简单粗暴的增加隐藏层(网络深度)和各层神经元数目(网络宽度)以达到提高网络性能的目的 但这类方法存在致命的问题更大的参数空间需要更多的计算资源并且更容易导致过拟合网络越深则梯度越容易消失导致优化更加困难。 卷积神经网络的性能提高都是依赖于提高网络的深度和宽度如何在增加网络深度和宽度的同时减少参数解决思路便是全连接变成稀疏连接GoogLeNet从网络结构上入手改变了网络结构提出了inception的卷积网络结构
空间(spatial)上的稀疏连接:卷积神经网络本身对输入图像的局部进行卷积而不是对整个图像进行卷积参数共享降低了总参数的数目并减少了计算量。在特征维度(feature channel)上的稀疏:多个尺寸上进行卷积再聚合把相关性强的特征聚集到一起(也是种稀疏连接)并使用1x1卷积进行降维减少通道数限制网络的大小降低了计算复杂度。
Inception结构
原始的(基本)Inception模块其通过多个尺寸上进行卷积再聚合来提取更密集的特征。 对输入做了4个分支分别用不同尺寸的filter进行卷积或池化最后再在特征维度上拼接到一起以便下一阶段能够同时从不同的尺度上提取特征。这种全新的结构设计能带来以下好处
采用大小不同的卷积核在多个尺度上同时进行卷积意味着感受野的大小不同得到的的特征尺度不同特征更为丰富也意味着最后分类判断时更加准确。inception在特征维度上进行分解 (稀疏矩阵分解原理)在多个尺度上预先把相关性强的特征单独汇聚(Hebbian原则) 强化具有相似类型特征的filter之间的关联(filter bank)如分别聚集1x1的的特征、3x3的特征和5x5的特征用更少的filter来提取相关的特征再将多个尺度的filter bank特征进行组合。
InceptionV1结构
原始的Inception 结构存在一个不可忽视的问题卷积运算运算量过大如果特征图的通道数过大(即当上一层的输出通道数较大时会导致当前Inception模块的运算消费巨大特别是当前Inception模块中的pooling层输出的通道数和输入保持一致且由于多组卷积核并联运算因此这是随着层数的堆叠而爆炸式增长的 针对这一问题对原始结构做了改进加上1x1卷积层作为reduction层做降维和特征映射、空间信息整合和引入非线性以达到网络的压缩从而减少计算量。
1x1卷积的作用
1x1卷积在卷积神经网络中起着重要的作用
降维和特征映射1x1卷积可以用于降低通道数(即特征的维度)通过减少输入特征图的通道数来降低计算和存储成本这对于减少模型的参数量、加快计算速度以及控制过拟合都非常有用。同时1x1卷积也可以用于增加通道数以增加特征的表达能力空间信息整合尽管1x1卷积的感受野很小但它可以在通道维度上对输入特征进行组合和整合从而引入跨通道的交互和增加模型的非线性能力(1x1卷积中的非线性激活函数)这有助于模型学习不同通道之间的相关性和特征之间的互动更好地拟合复杂的数据分布和提取更丰富的特征表示 网络的压缩和加速1x1卷积可以减少通道数压缩卷积神经网络减小模型的计算量和存储需求从而实现更快的推理速度和更高的效率。 使用128个3x3的卷积核对512通道特征图进行卷积 参数量512×3×3×128589824 计算量512×3×3×128×W×H589824×W×H 使用24个1x1卷积核先对512通道特征图降维再用128个3x3的卷积核进行卷积 参数量512×1×1×2424×3×3×12812504 计算量512×1×1×24×W×H24×3×3×128×W×H12504×W×H
1x1卷积成为设计高效、灵活和强大的网络架构的重要工具。
辅助分类器
在GoogLeNet中除了主要的分类器外还在网络的中间层添加了两个辅助分类器提供了额外的监督信号帮助网络更好地学习特征表示。 辅助分类器的作用和优势
渐进式训练和梯度传播辅助分类器的添加有助于渐进式训练和梯度传播。由于辅助分类器位于网络的中间层它们可以为网络的早期层和中间层提供额外的监督信号。这有助于缓解梯度消失问题使得梯度能够更好地传播回网络的早期层从而促进网络的训练和优化。正则化和减轻过拟合辅助分类器的添加有助于正则化网络并减轻过拟合的风险。通过在网络的中间层引入额外的分类器可以引入额外的参数约束和损失函数从而限制网络的复杂性降低过拟合的可能性。梯度传播路径的多样性辅助分类器的存在为网络提供了多条梯度传播路径。这有助于梯度在网络中传播更远使得网络能够更好地学习和优化多条梯度传播路径还有助于避免梯度消失或梯度爆炸的问题。辅助训练信号辅助分类器的预测结果可以提供额外的训练信号用于监督网络的中间层。这可以促使中间层学习更具判别性的特征表示从而提高网络的性能和泛化能力。多尺度特征融合辅助分类器在不同层级上进行分类可以捕捉到不同尺度的特征。这有助于提高网络的感受野和特征表达能力。
需要注意的是辅助分类器并不直接用于最终的预测结果。在训练过程中辅助分类器的损失函数会被加权并与主分类器的损失函数相结合。在推理阶段辅助分类器被舍弃仅使用主分类器进行预测。
辅助分类器的添加是GoogLeNet(InceptionV1)架构的一个重要设计特点也为后续的深度卷积神经网络的发展奠定了基础。 GoogLeNet(InceptionV1)模型结构
下图是原论文给出的关于GoogLeNet(InceptionV1)模型结构的详细示意图 GoogLeNet(InceptionV1)在图像分类中分为两部分backbone部分 主要由InceptionV1模块、卷积层和池化层(汇聚层)组成分类器部分 由主分类器和俩个辅助分类器组成。 GoogLeNet(InceptionV1) Pytorch代码
卷积层组 卷积层激活函数
# 卷积组:Conv2dReLU
class BasicConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0):super(BasicConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)self.relu nn.ReLU(inplaceTrue)def forward(self, x):x self.conv(x)x self.relu(x)return xInceptionV1模块 卷积层组池化层
# InceptionV1:BasicConv2dMaxPool2d
class InceptionV1(nn.Module):def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):super(Inception, self).__init__()# 1×1卷积self.branch1 BasicConv2d(in_channels, ch1x1, kernel_size1)# 1×1卷积3×3卷积self.branch2 nn.Sequential(BasicConv2d(in_channels, ch3x3red, kernel_size1),BasicConv2d(ch3x3red, ch3x3, kernel_size3, padding1) # 保证输出大小等于输入大小)# 1×1卷积5×5卷积self.branch3 nn.Sequential(BasicConv2d(in_channels, ch5x5red, kernel_size1),BasicConv2d(ch5x5red, ch5x5, kernel_size5, padding2) # 保证输出大小等于输入大小)# 3×3池化1×1卷积self.branch4 nn.Sequential(nn.MaxPool2d(kernel_size3, stride1, padding1),BasicConv2d(in_channels, pool_proj, kernel_size1))def forward(self, x):branch1 self.branch1(x)branch2 self.branch2(x)branch3 self.branch3(x)branch4 self.branch4(x)# 拼接outputs [branch1, branch2, branch3, branch4]return torch.cat(outputs, 1)辅助分类器 池化层卷积层组全连接层dropout
# 辅助分类器:AvgPool2dBasicConv2dLineardropout
class InceptionAux(nn.Module):def __init__(self, in_channels, num_classes):super(InceptionAux, self).__init__()# 池化层self.averagePool nn.AvgPool2d(kernel_size5, stride3)# 1×1卷积self.conv BasicConv2d(in_channels, 128, kernel_size1) # output[batch, 128, 4, 4]# 全连接层self.fc1 nn.Linear(2048, 1024)self.fc2 nn.Linear(1024, num_classes)def forward(self, x):# aux1: N x 512 x 14 x 14# aux2: N x 528 x 14 x 14x self.averagePool(x)# aux1: N x 512 x 4 x 4# aux2: N x 528 x 4 x 4x self.conv(x)# N x 128 x 4 x 4x torch.flatten(x, 1)x F.dropout(x, 0.5, trainingself.training)# N x 2048x F.relu(self.fc1(x), inplaceTrue)x F.dropout(x, 0.5, trainingself.training)# N x 1024x self.fc2(x)# N x num_classesreturn x完整代码
import torch.nn as nn
import torch
import torch.nn.functional as F
from torchsummary import summaryclass GoogLeNet(nn.Module):def __init__(self, num_classes1000, aux_logitsTrue, init_weightsFalse):super(GoogLeNet, self).__init__()self.aux_logits aux_logitsself.conv1 BasicConv2d(3, 64, kernel_size7, stride2, padding3)self.maxpool1 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.conv2 BasicConv2d(64, 64, kernel_size1)self.conv3 BasicConv2d(64, 192, kernel_size3, padding1)self.maxpool2 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception3a InceptionV1(192, 64, 96, 128, 16, 32, 32)self.inception3b InceptionV1(256, 128, 128, 192, 32, 96, 64)self.maxpool3 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception4a InceptionV1(480, 192, 96, 208, 16, 48, 64)self.inception4b InceptionV1(512, 160, 112, 224, 24, 64, 64)self.inception4c InceptionV1(512, 128, 128, 256, 24, 64, 64)self.inception4d InceptionV1(512, 112, 144, 288, 32, 64, 64)self.inception4e InceptionV1(528, 256, 160, 320, 32, 128, 128)self.maxpool4 nn.MaxPool2d(3, stride2, ceil_modeTrue)self.inception5a InceptionV1(832, 256, 160, 320, 32, 128, 128)self.inception5b InceptionV1(832, 384, 192, 384, 48, 128, 128)if self.aux_logits:self.aux1 InceptionAux(512, num_classes)self.aux2 InceptionAux(528, num_classes)self.avgpool nn.AdaptiveAvgPool2d((1, 1))self.dropout nn.Dropout(0.4)self.fc nn.Linear(1024, num_classes)if init_weights:self._initialize_weights()def forward(self, x):# N x 3 x 224 x 224x self.conv1(x)# N x 64 x 112 x 112x self.maxpool1(x)# N x 64 x 56 x 56x self.conv2(x)# N x 64 x 56 x 56x self.conv3(x)# N x 192 x 56 x 56x self.maxpool2(x)# N x 192 x 28 x 28x self.inception3a(x)# N x 256 x 28 x 28x self.inception3b(x)# N x 480 x 28 x 28x self.maxpool3(x)# N x 480 x 14 x 14x self.inception4a(x)# N x 512 x 14 x 14if self.training and self.aux_logits: # eval model lose this layeraux1 self.aux1(x)x self.inception4b(x)# N x 512 x 14 x 14x self.inception4c(x)# N x 512 x 14 x 14x self.inception4d(x)# N x 528 x 14 x 14if self.training and self.aux_logits: # eval model lose this layeraux2 self.aux2(x)x self.inception4e(x)# N x 832 x 14 x 14x self.maxpool4(x)# N x 832 x 7 x 7x self.inception5a(x)# N x 832 x 7 x 7x self.inception5b(x)# N x 1024 x 7 x 7x self.avgpool(x)# N x 1024 x 1 x 1x torch.flatten(x, 1)# N x 1024x self.dropout(x)x self.fc(x)# N x 1000(num_classes)if self.training and self.aux_logits: # 训练阶段使用return x, aux2, aux1return x# 对模型的权重进行初始化操作def _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)# InceptionV1:BasicConv2dMaxPool2d
class InceptionV1(nn.Module):def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):super(InceptionV1, self).__init__()# 1×1卷积self.branch1 BasicConv2d(in_channels, ch1x1, kernel_size1)# 1×1卷积3×3卷积self.branch2 nn.Sequential(BasicConv2d(in_channels, ch3x3red, kernel_size1),BasicConv2d(ch3x3red, ch3x3, kernel_size3, padding1) # 保证输出大小等于输入大小)# 1×1卷积5×5卷积self.branch3 nn.Sequential(BasicConv2d(in_channels, ch5x5red, kernel_size1),# 在官方的实现中其实是3x3的kernel并不是5x5这里我也懒得改了具体可以参考下面的issue# Please see https://github.com/pytorch/vision/issues/906 for details.BasicConv2d(ch5x5red, ch5x5, kernel_size5, padding2) # 保证输出大小等于输入大小)# 3×3池化1×1卷积self.branch4 nn.Sequential(nn.MaxPool2d(kernel_size3, stride1, padding1),BasicConv2d(in_channels, pool_proj, kernel_size1))def forward(self, x):branch1 self.branch1(x)branch2 self.branch2(x)branch3 self.branch3(x)branch4 self.branch4(x)# 拼接outputs [branch1, branch2, branch3, branch4]return torch.cat(outputs, 1)# 辅助分类器:AvgPool2dBasicConv2dLineardropout
class InceptionAux(nn.Module):def __init__(self, in_channels, num_classes):super(InceptionAux, self).__init__()# 池化层self.averagePool nn.AvgPool2d(kernel_size5, stride3)# 1×1卷积self.conv BasicConv2d(in_channels, 128, kernel_size1) # output[batch, 128, 4, 4]# 全连接层self.fc1 nn.Linear(2048, 1024)self.fc2 nn.Linear(1024, num_classes)def forward(self, x):# aux1: N x 512 x 14 x 14# aux2: N x 528 x 14 x 14x self.averagePool(x)# aux1: N x 512 x 4 x 4# aux2: N x 528 x 4 x 4x self.conv(x)# N x 128 x 4 x 4x torch.flatten(x, 1)x F.dropout(x, 0.5, trainingself.training)# N x 2048x F.relu(self.fc1(x), inplaceTrue)x F.dropout(x, 0.5, trainingself.training)# N x 1024x self.fc2(x)# N x num_classesreturn x# 卷积组: Conv2dReLU
class BasicConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0):super(BasicConv2d, self).__init__()self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)self.relu nn.ReLU(inplaceTrue)def forward(self, x):x self.conv(x)x self.relu(x)return xif __name__ __main__:device torch.device(cuda:0 if torch.cuda.is_available() else cpu)model GoogLeNet().to(device)summary(model, input_size(3, 224, 224))summary可以打印网络结构和参数方便查看搭建好的网络结构。 总结
尽可能简单、详细的介绍了深度可分卷积的原理和卷积过程讲解了GoogLeNet(InceptionV1)模型的结构和pytorch代码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918337.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!