卷积神经网络层结构概述

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

(一)卷积层

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)     #定义卷积层conv1self.relu = nn.ReLU()                      #定义激活函数self.pool = nn.MaxPool2d(2)                #定义池化层self.dense1 = nn.Linear(32 * 3 * 3, 128)   #构建两个全连接层dense1,dense2self.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.mzph.cn/news/779394.shtml

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

相关文章

缺省和重载.引用——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…

【AI】『Suno』哎呦不错呦,AI界的周董,快来创作你的歌曲吧!

前言 &#x1f34a;缘由 Suno AI的旋风终于还是吹到了音乐圈 &#x1f3c0;事情起因&#xff1a; 朋友说他练习时长两天半&#xff0c;用Suno发布了首张AI音乐专辑。震惊之余&#xff0c;第一反应是音乐圈门槛也这么低了&#xff0c;什么妖魔鬼怪都可以进军了嘛&#xff01;…

【详细讲解MNN介绍,安装和编译】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

【ERP原理与应用】作业·思考题三、四

思考题三 P77第四章3&#xff0c; 6&#xff0c;8 3.生产规划的基本内容是什么&#xff1f; 生产规划是根据企业未来一段时间内预计资源可用量和市场需求量之间的平衡所制定的概括性设想是根据企业所拥有的生产能力和需求预测&#xff0c;对企业未来较长一段时间内的产品、产…

Geopandas的介绍(1)

Geopands的介绍&#xff1a; GeoPandas是一个开源项目&#xff0c;主要为了简化python中地理空间数据处理的过程。GeoPandas扩展了pandas使用的数据类型&#xff0c;允许对几何类型进行空间操作。GeoPandas几何运算由shape执行。Geopandas进一步依赖于fiona的文件存取和matplot…

如何将录音制作成二维码?在线生成扫码听音频的二维码

录制的音频文件能做成二维码吗&#xff1f;录制的音频文件用传统的方式来传递&#xff0c;比如微信、QQ、网盘等方式会比较繁琐&#xff0c;而且用户需要接受下载之后才可以播放&#xff0c;不仅占用内存空间&#xff0c;而且不利于音频的快速传播。而生成二维码的方式可以很好…

Pandas合并数据集

第1关&#xff1a;Concat与Append操作 import pandas as pd""" data.csv和data1.csv是两份与各国幸福指数排名相关的数据&#xff0c;为了便于查看排名详情&#xff0c;所以需要将两份数据横向合并。数据列名含义如下&#xff1a;列名 说明 Country (region…

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

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

Servlet通常如何通过重写父类HttpServlet的doGet()、doPost()等方法来处理不同类型的HTTP请求?

Servlet在Java Web应用程序中用于处理HTTP请求。javax.servlet.http.HttpServlet是一个抽象类,它提供了处理HTTP请求的标准机制。当您创建一个Servlet并让它继承自HttpServlet时,您可以重写其中的doGet()和doPost()方法以便分别处理GET和POST类型的HTTP请求。 以下是Servlet…

离线Linux/openEuler服务器指定本地yum仓库

1、前提准备一个预装坏境比较完整的linux镜像文件&#xff0c;本文服务器使用的是openEuler 官网&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 2、上传镜像文件至服务器 如果是集群服务器&#xff0c;上传其中一台服务器之后&#xff0c;使用scp指令将镜…

王道C语言督学营OJ课后习题(课时14)

#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;//c 就是书籍上的 datastruct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//tag 结构体是辅助队列使用的 typedef struct tag{BiTree p;//树…

网络时间同步设备(时间同步系统)操作及应用方案

网络时间同步设备&#xff08;时间同步系统&#xff09;操作及应用方案 网络时间同步设备&#xff08;时间同步系统&#xff09;操作及应用方案 有不少自学成才的电脑专家还是有经过系统性训练的电脑专家&#xff0c;大部份的电脑专家都折腾过Windows Server系列的服务器操作系…

【探索Linux】—— 强大的命令行工具 P.31(守护进程)

阅读导航 引言一、守护进程简介1. 概念2. 特点 二、用C创建守护进程⭕代码✅主要步骤 温馨提示 引言 当谈到计算机系统中运行的特殊进程时&#xff0c;守护进程&#xff08;daemon&#xff09;无疑是一个备受关注的话题。作为在后台默默运行并提供各种服务的进程&#xff0c;守…

C++ —— C++11新增语法

目录 一&#xff0c;列表初始化 1.1 这是什么&#xff1f; 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二&#xff0c;右值引用和左值引用 2.1 是什么&#xff1f; 2.2 这两个东西有啥关系&#xff1f; 2.3 有啥用&#xff1f; 三&#xff0c;*移动构…

基于DCT(离散余弦变换)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

如何为 Git 配置邮箱地址

在使用 Git 进行版本控制时&#xff0c;每个提交都会关联一个提交者邮箱地址。该邮箱不仅用于标识提交者身份&#xff0c;还可能与您的 Git 托管服务&#xff08;如 GitHub、GitLab&#xff09;账户关联&#xff0c;以确保提交记录正确计入您的个人贡献。本篇博客将指导您如何为…

牛角工具箱源码 轻松打造个性化在线工具箱,附带系统搭建教程

这是一款在线工具箱程序&#xff0c;您可以通过安装扩展增强她的功能 通过插件模板的功能&#xff0c;您也可以把她当做网页导航来使用~ &#x1f38a; 环境要求 PHP > 7.2.5 MySQL > 5.7 fileinfo扩展 使用Redis缓存需安装Redis扩展 去除禁用函数proc_open、putenv、s…

C语言-写一个简单的Web服务器(四)

经过以上几次的构建&#xff0c;我们基本上已经构建出来了一个简易的Web服务器&#xff0c;接下来将使用查询从文本中查询我们的问题。 查询结果 在这里我设置了一个page全局参数用来记录是哪个页面&#xff0c;避免和登录页面进行冲突重复查询&#xff08;大家可以自行优化&am…

YOLOv9改进策略 :blcok优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; VanillaNet&#xff0c;是一种设计优雅的神经网络架构&#xff0c; 通过避免高深度、shortcuts和自注意力等复杂操作&#xff0c;VanillaNet 简洁明了但功能强大。 &#x1f4a1;&#x1f4a1;&#x1f4a1;引…

303.【华为OD机试】报数游戏(约瑟夫环算法解题—JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…