原理

DPN这个模型融入了三种基础模型,inception,resnet,densenet。有inception的宽度,又有resnet的shortcut利用,和densenet的浅层特征重复利用

tensor的切片操作:a 是 [2,3,5,5], 那么 a[:,:1,:,:] 就是 [2,1,5,5]。a,b 都是 [2,3,5,5] ,那么 torch.cat([a[:,:1,:,:] + b[:,:1,:,:]], dim=1) 还是 2, 1, 5, 5], 数据相加,值大小的变化。但 torch.cat([a[:,:1,:,:], b[:,:1,:,:]], dim=1) 是 [2, 2, 5, 5],拼接了一个特征图。通道数的改变。

代码实现

# DPN这个模型融入了三种基础模型,inception,resnet,densenet。
# 有inception的宽度,又有resnet的shortcut利用,和densenet的浅层特征重复利用# tensor的切片操作:a 是 [2,3,5,5], 那么 a[:,:1,:,:] 就是 [2,1,5,5]
# a,b 都是 [2,3,5,5] ,那么 torch.cat([a[:,:1,:,:] + b[:,:1,:,:]], dim=1) 还是 2, 1, 5, 5], 数据相加,值大小的变化
# 但 torch.cat([a[:,:1,:,:], b[:,:1,:,:]], dim=1) 是 [2, 2, 5, 5],拼接了一个特征图。通道数的改变from time import sleep
import torch
import torch.nn as nnclass block(nn.Module):def __init__(self, in_channels, mid_channels, out_channels, dense_channels, stride, is_shortcut=False):# in_channels,是输入通道数,mid_channel是中间经历的通道数,out_channels是经过一次板块之后的输出通道数。# dense_channels设置这个参数的原因就是一边进行着resnet方式的卷进运算,另一边也同时进行着dense的卷积计算,之后特征图融合形成新的特征图super().__init__()self.is_shortcut = is_shortcutself.out_channels = out_channelsself.relu = nn.ReLU(inplace=True)self.conv1 = nn.Sequential(nn.Conv2d(in_channels, mid_channels, kernel_size=1, bias=False),nn.BatchNorm2d(mid_channels),nn.ReLU())self.conv2 = nn.Sequential(nn.Conv2d(mid_channels, mid_channels, kernel_size=3, stride=stride, padding=1, groups=32, bias=False),nn.BatchNorm2d(mid_channels),nn.ReLU())self.conv3 = nn.Sequential(nn.Conv2d(mid_channels, out_channels+dense_channels, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels+dense_channels))if self.is_shortcut:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels+dense_channels, kernel_size=3, padding=1, stride=stride, bias=False),nn.BatchNorm2d(out_channels+dense_channels))def forward(self, x):a = xx = self.conv1(x)x = self.conv2(x)x = self.conv3(x)if self.is_shortcut:a = self.shortcut(a)d = self.out_channelsx = torch.cat([a[:,:d,:,:] + x[:,:d,:,:], a[:,d:,:,:], x[:,d:,:,:]], dim=1) # 记住拼接方法# 有一步的  a[:,d:,:,:], x[:,d:,:,:]  不对  原因:conv3 的设置不对x = self.relu(x)return xdef DPN92():cfg = {'mid_channels': (96,192,384,768),'out_channels': (256,512,1024,2048),'num': (3,4,20,3),'dense_channels': (16,32,24,128),'classes': (10)}return DPN(cfg)class DPN(nn.Module):def __init__(self, cfg):super().__init__()mid_channels = cfg['mid_channels']out_channels = cfg['out_channels']num = cfg['num']dense_channels = cfg['dense_channels']self.in_channels = 64 # 输入通道64self.conv1 = nn.Sequential(nn.Conv2d(3, 64, 7, 2, 3, bias=False), # 把3变成64nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(3, 2, 1))self.conv2 = self._make_layers(mid_channels[0], out_channels[0], dense_channels[0], 1, num[0]) # stride=1self.conv3 = self._make_layers(mid_channels[1], out_channels[1], dense_channels[1], 2, num[1])self.conv4 = self._make_layers(mid_channels[2], out_channels[2], dense_channels[2], 2, num[2])self.conv5 = self._make_layers(mid_channels[3], out_channels[3], dense_channels[3], 2, num[3])self.global_avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(cfg['out_channels'][3] + (num[3]+1) * cfg['dense_channels'][3], cfg['classes']) # fc层需要计算def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = self.global_avgpool(x)x = torch.flatten(x, 1) # 展开x = self.fc(x)return xdef _make_layers(self, mid_channels, out_channels, dense_channels, stride, num):layers = []layers.append(block(self.in_channels, mid_channels, out_channels, dense_channels, stride=stride, is_shortcut=True))# block_1里面is_shortcut=True就是resnet中的shortcut连接,将浅层的特征进行一次卷积之后与进行三次卷积的特征图相加# 后面几次相同的板块is_shortcut=False简单的理解就是一个多次重复的板块,第一次利用就可以满足浅层特征的利用。后面重复的不在需要self.in_channels = out_channels + dense_channels*2# self.in_channels = out_channels + 2*dense_channels由于里面包含dense这种一直在叠加的特征图计算,# 所以第一次是2倍的dense_channels,每次一都会多出一倍,所以有(i+2)*dense_channelsfor i in range(1,num):layers.append(block(self.in_channels, mid_channels, out_channels, dense_channels, stride=1))self.in_channels = out_channels + (i+2)*dense_channelsreturn nn.Sequential(*layers)if __name__ == '__main__':net = DPN92()x = torch.rand((10, 3, 224, 224))for name,layer in net.named_children():if name != 'fc':x = layer(x)print(name, 'output shape:', x.shape)else:# x = x.view(x.size(0), -1)x = torch.flatten(x, 1) # 一模一样x = layer(x)print(name, 'output shape:', x.shape)

