Inception_V2_V3_pytorch

Inception_V2_V3_pytorch

在上一节我们已经精度了Inception_V2_V3这篇论文,本篇我们将用pyorch复现论文中的网络结构!

从论文中我们可以知道InceptionV3的主要改进为:

  • 5 * 5卷积分解为2个3 * 3卷积核
  • 分解为不对称卷积
  • 滤波器组

在这里插入图片描述

我们可将GoogLeNetv3分解为以下5个模块:

  • InceptionV3模块
  • 辅助分类器模块
  • 非对称分离式卷积
  • 滤波器组
  • 用2个3 * 3卷积核代替1个5 * 5 卷积核

接下来我们将在Layers.py中定义Separable_Conv2d,Concat_Separable_Conv2d,Conv2d,Flatten,Squeeze这些类。

  • Separable_Conv2d

实现的是下面这中非对称分离式卷积结构!

在这里插入图片描述

  • Concat_Separable_Conv2d

实现的是下面滤波器组的结构

在这里插入图片描述

Layers.py中代码如下:

import torch
import torch.nn as nn# 非对称分离式卷积
class Separable_Conv2d(nn.Module):def __init__ (self,in_channels,out_channels,kernel_size,stride = 1,padding = 0):super(Separable_Conv2d,self).__init__()self.conv_h = nn.Conv2d(in_channels,in_channels,(kernel_size,1),stride=(stride,1),padding=(padding,0))self.conv_w = nn.Conv2d(in_channels,out_channels,(1,kernel_size),stride=(1,stride),padding=(0,padding))self.bn = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)def forward(self,x):x = self.conv_h(x)x = self.conv_w(x)x = self.bn(x)x = self.relu(x)return x# 滤波器组
class Concat_Separable_Conv2d(nn.Module):def __init__(self,in_channels,out_channels,kernel_size,stride = 1,padding=0):super(Concat_Separable_Conv2d,self).__init__()self.conv_h = nn.Conv2d(in_channels,in_channels,(kernel_size,1),stride=(stride,1),padding=(padding,0))self.conv_w = nn.Conv2d(in_channels,out_channels,(1,kernel_size),stride=(1,stride),padding=(0,padding))self.bn = nn.BatchNorm2d(out_channels * 2)self.relu = nn.ReLU(inplace=True)def forward(self,x):x_h = self.conv_h(x)x_w = self.conv_w(x)x = torch.cat([x_h,x_w],dim=1)x = self.bn(x)x = self.relu(x)return x# 定义基础的卷积模块添加BN和ReLU
class Conv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, output=False):super(Conv2d, self).__init__()self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)self.output = outputif self.output == False:self.bn = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)def forward(self, x):x = self.conv(x)if self.output:return xelse:x = self.bn(x)x = self.relu(x)return xclass Flatten(nn.Module):def __init__(self):super(Flatten, self).__init__()def forward(self, x):return torch.flatten(x, 1)class Squeeze(nn.Module):def __init__(self):super(Squeeze, self).__init__()def forward(self, x):return torch.squeeze(x) 
import torch
import torch.nn as nn
from Layers import *
import torch.nn.functional as F
from functools import partialclass Inceptionv3(nn.Module):def __init__(self,input_channels,conv1_channel,conv3_reduce_channel,conv3_channel,conv3_double_reduce_channel,conv3_double_channel,pool_reduce_channel,stride = 1,pool_type = 'AVG',mode = 1):super(Inceptionv3,self).__init__()self.stride = strideif stride == 2:padding_conv3 = 0padding_conv7 = 2else:padding_conv3 = 1padding_conv7 = 3if conv1_channel != 0:self.conv1 = Conv2d(input_channels,conv1_channel,kernel_size = 1)else:self.conv1 = Noneself.conv3_reduce = Conv2d(input_channels,conv3_reduce_channel,kernel_size = 1)match mode:case '1':   # 用两个3*3卷积代替一个5*5卷积self.conv3 = Conv2d(conv3_reduce_channel,conv3_channel,kernel_size = 3,stride = stride,padding = padding_conv3)self.conv3_double1 = Conv2d(conv3_double_reduce_channel,conv3_double_channel,kernel_size = 3,padding = 1)self.conv3_double2 = Conv2d(conv3_double_channel,conv3_double_channel,kernel_size = 3,stride=stride,padding = padding_conv3)case '2':   # 非对称分离式卷积self.conv3 = Separable_Conv2d(conv3_reduce_channel,conv3_channel,kernel_size = 7,stride = stride,padding = padding_conv7)self.conv3_double1 = Separable_Conv2d(conv3_double_reduce_channel,conv3_double_channel,kernel_size = 7,padding = 3)self.conv3_double2 = Separable_Conv2d(conv3_double_channel,conv3_double_channel,kernel_size = 7,stride=stride,padding = padding_conv7)case '3':   # 滤波器组self.conv3 = Concat_Separable_Conv2d(conv3_reduce_channel,conv3_channel,kernel_size = 3,stride = stride,padding = 1)self.conv3_double1 = Conv2d(conv3_double_reduce_channel,conv3_double_channel,kernel_size = 3,padding = 1)self.conv3_double2 = Concat_Separable_Conv2d(conv3_double_channel,conv3_double_channel,kernel_size = 3,stride=stride,padding = 1)self.conv3_double_reduce = Conv2d(input_channels,conv3_double_reduce_channel,kernel_size = 1)if pool_type == 'MAX':self.pool = nn.MaxPool2d(kernel_size = 3,stride = stride,padding = padding_conv3)elif pool_type == 'AVG':self.pool = nn.AvgPool2d(kernel_size = 3,stride = stride,padding = padding_conv3)if pool_reduce_channel != 0:self.pool_reduce = Conv2d(input_channels,pool_reduce_channel,kernel_size = 1)else:self.pool_reduce = Nonedef forward(self,x):output_conv3 = self.conv3(self.conv3_reduce(x))output_conv3_double = self.conv3_double2(self.conv3_double1(self.conv3_double_reduce(x)))if self.pool_reduce != None:output_pool = self.pool_reduce(self.pool(x))else:output_pool = self.pool(x)if self.conv1 != None:output_conv1 = self.conv1(x)outputs = torch.cat([output_conv1,output_conv3,output_conv3_double,output_pool],dim = 1)else:outputs = torch.cat([output_conv3,output_conv3_double,output_pool],dim = 1)return outputs
# 辅助分类器
class InceptionAux(nn.Module):def __init__(self,input_channels,num_classes):super(InceptionAux,self).__init__()self.aux = nn.Sequential(nn.AvgPool2d(kernel_size = 5,stride = 3),Conv2d(input_channels,128,kernel_size = 1),Conv2d(128,1024,kernel_size = 5),Conv2d(1024,num_classes,kernel_size = 1,output = True),Squeeze())def forward(self,x):x = self.aux(x)return x
class GoogLeNetv3(nn.Module):def __init__(self,num_classes,mode = 'train'):super(GoogLeNetv3,self).__init__()self.num_classes = num_classesself.mode = modeself.layers = nn.Sequential(Conv2d(3,32,3,stride=2),Conv2d(32,32,3,stride = 1),Conv2d(32,64,kernel_size = 3,stride=1,padding = 1),nn.MaxPool2d(kernel_size= 3 ,stride = 2),Conv2d(64,80,kernel_size = 3),Conv2d(80,192,kernel_size=3,stride=2),Conv2d(192,288,kernel_size=3,stride=1,padding=1),Inceptionv3(288,64,48,64,64,96,64,mode='1'),    #3aInceptionv3(288,64,48,64,64,96,64,mode='1'),    #3bInceptionv3(288,0,128,384,64,96,0,stride=2,pool_type='MAX',mode='1'),   #3cInceptionv3(768,192,128,192,128,192,192,mode='2'),  #4aInceptionv3(768,192,160,192,160,192,192,mode='2'),  #4bInceptionv3(768,192,160,192,160,192,192,mode='2'),  #4cInceptionv3(768,192,192,192,192,192,192,mode='2'),  #4dInceptionv3(768,0,192,320,192,192,0,stride=2,pool_type='MAX',mode='2'), #4eInceptionv3(1280,320,384,384,448,384,192,mode='3'), #5aInceptionv3(2048,320,384,384,448,384,192,pool_type='MAX',mode='3'), #5bnn.AvgPool2d(8,1),Conv2d(2048,num_classes,kernel_size=1,output=True),Squeeze(),)if mode == 'train':self.aux = InceptionAux(768,num_classes)def forward(self,x):for idx,layer in enumerate(self.layers):if(idx == 14 and self.mode == 'train'):aux = self.aux(x)x = layer(x)if self.mode == 'train':return x,auxelse:return xdef init_weights(self,init_mode = 'VGG'):def init_function(m,init_mode):if type(m) == nn.Linear or type(m) == nn.Conv2d:if init_mode == 'VGG':torch.nn.init.normal_(m.weight,mean=0.0,std=0.01)elif init_mode == 'XAVIER':fan_in,fan_out = torch.nn.init._calculate_fan_in_and_fan_out(m.weight)std = (2.0 / float(fan_in + fan_out)) ** 0.5a = (3.0)**0.5 * stdwith torch.no_grad():m.weight.uniform_(-a,a)elif init_mode == 'KAMING':torch.nn.init.kaiming_uniform(m.weight)m.bias.data.fill_(0)_ = self.apply(partial(init_function,init_mode = init_mode))
from torchsummary import summary
net = GoogLeNetv3(1000).cuda()
summary(net, (3, 299, 299))
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1         [-1, 32, 149, 149]             896BatchNorm2d-2         [-1, 32, 149, 149]              64ReLU-3         [-1, 32, 149, 149]               0Conv2d-4         [-1, 32, 149, 149]               0Conv2d-5         [-1, 32, 147, 147]           9,248BatchNorm2d-6         [-1, 32, 147, 147]              64ReLU-7         [-1, 32, 147, 147]               0Conv2d-8         [-1, 32, 147, 147]               0
...
Concat_Separable_Conv2d-331            [-1, 768, 8, 8]               0MaxPool2d-332           [-1, 2048, 8, 8]               0Conv2d-333            [-1, 192, 8, 8]         393,408BatchNorm2d-334            [-1, 192, 8, 8]             384ReLU-335            [-1, 192, 8, 8]               0Conv2d-336            [-1, 192, 8, 8]               0Conv2d-337            [-1, 320, 8, 8]         655,680BatchNorm2d-338            [-1, 320, 8, 8]             640ReLU-339            [-1, 320, 8, 8]               0Conv2d-340            [-1, 320, 8, 8]               0Inceptionv3-341           [-1, 2048, 8, 8]               0AvgPool2d-342           [-1, 2048, 1, 1]               0Conv2d-343           [-1, 1000, 1, 1]       2,049,000Conv2d-344           [-1, 1000, 1, 1]               0Squeeze-345                 [-1, 1000]               0
================================================================
Total params: 28,850,400
Trainable params: 28,850,400
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 1.02
Forward/backward pass size (MB): 270.86
Params size (MB): 110.06
Estimated Total Size (MB): 381.94
----------------------------------------------------------------

1, 1000, 1, 1] 2,049,000
Conv2d-344 [-1, 1000, 1, 1] 0
Squeeze-345 [-1, 1000] 0
================================================================
Total params: 28,850,400
Trainable params: 28,850,400
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 1.02
Forward/backward pass size (MB): 270.86
Params size (MB): 110.06
Estimated Total Size (MB): 381.94
----------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【事件总线】EventBus

