1. LeNet(1998)

 """
note:
LeNet:
输入体:32*32*1
卷积核:5*5
步长:1
填充:无
池化:2*2
代码旁边的注释:卷积或者池化后的数据的尺寸
"""
import torch
import torch.nn as nn class LeNet(nn.Module):
def __init__(self):
super(LeNet,self).__init__()
layer1 = nn.Sequential()
layer1.add_module('conv1',nn.Conv2d(1,6,5,1,padding=0))# 没有填充 ,b,6,28*28
layer1.add_module('pool1',nn.MaxPool2d(2,2)) # 6,14*14 (28-2)/2+1 = 14
self.layer1= layer1 layer2 = nn.Sequential()
layer2.add_module('conv2', nn.Conv2d(6, 16, 5, 1, padding=0)) # 没有填充 b,16,10*10
layer2.add_module('pool2', nn.MaxPool2d(2, 2)) # 16,5*5
self.layer2 = layer2 layer3 = nn.Sequential()
layer3.add_module('fc1',nn.Linear(400,120))
layer3.add_module('fc2',nn.Linear(120,84))
layer3.add_module('fc3',nn.Linear(84,10))
self.layer3 = layer3 def forward(self,x):
x = self.layer1(x)
x = self.layer2(x)
x = x.view(x.size(0),-1) # 将多维数据排列成一行:1*400(16*5*5)
x = self.layer3(x)
return x

2.AlexNet(2012):层数更深,同时第一次引入了激活层ReLU,在全连接层引入了Dropout层防止过拟合

3.VGGNet(2014):有16~19层网络,使用了3*3的卷积滤波器和2*2的池化层。只是对网络层进行不断的堆叠,并没有太大的创新,增加深度缺失可以一定程度改善模型效果。

4.GoogleLeNet:(InceptionNet)(2014):比VGGNet更深的网络结构,一共22层,但是它的参数比AlexNet少了12倍,同时有很高的计算效率,因为它采用了一种有效的Inception模块,而且它也没有全连接层。Inception模块设计了一个局部的网络拓扑结构,然后将这些模块堆叠在一起形成一个抽象层次的网络结构。具体来说是运用几个并行的滤波器对输入进行卷积核池化,这些滤波器有不同的感受野,最后将输出的结果按深度拼接在一起形成输出层。缺点:参数太多,导致计算复杂。这些模块增加了一些1*1的卷积层来降低输入层的维度,使网络参数减少,从而减少网络的复杂性。

 """
GooglNet的Inceoption模块,整个GoogleNet都是由这些Inception模块组成的
nn.BatchNorm1d:在每个小批量数据中,计算输入各个维度的均值和标注差。
num_features:期望输入大小:batch_size * num_features
torch.cat:将不同尺度的卷积深度相加,只是深度不同,数据体大小是一样的
(0)表示增加行,(1)表示增加列
""" import torch.nn as nn
import torch
import torch.nn.functional as F class BasicConv2d(nn.Module):
def __init__(self,in_channels,out_channles,**kwargs):
super(BasicConv2d,self).__init__()
self.conv = nn.Conv2d(in_channels,out_channles,bias=False,**kwargs)
self.bn = nn.BatchNorm1d(out_channles,eps=0.001) def forward(self,x):
x = self.conv(x)
x = self.bn(x)
return F.relu(x,inplace = True) class Inception(nn.Module):
def __init__(self,in_channles,pool_features):
super(Inception,self).__init__()
self.branch1x1 = BasicConv2d(in_channles,64,kernel_size = 1) self.branch5x5_1 = BasicConv2d(in_channles,48,kernel_size = 1)
self.branch5x5_2 = BasicConv2d(48,64,kernel_size = 5,padding = 2) self.branch3x3dbl_1 = BasicConv2d(in_channles,64,kernel_size = 1)
self.branch3x3dbl_2 = BasicConv2d(64,96,kernel_size = 3,padding = 1)
#self.branch3x3dbl_3 = BasicConv2d(96,96,kernel_size = 3,padding = 1) self.branch_pool = BasicConv2d(in_channles,pool_features,kenel_size = 1) def forward(self, x):
branch1x1 = self.branch1x1(x) branch5x5 = self.branch5x5_1(x) # 核是1
branch5x5 = self.branch5x5_2(branch5x5) #核是5 branch3x3 = self.branch3x3dbl_1(x) # 核是1
branch3x3 = self.branch3x3dbl_2(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]
return torch.cat(outputs,1)

5.ResNet(2015)

  在不断加深神经网络的时候,会出现准确率先上升然后达到饱和,再持续增加深度会导致模型准确率下降,这并不是过拟合问题,因为不仅在验证集上误差增加,训练集本身误差也会增加,假设一个比较浅的网络达到了饱和的准确率,那么在后面加上几个恒等的映射层,误差不会增加,也就是说更深的模型起码不会使得模型效果下降。假设某个神经网络的输入是x,期望输出值是H(x),如果直接把输入x传到输出作为初始结果,那么此时需要学习的目标就是F(x) = H(x)- x,即残差。ResNet相当于将学习目标改变了,不再学习一个完整的输出H(x),而是学习输出和输入的差别 H(x)-x

 import torch