参考文章:

pytorch实现DPN 最详细的全面讲解_视觉盛宴的博客-CSDN博客

经典神经网络 -- DPN : 设计原理与pytorch实现相关推荐

  1. 经典滤波器的设计原理

    前言 想写一篇文章,包含经典滤波器的万象. 1.滤波器基础知识 总的来说,滤波器可分为经典滤波器和现代滤波器两大类.经典滤波器是假定输入信号x(n)中的有用成分和希望去除的成分各自占有不同的频带.这样 ...

  2. 深度解析LSTM神经网络的设计原理

    引人入胜的开篇: 想要搞清楚LSTM中的每个公式的每个细节为什么是这样子设计吗?想知道simple RNN是如何一步步的走向了LSTM吗?觉得LSTM的工作机制看不透?恭喜你打开了正确的文章! 前方核 ...

  3. 神经网络处理器设计原理,神经网络控制系统设计

    谷歌发布tpu研究论文,神经网络专用处理器是怎样炼成的 TPU的需求大约真正出现在6年之前,那时我们在所有产品之中越来越多的地方已开始使用消耗大量计算资源的深度学习模型:昂贵的计算令人担忧. 假如存在 ...

  4. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  5. 《不只是美:信息图表设计原理与经典案例》—— 2.5 功能限制形式

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第2章,第2.5节,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公 ...

  6. PrivacyIN Week2 | 张宇鹏博导开讲经典零知识证明协议设计原理

    前言 隐私研究院[PrivacyIN]第一期ZK训练营课程精讲内容上线,本期课堂邀请到美国德州农工大学(Texas A&M University)计算机科学与工程学院的助理教授张宇鹏,主要介绍 ...

  7. 《不只是美:信息图表设计原理与经典案例》—— 第2章 形式与功能:可视是一种技术...

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第2章,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  8. 《不只是美:信息图表设计原理与经典案例》—— 1.1 理性乐观派观派

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第1章,第1.1节,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公 ...

  9. 经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)

    前言 在上一期中介绍了VGG,VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩,而今天要介绍的就是同年分类任务的第一名--GoogLeNet . 作为2014年Ima ...

  10. 深度学习入门笔记(二十):经典神经网络(LeNet-5、AlexNet和VGGNet)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

最新文章

  1. 不相交轮换的乘积怎么求_谁能告诉我 轮换的乘积 怎么做?具体题目是
  2. PHP ----MySQL 数据库
  3. 机会难得,当当网抄底(五折+专属大额优惠码)优惠,双十一我囤了这些书!...
  4. 截取字符串,但要保证汉字不被截取半个
  5. Hadoop集群(第3期)_VSFTP安装配置
  6. java异步线程内存可见性实验
  7. 删除Terminating状态的Pod
  8. 【转】wpa_supplicant与wpa_cli之间通信过程
  9. asp.net MVC错误:uses 'System.Web.WebPages, Version=2.0.0.0, ....which has a higher version...
  10. Linux之/etc/group文件
  11. matlab矩阵中每一行数除以一个数
  12. DOCTYPE用法详解
  13. .net c#购物车模块分析
  14. 恒压板框过滤实验数据处理_中学少见、高考常考的化学实验仪器
  15. atitit 数字音频技术概论 艾提拉著 目录 1. 声学基础 2 1.1. 1.2人耳的听觉效应9 2 2. 第1章数字音频基础 2 2.1. 1.1音频的发展历史 2 2.2. 1.2音频的发展
  16. 快讯:百度正式宣布CTO李一男离职
  17. mybatis plus+spring boot 多租户动态数据源实现方案
  18. 网上关于豆瓣的思考搜集
  19. 详细剖析PS软件中的通道原理,让你完全理解颜色通道与Alpha通道
  20. 关于迪文屏T5L使用C51编程

热门文章

  1. Hibernate 双向一对多映射
  2. Hadoop step by step _ install and configuration environment
  3. MFC ------- AfxGetMainWnd( )
  4. COVID-19知识图谱问答系统(基于REFO)
  5. python绘图-增加子区域
  6. Nginx服务器学习(一)CentOS7系统安装Nginx
  7. 仿淘宝验证码 php,PHP中仿制 ecshop验证码实例
  8. win2012故障转移mysql集群_在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
  9. 数据结构-----队列笔记
  10. Android context.getSystemService的简单说明