卷积神经网络层结构概述

一、卷积神经网络基本的层结构

(一)卷积层

1.可参考此文章:https://blog.csdn.net/tjlakewalker/article/details/83275322
2.实现代码:

import torch.nn as nn
conv = nn.Conv2d(in_channels=3,   #输入通道
                 out_channels=64, #输出通道
                 kernel_size=3,   #卷积核
                 stride=1)        #步长
print(conv)
# 结果:Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1))

3.输出矩阵的大小计算公式

W:输入矩阵边长  F:过滤器边长  P:填充数  S:步长
输出的正方形矩阵边长:(W-F+2P)/S+1

(二)反卷积层

简单地说就是卷积的反向操作
pytorch中有两种反卷积方法
1.双线性插值上采样:

import torch.nn as nn
bilinear_layer = nn.UpsamplingBilinear2d(size = None,             #期望的输出尺寸
                                         scale_factor = None)     #缩放因子:决定缩放的大小                                         

2.转置卷积

import torch.nn as nn
transpose_conv = nn.ConvTranspose2d(in_channels = None,    #输入通道
                                    out_channels = None,   #输出通道
                                    kernel_size = None,    #卷积核
                                    stride = None,         #步长
                                    padding = None)       #填充数                              

转置卷积是通过学习的方式,即在训练中更新卷积核的参数,完成上采样,其计算结果更具鲁棒性,缺点是会增加模型的训练时间和训练参数;其代码比卷积层代码仅多了一个填充参数,其余参数不变

(三)池化层

1.最大池化

import torch.nn as nn
maxpool_layer = nn.MaxPool2d(kernel_size = None,    #卷积核
                             stride = None,         #步长
                             padding = None,        #填充数
                             dilation = None,       #膨胀数
                             return_indices = None, #是否返回元素的位置信息
                             ceil_mode=None)        #是否向上取整

2.平均池化

import torch.nn as nn
average_layer = nn.AvgPool2d(kernel_size = None,        #卷积核
                             stride = None,             #步长
                             padding = None,            #填充数
                             ceil_mode=None)            #是否向上取整

3.Mixed pooling
4.Stochastic Pooling

特点:
1.池化层是对输入的特征图进行压缩
2.池化层可以使特征图变小简化计算
3.池化不断抽取局部区域的特征,但不关心区域的位置,目标位置在较小的移动之后扔保持相同的结果,在一定程度上可以增加了平移不变性

(四)正则化层

全称Batch Normalization(BN),就是归一化处理
好处:减轻对初始数据的依赖;加速训练,学习率可以设置更高
坏处:一来batch的大小,batch不同,方差和均值的计算不稳定。------>BN层不适合batch较小的场景,也不适合RNN(RNN是动态网络结构,batch有长有短),只适合batch较大的场景

import torch.nn as nn
conv = nn.Conv2d(in_channels=3,   #输入通道
                 out_channels=64, #输出通道
                 kernel_size=3,   #卷积核
                 stride=1)        #步长
BN = nn.BatchNorm2d(64)           #BN层参数紧跟卷积层的输出参数

(五)全连接层

import torch.nn as nn
linear = nn.Linear(in_features=None,   #输入通道数
                   out_features=None)  #输出通道数:一般是输出类别数

当特征图纬度过大时,可以通过几个全连接层完成降纬,最后一个全连接层的输出通道为最终的分类类别:

import torch.nn as nn
linear_1 = nn.Linear(2048,512)  #通过两个全连接层由2048降至5
linear_2 = nn.Linear(512,5)  

二、搭建一个简单的完整的神经网络结构

(一)一般步骤

(1)class类的命名:要继承nn.Module
(2)init部分:完成层的构建(可以按照不同的方法来完成各个层结构的构建)
1.层层堆叠法:利用torch.nn逐一构建层结构
2.Sequential时序容器法:但是输出层结构时无名字,只有0、1、2等代号
3.Sequential+add_module法:可以给容器中各层赋予对应的名字
4.Sequential+OrderedDict法:时序容器+有序字典的方式,对层结构和各自对应的名字,同一完成构建
(3)forward部分:完成输入在神经网络中的前向传播过程

(二)构建方法示例

(1)层层堆叠法

#通过层层堆叠方式构建网络
import torch.nn as nn
class Net1(nn.Module):
    def __init__(self):
        super(Net1, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 3, 1, 1)     #定义卷积层conv1
        self.relu = nn.ReLU()                      #定义激活函数
        self.pool = nn.MaxPool2d(2)                #定义池化层
        self.dense1 = nn.Linear(32 * 3 * 3, 128)   #构建两个全连接层dense1,dense2
        self.dense2 = nn.Linear(128, 10)
    def forward(self,x):                           #前向传播过程
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(x.size(0), -1)                  #拉伸为1维
        x = self.dense1(x)
        x = self.relu(x)
        x = self.dense2(x)
        return x