import torch.nn as nn def conv3x3(in_planes,out_plans,stride = 1):
return nn.Conv2d(
in_planes,
out_plans,kernel_size=3,
stride=stride,
padding=1,
bias = False
) class BasicBlock(nn.Module):
def __init__(self,inplanes,planes,stride = 1,downsample = None):
super(BasicBlock,self).__init__()
self.conv1 = conv3x3(inplanes,planes,stride)
self.bn1 = nn.BatchNorm2d(planes)
self.relu = nn.ReLU(inplace=True)
self.conv2 = conv3x3(planes,planes)
self.bn2 = nn.BatchNorm2d(planes)
self.downsample = downsample
self.stride = stride def forward(self,x):
residual = x
out = self.conv1(x) out = self.bn1(out)
out = self.relu(out) out = self.conv2(out)
out = self.bn2(out) if self.downsample is not None:
residual = self.downsample(x) out += residual
out = self.relu(out)
return out

torch_07_卷积神经网络案例分析的更多相关文章

  1. 深度学习项目——基于卷积神经网络(CNN)的人脸在线识别系统

    基于卷积神经网络(CNN)的人脸在线识别系统 本设计研究人脸识别技术,基于卷积神经网络构建了一套人脸在线检测识别系统,系统将由以下几个部分构成: 制作人脸数据集.CNN神经网络模型训练.人脸检测.人脸 ...

  2. C++卷积神经网络实例:tiny_cnn代码具体解释(7)——fully_connected_layer层结构类分析

    之前的博文中已经将卷积层.下採样层进行了分析.在这篇博文中我们对最后一个顶层层结构fully_connected_layer类(全连接层)进行分析: 一.卷积神经网路中的全连接层 在卷积神经网络中全连 ...

  3. C++卷积神经网络实例:tiny_cnn代码具体解释(6)——average_pooling_layer层结构类分析

    在之前的博文中我们着重分析了convolutional_layer类的代码结构.在这篇博文中分析相应的下採样层average_pooling_layer类: 一.下採样层的作用 下採样层的作用理论上来 ...

  4. C++卷积神经网络实例:tiny_cnn代码具体解释(8)——partial_connected_layer层结构类分析(上)

    在之前的博文中我们已经将顶层的网络结构都介绍完毕,包括卷积层.下採样层.全连接层,在这篇博文中主要有两个任务.一是总体贯通一下卷积神经网络在对图像进行卷积处理的整个流程,二是继续我们的类分析.这次须要 ...

  5. 技术干货丨卷积神经网络之LeNet-5迁移实践案例

    摘要:LeNet-5是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一.可以说 ...

  6. 深度学习之卷积神经网络(CNN)

    卷积神经网络(CNN)因为在图像识别任务中大放异彩,而广为人知,近几年卷积神经网络在文本处理中也有了比较好的应用.我用TextCnn来做文本分类的任务,相比TextRnn,训练速度要快非常多,准确性也 ...

  7. 用深度学习LSTM炒股:对冲基金案例分析

    英伟达昨天一边发布“全球最大的GPU”,一边经历股价跳水20多美元,到今天发稿时间也没恢复过来.无数同学在后台问文摘菌,要不要抄一波底嘞? 今天用深度学习的序列模型预测股价已经取得了不错的效果,尤其是 ...

  8. 从环境搭建到回归神经网络案例,带你掌握Keras

    摘要:Keras作为神经网络的高级包,能够快速搭建神经网络,它的兼容性非常广,兼容了TensorFlow和Theano. 本文分享自华为云社区<[Python人工智能] 十六.Keras环境搭建 ...

  9. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

随机推荐

  1. 大一结业项目之一(C#晨曦超市管理系统 )

                                             C#晨曦超市管理系统                            我现是湖南工程职业技术学院大一的学生,很快 ...

  2. python3之int类的常用方法练习

    int类的常用方法练习 #coding:utf-8 #int类的常用方法 num1 = 18 num2 = -15 #查询创建num1所用的类 print(type(num1)) #num1占用的最小 ...

  3. Java学习——包装类

    Java学习——包装类 摘要:本文主要介绍了Java中常用的包装类和基本类型之间的转换,包装类或基本类型和String之间的转换. 部分内容来自以下博客: https://www.cnblogs.co ...

  4. JavaScript全局属性和全局函数

    JavaScript全局属性和全局函数可以与所有内置JavaScript对象一起使用. JavaScript全局属性 属性 描述 Infinity 表示正/负无穷大的数值 NaN "Not- ...

  5. 【转】Git使用教程之BUG分支

    1.bug分支 在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉. 比如我在开 ...

  6. C# 测试网络速度例子

    using System.Net.NetworkInformation; namespace PingExample { public partial class Form1 : Form { pub ...

  7. springboot读取自定义properties配置文件方法

    1. 添加pom.xml依赖 <!-- springboot configuration依赖 --> <dependency> <groupId>org.sprin ...

  8. jersey实现RESTful接口PUT方法JSON数据传递

    项目中使用的是org.json包 maven中的配置如下: xml <!-- https://mvnrepository.com/artifact/org.json/json --> &l ...

  9. 2019CCPC 秦皇岛 E.Escape

    传送门 题意: 给出一个\(n*m\)的迷宫,有\(a\)个入口,\(b\)个出口. 现在有\(a\)个机器人都从入口出发,一开始方向默认为下,你可以选在在一些格子上面放置一个转向器,转向器有四种: ...

  10. 什么是微信小程序?简单介绍

    1.微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有色的使用体验. 2.手机端App的另外一种新的展现形式 3.无需下载过多占用手机内存的app,小程序直接打开 ...