文章目录 概述如何使用如何发布消息如何进行消息监听 来源 概述 事件总线是对发布-订阅模式(观察者)的一种实现,是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。 …

2024届应届生突破1179万人,如何瞄准AI行业,获得高薪职业前景

应届生如何开启AI行业的职业生涯? ©作者|Zhongmei 来源|神州问学 引言 人工智能和数据科学几乎可以在任何产生数据的场合中发挥作用,因为它们开辟了一种全新的范式——让机器能够从数据中提炼出知识。自2011年人工智能走出实验室的门槛&#xff0c…

架构师篇-4、TOGAF-ADM【4A】

内容摘要: 1、4A架构实践 2、架构方法ADM、架构语言、架构工具 本章课程交付: 1、4A架构实践 2、架构方法ADM、架构语言、架构工具 TOGAF核心方法理论 TOGAF 9.2内容结构 ADM架构开发方法 ADM工件 ADM-预备阶段 明确目标建立架构成熟度:如…

金融科技在智能投研领域的革新与未来趋势

金融科技作为当今金融行业的重要驱动力,其在智能投研领域的应用正逐渐改变传统的投资研究模式,引领着行业向更加智能、高效的方向发展。本文将从不同角度探讨金融科技在智能投研领域的革新及未来趋势。 一、技术革新:从数据分析到智能决策 金…

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端…

