Inception(盗梦空间)及代码实现
文章目录
- 前言
- 一、Inception(盗梦空间)是什么?
- 二、使用步骤
- 1.空间结构
- 2.结构模型
- 总结
前言
这段时间观看b站up主 刘二大人 的关于深度学习的讲解,让我获益匪浅。让我了解到什么是盗梦空间(Inception),如何将结构嵌入到模型中,下面是视频地址:
https://www.bilibili.com/video/BV1Y7411d7Ys?p=11&share_source=copy_web
感兴趣的朋友,也可将Inception(盗梦空间)结构放入之前mnist数据识别的代码中进行尝试,因为维度改变,全连接层参数相应的也要进行改变。链接如下:
https://blog.csdn.net/qq_42962681/article/details/116270125?spm=1001.2014.3001.5501
以下是本篇文章正文内容,可供参考,如有不足,恳请大家指正,共同学习。
一、Inception(盗梦空间)是什么?
当你构建卷积层时,你要决定卷积核的大小,如何判别哪种卷积核效果更好?是1x1合适,还是3x3合适,还是5x5合适?要不要添加pooling层?
由于这些参数都是超参数,需要进行手动设置,在实验中逐个尝试的话无疑是一件费时费力的工程,这时通过Inception(盗梦空间)模块可很好的解决相应问题。
使用多个不同的卷积核,同时对输入图片进行处理(保证输出后的图像尺寸不变,只更改其维度),最后对处理的数据进行拼接。
二、使用步骤
1.空间结构
结构如图所示(示例):
图中5x5卷积和3x3卷积,都对图像进行了相应的填充,因此输入图像尺度和输出图像尺度不变。
2.结构模型
代码如下(示例):
代码中的数据集我使用的是常用的MNIST数据集,单个图像样本大小为(1, 28,28)。
盗梦空间代码示意图
import torch
import torch.nn as nn
from torch.utils.data import DataLoader # 我们要加载数据集的
from torchvision import transforms # 数据的原始处理
from torchvision import datasets # pytorch十分贴心的为我们直接准备了这个数据集
import torch.nn.functional as F # 激活函数
import torch.optim as optim#盗梦空间Inception
#图像输入网络中同时经过4种不同的卷积进行处理,这里保证分别处理后的,w,h都相同,以便后方拼接
#[b, c, w, h],这里b=64直接套用了上文提到的mnist数据集中batch_size的大小,可自由设置。
class InceptionA(torch.nn.Module):def __init__(self,in_channels):super(InceptionA,self).__init__()#[64,1,28,28]-[64,16,28,28] 通过卷积核为一的卷积,图像尺寸不变self.branch1x1 = nn.Conv2d(in_channels,16,kernel_size=1)self.branch5x5_1 = nn.Conv2d(in_channels, 16, kernel_size=1)# [64,16,28,28]-[64,24,28,28] 通过卷积核为5的卷积,因为w,h分别填充了2,所以图像尺寸不变self.branch5x5_2 = nn.Conv2d(16,24, kernel_size=5,padding=2)self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1)# [64,16,28,28]-[64,24,28,28] 通过卷积核为3的卷积,因为填充了1,所以图像尺寸不变self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1)# [64,24,28,28]-[64,24,28,28] 通过卷积核为3的卷积,因为填充了1,所以图像尺寸不变self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)#[64,1,28,28]-[64,24,28,28]self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)def forward(self,x):branch1x1 = self.branch1x1(x)branch5x5 = self.branch5x5_1(x)branch5x5 = self.branch5x5_2(branch5x5)branch3x3 = self.branch3x3_1(x)branch3x3 = self.branch3x3_2(branch3x3)branch3x3 = self.branch3x3_3(branch3x3)#平均池化尺寸不变branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)branch_pool = self.branch_pool(branch_pool)outputs = [branch1x1, branch5x5, branch3x3, branch_pool]#[b,c,h,w] dim=1是维度方向拼接 ,这里返回的维度是上述几个维度相加(16+24+24+24=88)return torch.cat(outputs, dim=1)
模块示意图
通过盗梦空间的图片,只更改其的通道数量,而不更改图像的尺寸大小,因此在维度方向进行拼接,上图拼接后的通道数量为24+16+24+24=88,对应了下面第二层卷积层的输入维度。
将盗梦空间结构嵌入到我们的网络中
# 接下来我们看一下模型是怎么做的
class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()# 定义了我们第一个要用到的卷积层,因为图片输入通道为1,第一个参数就是# 输出的通道为10,kernel_size是卷积核的大小,这里定义的是5x5的self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)# 看懂了上面的定义,下面这个你肯定也能看懂self.conv2 = torch.nn.Conv2d(88, 20, kernel_size=5)#调用盗梦空间self.incep1 = InceptionA(in_channels=10)self.incep2 = InceptionA(in_channels=20)# 再定义一个池化层self.mp = torch.nn.MaxPool2d(2)# 最后是我们做分类用的线性层self.fc = torch.nn.Linear(1408, 10)# 下面就是计算的过程def forward(self, x):# Flatten data from (n, 1, 28, 28)batch_size = x.size(0) # 这里面的0是x大小第1个参数,自动获取batch大小#(64, 1, 28, 28)经过10组kernel=5的卷积 ((64, 10, 24, 24)),通过最大池化(64, 10, 12, 12)x = F.relu(self.mp(self.conv1(x)))# 输入到盗梦空间(64, 10, 12, 12),尺寸不变,维度相加(64, 88, 12, 12)x = self.incep1(x)# (64, 88, 12, 12)经过20组kernel=5的卷积 ((64, 20, 8, 8)),通过最大池化(64, 20, 4, 4)x = F.relu((self.mp(self.conv2(x))))#输入到盗梦空间(64, 20, 4, 4),尺寸不变,维度相加(64, 88, 4, 4) ioriwx = self.incep2(x)# 为了给我们最后一个全连接的线性层用# 我们要把一个二维的图片(实际上这里已经是处理过的)64X88x4x4张量变成一维的x = x.view(batch_size, -1) # flatten#64X88x4x4改变为64x1408# 经过线性层,确定他是0~9每一个数的概率#64x1408改变为64x10 因为手写数据集10个分类x = self.fc(x)return x
总结
学无止境,越走下去,发现自己不懂的越多,深感渺小,还需继续努力。
Inception(盗梦空间)及代码实现相关推荐
- Inception V3论文解读和代码解析
目录 论文解读 代码解析 小结 论文解读 在介绍inception V2时提到过,inception V3的论文依据是Rethinking the Inception Architecture for ...
- 卷积神经网络(高级篇) Inception Moudel
Inception Moudel 1.卷积核超参数选择困难,自动找到卷积的最佳组合. 2.1x1卷积核,不同通道的信息融合.使用1x1卷积核虽然参数量增加了,但是能够显著的降低计算量(operatio ...
- 图像质量评价指标FID、LPIPS、NIQE及其代码
文章目录 FID LPIPS NIQE FID FID的全称是Fréchet Inception Distance,用于衡量两个多元正态分布的距离,数值越小越好.具体的,FID使用Inception ...
- 不写代码?程序员必看的那些电影
不同领域有时候总会共享相同概念.很多计算机编程中的概念被用于电影之中.其中有些电影非常酷,它们甚至还帮助程序员理解一些编程概念.下面这些电影是我的Top 10,还有我认为它们用到的计算机编程概念. & ...
- Inception结构详解(从V1到V4,再到xcpetion)
目录 Inception概述 为什么要用inception Inception结构 NiN对Inception的启发 Inception v1 Inception v2 Batch Normaliza ...
- tensorflow实现inception V3
一.Inception V3结构介绍 1.Inception网络结构 在上图中下一层的输入是上一层的输出,在Inception V3中采用下面两种结构来减少图片的尺寸 在Inception V3中,卷 ...
- [译] TensorFlow 教程 - 07 Inception 模型
本文主要演示了如何使用Inception v3模型进行图像识别. 01 - 简单线性模型 | 02 - 卷积神经网络 | 03 - PrettyTensor | 04 - 保存& 恢复 05 ...
- 卷积神经网络补充—GoogleNet
复杂神经网络的问题 简单神经网络 我们注意这样的一个问题,我们在之前的学习当中使用的都是简单的一条龙走下来的方式进行学习,这种是比较基础的,没有分叉,没有循环,就是一条路走完.可以看到之前学的都是特别 ...
- 程序员必看的那些电影
原文链接:http://blog.jobbole.com/51530/ 不同领域有时候总会共享相同概念.很多计算机编程中的概念被用于电影之中.其中有些电影非常酷,它们甚至还帮助程序员理解一些编程概念. ...
- 【论文阅读】GoogLeNet(2014)
题目:Going deeper with convolutions.Rethinking the Inception Architecture for Computer Vision 链接:https ...
最新文章
- iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view...
- microsoft 官方学习资源
- java大型wms架构设计_Java生鲜电商平台-库存管理设计与架构
- matlab摄像头录像保存在哪里,matlab连接摄像头读取视频部分解释
- Spring Boot Admin:微服务应用监控
- POJ - 2186 Popular Cows(强连通缩点)
- 解决 spring-cloud-starter-zipkin 启动错误
- char类型和Unicode编码
- android10 三星升级计划,Android 10.0(Q OS)系统升级计划Androi
- 第一:Git安装和使用github(超详解)
- 网易云课堂测试微专业前置课
- c++在数组中添加元素_39. 数组中数值和下标相等的元素
- jpeglib的jpeg_finish_compress函数疑似越界
- 【声源定位】基于matlab不同信噪比下麦克风接收信号【含Matlab源码 546期】
- 橘子无法启动计算机丢失,《战地1》橘子平台无法启动 橘子意料之外的问题解决方法...
- SpreadJS 15.1 ~【SpreadJS 15.0】
- basic4android 开发 使用类库方法
- imagej得到灰度图数据_老司机带你解锁ImageJ的各种技术姿势
- SRRC认证问题合集
- 20190919CF训练
热门文章
- SQL查询执行某条SQL语句所花费的时间
- java把一个文件转化为byte字节_java把一个文件转化为byte字节
- 如何检查你的MAC是不是原封正品
- 学习《西方哲学史》摘录
- 计算机硬件设备ppt教案,《计算机硬件基础》PPT课件.ppt
- unity物体自身轴旋转_Unity 中物体的旋转
- 【Proteus仿真】HC-SRF04超声波测距传感器数码管显示
- 还在烦恼ToF的误差问题?有人帮你找到解决方法了!
- 居于canvas的原生js抽奖小程序
- 红米手机html文件,红米手机中ES文件浏览器无法删除SD卡中文件的解决办法-es文件浏览器...