复杂神经网络的问题

简单神经网络

我们注意这样的一个问题,我们在之前的学习当中使用的都是简单的一条龙走下来的方式进行学习,这种是比较基础的,没有分叉,没有循环,就是一条路走完。可以看到之前学的都是特别简单的串行结构。

GoogleNet

是一种基础架构,我们一般拿这个网络做一个主干网络,之后再在主干网络上进行修改之后作为我们实际应用的场景。

减少代码冗余:Inception Module

减少代码冗余看起来比较陌生其实我们可能已经默默应用了很久了,例如:在面向过程的编程语言当中使用函数,在面向过程的编程语言当中使用类。都是对代码进行减少冗余。
可以看到这种网络结构是十分的复杂,那么我们如果全部一点一点的写完,那么这个代码的复杂度就太大了。所以我们必须选择减少代码的冗余:

可以看到其实代码当中可复用的部分还是很多的,如上图:
这个块就被叫做:Inception(和电影盗梦空间重名)具体如下:

这里的设计灵感来自于,在模式识别的过程当中,主要是一些超参数的选择不好处理,例如我们在进行卷积的时候,我们该选择卷积核的维数为多少的问题。这样我们设计为多个不同的路径达到结果,这样子在不断的学习过程中,适合的卷积核所在的路径就会被逐渐的凸显出来。自动帮我们选择一个超参数。
那么这里

1×1的卷积到底是为了什么?

也就是这个图里的1×1卷积到底是在做什么?

如果我们这个channel数是一个1那么什么也别说了,这不就是一个矩阵数乘吗?

但是我们大部分实际应用的过程中channel并不是1而是多个,例如三个:

通过这个图我们可以看到,其实卷积是一个对不同通道数据的一个融合,融合这个说法比较空,不如举一个例子来理解一下:我们上高中的时候经常有个模考,或者月考。如果有六个科目,那么就是一个六维空间,在一个六维空间很难比较两个同学谁学习的情况更好,所以学校就有一个信息融合的算法,就是加总分。

当然这里是融合为一个通道,如果我们多几组卷积核,我们可以融合出目标个通道数的数据形式。这个过程中一个显著的特点就是改变了channel的个数。
可是改变一个channel的个数又有什么作用呢?我们可以详细看下图:

从图里我们可以看到在经过1×1卷积channel下降之后再进行5×5卷积可以有效地节约运算次数,这就是在节约钱啊。

Concatenate是什么?

也就是这个东西是什么?

这个东西其实是将之前的内容拆分,再在这一层结束之后从新合并在一起,我们注意一下这里的合并是在什么情况下合并的,这里的合并是依据channel合并的,也就是channel之下的全部内容都必须全部相等,才能顺利合并。
所以我们在中间过程的卷积过程当中要注意保证weight和height的稳定不变。

实现Googlenet

代码实现

import torch
import numpy
from torchvision import functional as F#这里我们注意不论我们输入的通道数是多少,我们输出的通道数都是88.
class Inception_Model(torch.nn.Module):def __init__(self,input_channel):super(Inception_Model,self).__init__()self.poolingbranch= torch.nn.Conv2d(input_channel,24,kernel_size=1)self.1m1branch =torch.nn.Conv2d(input_channel,16,kernel_size=1)self.5m5branch1 =torch.nn.Conv2d(input_channel,16,kernel_size=1)self.5m5branch2=torch.nn.Conv2d(16,24,kernel_size=5,padding=2)#注意这里设置一个2的padding是为了保证输出的图形的形状一致self.3m3branch1=torch.nn.Conv2d(input_channel,16,kernel_size=1)self.3m3branch2=torch.nn.Conv2d(16,24,kernel_size=3,padding=1)#同样这里的padding也是为了保证输出的图像一致self.3m3branch3 =torch.nn.Conv2d(24,24,kernel_size=3,padding=1)def forward(self,x):branchpool=F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)#这里是使用一个函数,因为这个求平均没有参数,所以直接可以当成函数使用branchpool=poolingbranch(branchpool)branch1m1=self.1m1branch(x)branch5m5=self.5m5branch1(x)branch5m5=self.5m5branch2(branch5m5)branch3m3=self.3m3branch1(x)branch3m3=self.3m3branch2(branch3m3)branch5m5=self.3m3branch3(branch3m3)outputs = [branchpool,branch1m1,branch5m5,branch3m3]#注意这里我们只是将其放在一个元组当中,并没有拼起来return torch.cat(outputs,dim=1)#正着开始的第一号维度其实是第二个嘛,不就是channel吗。只有当只有channel不一样的时候,才可以顺利合并起来。class Net(torch.nn.Module):def __init__(self):super(Net,self).__init__()self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)self.conv2=torch.nn.Conv2d(88,20,kernel_size=5)self.incip1=Inception_Model(10)self.incip2=Inception_Model(20)self.mp=torch.nn.MaxPool2d(2)self.fullconnect=nn=(1408,10)#这里我们注意,我们的1408是可以算出来的。#但是实际上并没有人去算,都是输入一个数据测试一下到底是多少的情况。def forward(self,x):in_size=x.size(0)#注意这里我们其实是为了获得我们是在使用的数据集的大小的问题x=F.relu(self.mp(self.conv1(x)))#从(1,28,28)到(10,24,24)再到(10,12,12)x=self.incip1(x)#从(10,12,12)到(88,12,12)x=f.relu(self.mp(self.conv2(x)))#从(88,12,12)到(10,8,8)再到(10,4,4)x=self.incip2(x)#从(10,4,4)到(88,4,4)所以一个输出转化为一个一维张量就成了1408了x=x.view(in_size,-1)#注意这里我们是将数据集中的,每一个数据,原来的矩阵换成一个行。x=self.fullconnect(x)return x