ONLYOFFICE 编辑器8.1,一个功能全面的编辑器

目录 官网地址:ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE 一、PDF编辑 二、PPT播放 1. 多样化的幻灯片样式与布局 2. 强大的文本编辑与格式化功能 3. 丰富的图形与图表插入功能 4. 灵活的过渡效果与动画设置 5. 舒适的呈现与演讲辅助功能 6. 便捷的团…

pdf压缩大小,PDF压缩大小不影响清晰度

你是否曾为PDF文件过大而烦恼?想要分享或上传文件时,却因为它的体积而束手无策?别担心,今天我将为大家分享一些简单实用的 PDF 压缩技巧,让你的文件轻松压缩pdf。 打开“轻云处理pdf官网”, 的网站。然后上…

Android Studio修改Standard到Custom模式的方法

这次安装Android Studio时没有照着教程安装,在选择setup模式的时候选择了Standard模式,之后C盘差点爆炸,尝试卸载之后下载重新选择Custom模式,发现不出现弹窗。 修改方法: 1.在C:\Users\用户名\AppData\Roaming\Goog…

优先级队列模拟实现

目录 1.堆的概念 2.堆性质堆中的某个元素小于或大于他的左右孩子 3.小根堆实例 4.堆创建 4.1调整思路 4.2向下调整思路 4.3代码实现(大根堆) 5.堆的删除 6.堆的插入 7.常用接口 7.1PriorityQueue和PriorityBlockingQueue 1.堆的概念 如果有一…