net = Net1()
print(net)
# 结果
# Net1(
#   (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
#   (relu): ReLU()
#   (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   (dense1): Linear(in_features=288, out_features=128, bias=True)
#   (dense2): Linear(in_features=128, out_features=10, bias=True)
# )

层层堆叠的方式构建,输出网络层结构时显示的层结构顺序是命名的先后顺序,不代表实际前向传播的层结构顺序

(2)Sequential时序容器法

#通过sequential时序容器构建网络
import torch.nn as nn
class Net2(nn.Module):
    def __init__(self):
        super(Net2, self).__init__()
        self.conv = nn.Sequential(       #在第一个时序容器conv中依次构建卷积、激活、池化层
            nn.Conv2d(3, 32, 3, 1, 1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        self.dense = nn.Sequential(      #在第二个时序容器dense中依次构建全连接、激活、全连接层
            nn.Linear(32 * 3 * 3, 128),
            nn.ReLU(),
            nn.Linear(128, 10)
        )
    def forward(self,x):                 #前向传播
        conv_out = self.conv(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out
net = Net2()
print(net)
# 结果
# Net2(
#   (conv): Sequential(
#     (0): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
#     (1): ReLU()
#     (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   )
#   (dense): Sequential(
#     (0): Linear(in_features=288, out_features=128, bias=True)
#     (1): ReLU()
#     (2): Linear(in_features=128, out_features=10, bias=True)
#   )
# )

利用Sequential构建,基本上代表了前向传播的顺序(纬度操作是不会显示在输出的网络结构中,如代码中的拉伸view操作);输出层结构时无名字,只有0、1、2等代号

(3)Sequential+add_module法

#通过Sequential+add_module构建网络
import torch.nn as nn
class Net3(nn.Module):
    def __init__(self):
        super(Net3, self).__init__()
        self.conv = nn.Sequential()     #先构建空的Sequential容器,再往里添加
        self.conv.add_module("conv1", nn.Conv2d(3, 32, 3, 1, 1))
        self.conv.add_module("relu1", nn.ReLU())
        self.conv.add_module("pool1", nn.MaxPool2d(2))


        self.dense = nn.Sequential()
        self.dense.add_module("dense1", nn.Linear(32 * 3 * 3, 128))
        self.dense.add_module("relu2", nn.ReLU())
        self.dense.add_module("dense2", nn.Linear(128, 10))
    def forward(self,x):
        conv_out = self.conv(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out
net = Net3()
print(net)
# 结果
# Net3(
#   (conv): Sequential(
#     (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
#     (relu1): ReLU()
#     (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   )
#   (dense): Sequential(
#     (dense1): Linear(in_features=288, out_features=128, bias=True)
#     (relu2): ReLU()
#     (dense2): Linear(in_features=128, out_features=10, bias=True)
#   )
# )

可以给容器中各层赋予对应的名字,但网络深的话代码繁琐

(4)Sequential+OrderedDict法

#通过Sequential+OrderedDict法构建网络
import torch.nn as nn
from collections import OrderedDict
class Net4(nn.Module):
    def __init__(self):
        super(Net4, self).__init__()
        self.conv = nn.Sequential(
            OrderedDict(
                [
                    ('conv1', nn.Conv2d(3, 32, 3, 1, 1)),
                    ('relu1', nn.ReLU()),
                    ('pool1', nn.MaxPool2d(2))
                ]
            )
        )

        self.dense = nn.Sequential(
            OrderedDict(
                [
                    ('dense1', nn.Linear(32 * 3 * 3, 128)),
                    ('relu2', nn.ReLU()),
                    ('dense2', nn.Linear(128, 10))
                ]
            )
        )
    def forward(self,x):
        conv_out = self.conv(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out
net = Net4()
print(net)
# 结果
# Net4(
#   (conv): Sequential(
#     (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
#     (relu1): ReLU()
#     (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   )
#   (dense): Sequential(
#     (dense1): Linear(in_features=288, out_features=128, bias=True)
#     (relu2): ReLU()
#     (dense2): Linear(in_features=128, out_features=10, bias=True)
#   )
# )

序容器+有序字典的方式,对层结构和各自对应的名字,同一完成构建;也比方法3代码简单一些

三、代码函数中的参数含义参考Pytorch中文社区查找

https://pytorch-cn.readthedocs.io/zh/latest/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用mybatis的@Interceptor实现拦截sql

一 mybatis的拦截器 1.1 拦截器介绍 拦截器是一种基于 AOP(面向切面编程)的技术,它可以在目标对象的方法执行前后插入自定义的逻辑。 1.2 语法介绍 1.注解Intercepts Intercepts({Signature(type StatementHandler.class, method “…

electron+VUE Browserwindow与webview通信

仅做记录 前言: electronVUEVITE框架,用的是VUE3.0 主进程定义:用于接收webview发送的消息 ipcMain.on(MyWebviewMessage, (event, message) > {logger.info(收到webmsg message)//转发给渲染进程}) porelaod/webPreload.js定义 cons…

C语言结合体和枚举的魅力展现

前言 ✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱’博客 所属栏目:人工智能 (感谢您的光临,您的光临蓬荜生辉) 引言: 前面我们已经讲了结构体的声明,自引用,内存…

C++ 前K个高频单词的六种解法

目录 大堆 小堆 vectorsort vectorstable_sort multimap set/multiset 与GPT的对话 1.对于比较类型中 < 运算符重载的理解 2.map有稳定性的说法吗 ​编辑 3.为什么map和set类的仿函数后面要加const来修饰*this 5.关于名词的理解 6.匿名对象对类要求 7.map和set的…

面向对象:继承

文章目录 一、什么叫继承&#xff1f;二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况&#xff08;菱形继承&#xff09; 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性&#xff08;无法确定到底是访问哪个&#xff09; 五、虚拟继承解决菱形…

深度剖析鞋服品牌商品数字化管理的重要性

随着信息技术的迅猛发展与市场竞争的加剧&#xff0c;鞋服品牌商品数字化管理的重要性愈发凸显。数字化管理不仅关乎企业运营效率的提升&#xff0c;更是品牌实现差异化竞争、提升顾客体验、构建智慧零售生态的关键所在。对于鞋服品牌企业而言&#xff0c;提升商品数字化管理的…

python中raise_for_status方法的作用

文章目录 说明示例1&#xff1a;基本使用示例2&#xff1a;多种异常 说明 raise_for_status() 方法在 Python 的 requests 库中用于在发送 HTTP 请求后检查响应的状态码。如果响应的状态码表示请求未成功&#xff08;即状态码不是 2xx&#xff09;&#xff0c;则该方法会抛出一…

C/C++中重载函数取地址的方法

目录 1.现象 2.指定参数取函数地址 3.利用Qt的类QOverload 1.现象 函数重载在C/C编码中是非常常见的&#xff0c;但是我们在std::bind或std::function绑定函数地址的时候&#xff0c;直接取地址&#xff0c;程序编译就会报错&#xff0c;示例如下&#xff1a; class CFunc1…

【全套源码教程】基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

慢工之旅:婺源的故事

在当今这个快节奏、高竞争的时代&#xff0c;我们常常发现自己处于持续的忙碌和压力之中。然而&#xff0c;在今年春季&#xff0c;我们选择了一条不同的道路——一次团队旅行到江西婺源。这不仅是一场远离日常工作的旅行&#xff0c;而且成为了我们团队对工作、生活及寻求内心…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

matplotlib中的颜色表示方法

matplotlib中的颜色表示方法 1.RGB或RGBA格式 格式示例以一个3元素或4元素的tuple来表示颜色&#xff0c;每个元素取值范围是[0,1](0.1,0.2,0.5) (0.1,0.2,0.5,0.3)大小写不敏感的16进制表示法#0F0F0F等价于#0x0f0f0f等价于(15/255,15/255,15/255)带透明度的#0f0f0f80简短的…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

Java毕业设计-基于Spring Boot的在线考试系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录注册2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于Spring Boot的在线考试系统-毕…

Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.冯诺依曼体系 二.操作系统 2.1概念 2.2结构示意图&…

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…

搬运5款有趣又好用的软件

​ 如果你想让你的电脑使用更方便、更有趣、更专业&#xff0c;那么你一定要看看这篇文章&#xff0c;因为我要给你推荐五款好用又有趣的WIN10软件。 1. 文字识别——PandaOCR ​ PandaOCR是一款高效的文字识别软件&#xff0c;可快速将图片中的文字转化为可编辑的文本。其识…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

刚刚,璞华科技、璞华易研PLM产品荣获智能制造领域两大奖项!

刚刚&#xff0c;在e-works数字化企业网于北京举办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”上&#xff0c;璞华科技凭借在智能制造领域的雄厚实力和产品口碑&#xff0c;荣获两大奖项。 璞华科技被评为e-works【2023年度智能制造优秀供应…
最新文章