在MNIST数据集上的表现



你看这里其实经过几次训练之后,这个测试集的准确度就开始下降了,这时候,可能就是出现了过拟合的现象。已经达到了这种网络的极限。理论上我们需要画图来找到最大值。但是一般我们在实际的操作当中我们是每次达到新的高度就进行一次存盘。最后我们得到的就是一个最好的模型了。

卷积神经网络补充—GoogleNet相关推荐

  1. 【3】卷积神经网络之GoogLeNet和Inception

    Inception 网络是 CNN 分类器发展史上一个重要的里程碑.在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能.例如 ...

  2. torch学习 (二十四):卷积神经网络之GoogleNet

    文章目录 引入 1 Inception块 2 GoogleNet模型 3 模型训练 完整代码 util.SimpleTool 引入   GoogleNet吸收了NIN网络串联网络的思想,并在此基础上做 ...

  3. 大白话讲解卷积神经网络工作原理

    本文介绍了计算机视觉常用工具:卷积神经网络.用大白话讲解了其应用领域.卷积.池化(下采样).全连接.梯度下降.反向传播算法.并用三维可视化工具展示了手写字体识别的卷积神经网络案例,最后介绍了几个经典的 ...

  4. 图像分类经典卷积神经网络—GoogLeNet论文翻译(中英文对照版)—Going Deeper with Convolutions(走向更深的卷积神经网络)

    图像分类经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为中英文对照版,纯中文版请稳步:[GoogLeNet纯中文版] Going Deeper with Convolution ...

  5. 图像分类经典卷积神经网络—GoogLeNet论文翻译(纯中文版)—Going Deeper with Convolutions(走向更深的卷积神经网络)

    图像分类经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[GoogLeNet纯中英文对照版] Going Deeper with Convolut ...

  6. 卷积神经网络常见架构AlexNet、ZFNet、VGGNet、GoogleNet和ResNet模型

    目前的常见的卷积网络结构有AlexNet.ZF Net.VGGNet.Inception.ResNet等等,接下来我们对这些架构一一详解. LeNet-5 LeNet-5模型诞生于1998年,是Yan ...

  7. 啥是卷积神经网络(三)(GoogLeNet v1网络详解)

    啥是卷积神经网络(三)( GoogLeNet详解) 故事的起因 故事的经过 0. 输入 1. Inception(3a.b) 2. Inception(4a.b.c.d.e) 2.1 Inceptio ...

  8. 从LeNet到GoogLeNet:逐层详解,看卷积神经网络的进化

    「免费学习 60+ 节公开课:投票页面,点击讲师头像」 作者 | MrCharles 来源 | CSDN原力计划获奖作品 (*点击阅读原文,查看作者更多文章) 前言 深度学习的兴起使卷积神经网络在计算 ...

  9. 基于Pytorch再次解读GoogLeNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

最新文章

  1. 用机器学习分析美国新财年1万个国防项目,7054亿军费都投给了哪些技术?
  2. ElasticSearch基础杂烩-配置-索引-优化
  3. SqLite中的事务
  4. Hdu 2196 - Computer
  5. [JZOJ5281]钦点题解--瞎搞+链表
  6. C语言EOF是什么?
  7. return true Java方法_java - 如何检查方法是否返回true或false?_java_酷徒编程知识库...
  8. pcb中layer stack manager 中,右上角的layer pairs 、internal layer pairs和build-up,三者的区别?
  9. git 在ssh情况下提交代码
  10. 表单元素对齐问题解决方案
  11. 华为机试HJ87:密码强度等级
  12. Dokcer学习笔记之Dokcerfile 文件构建
  13. centos安装输入法
  14. 驱动加载工具 DriverLoader 1.0
  15. php旅游管理系统,基于Laravel框架开发的旅游网站管理系统PHP源码
  16. BackgroundWorker的参数传递
  17. linux开发板显示动态图片,开发板上显示图片
  18. C语言调试openssl ,打印错误方法
  19. Codeforces 1342E Placing Rooks(容斥+组合数学)
  20. 春赏百花秋望月,夏沐凉风冬听雪

热门文章

  1. (进阶篇)Cookie与 Session使用详解
  2. 几个复制表结构和表数据的方法
  3. oracle sys sysman system 介绍
  4. AT89C51 单片机在电话远程控制器中的应用
  5. 排序方法的分类 算法
  6. jupyter notebook报错:ImportError: cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘解决方法
  7. CSP认证201412-1 门禁系统[C++题解]:哈希表
  8. HDU4143-A Simple Question数论题解
  9. java servlet 返回图片_SpringMVC返回图片的几种方式
  10. 计算机病毒与信息安全论文,信息安全与计算机病毒……毕业论文.doc