湖南省物联网挑战赛教学平台使用说明文档

1物联网教学平台硬件连接 1.1硬件介绍 1)物联网教学平台实验箱 2)物联网硬件平台 3)无线传感器节点 4)智能烧录平台 1.2连线 注:智能烧录平台上的USB接口必须与物联网硬件平台“开关”那一面最右侧USB接口连接 1.3修…

[Angew]:调整单原子 Pt1/CeO2催化剂中铂的局部环境以实现稳定的低温 CO 氧化

通过热冲击合成调整孤立 Pt2+的局部环境,开发出一种用于 CO 氧化的高活性和坚固的单原子 Pt1/CeO2催化剂(见图)。惰性气氛中的超快冲击波在非对称 Pt1O4结构中产生 Pt 单原子,从而大大增强了低温活性,并且在氧化条件下仍能保持活性。 摘要:通过原子捕获(AT,800C空气中…

Electron 整理文档

Electron 简介 Electron 是一个使用 JavaScript、 HTML 和 CSS 构建桌面应用程序的框架。通过将 Chromium 和 Node.js 嵌入到它的二进制文件中,Electron 允许你维护一个 JavaScript 代码库,并创建可以在 Windows、 macOS 和 Linux 上运行的跨平台应用程序…

Fastly的新API有望提高ChatGPT的可访问性

该公司报告称,Fastly AI在其 Edge Cloud Platform 上运行并利用语义缓存,加快了 AI 聊天机器人的访问时间,促进了代码生成和调试等开发人员服务。 该公司暗示,它可能会通过扩展这一专门的 API 来拓宽其 AI 战略,以便未…

ONLYOFFICE 桌面编辑器 8.1 发布:全新 PDF 编辑器、幻灯片版式、增强 RTL 支持及更多本地化选项

目录 什么是ONLYOFFICE? ONLYOFFICE 主要特点包括: 官网信息: 1. 功能齐全的 PDF 编辑器 1.1 编辑 PDF 文本 1.2 插入和修改对象 1.3 创建和填写表单 2. 幻灯片版式功能 2.1 快速应用幻灯片版式 2.2 动画窗格的改进 3. 文档编辑、…

同元软控智能电动汽车数字化解决方案亮相CICV 2024

2024年6月18日-20日,由中国汽车工程学会、国家智能网联汽车创新中心、清华大学车辆与运载学院、清华大学智能绿色车辆与交通全国重点实验室举办的第十一届国际智能网联汽车技术年会(CICV 2024)在北京召开。苏州同元软控信息技术有限公司&…

冻干食品市场飙升至新高度,预计到 2030 年将达到 717 亿美元

冻干食品市场,近年来经历了显著增长,2021 年价值 372 亿美元,预计到 2030 年将达到 717 亿美元。 从2022年到2030年,这一强劲的扩张是由7.7%的复合年增长率推动的,这是由于多种因素造成的,包括食品加工行…

营销复盘秘籍,6步法让你的活动效果翻倍

在营销的世界中,每一次活动都是一次探险,而复盘就是探险后的宝藏图,指引我们发现问题、提炼经验、优化策略。 想要学习如何复盘,只要了解以下复盘六大步骤,即可不断总结,逐渐走向卓越。 第一步&#xff1…

超级内卷时代,这样做,刻不容缓

分享一个月入十万的赚钱项目 别再抱怨手上项目不好做,生意不好做了,这只是个开始,长远来看,2024应该是未来几年中经济环境最好的一年,我们所有人都已经进入到“超级内卷”时代! 随着竞争环境越来越激烈&…

斯坦福大学 AI 研究部门推出的“7 周人工智能学习计划”

①AI Python 基础,包括计算机原理、语法、判断语句等; ②AI Python 进阶,涉及 Linux 命令、多任务编程等; ③机器学习,涵盖算法、数据结构等; ④计算机视觉与图像处理,包含图像分类、目标检测…