目标检测中常见的神经网络组成层------Pytorch

news2024/9/26 1:26:51

物体检测中常见的神经网络组成层


文章目录

  • 物体检测中常见的神经网络组成层
    • 卷积层
    • 激活函数层
    • 池化层
    • Dropout层
    • 全连接层


常见的物体检测算法常用卷积层、池化层、全连接层、激活函数层、Dropout层。

卷积层

CNN–各层的介绍_Miracle Fan的博客-CSDN博客_cnn各层介绍

在pytorch中,torch.nn提供了一种构造卷积层的类——Conv2d。

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

在这里插入图片描述

注意:

  • in_channels:RGB图像通道数为3,灰度图像通道数为1。卷积中的特征图通道数一般是2的整数次幂。
  • 卷积核:1、3、5、7
  • stride:卷积核在图像上的滑动步长,一般为1.如果大于1,输出特征的尺寸会小于输入特征图的尺寸
  • padding:填充,常见的有零填充、边缘填充,默认为零填充。
  • dilation:空洞卷积,当大于1时可以增大感受野的同时保持特征图的尺寸。
  • bias:是否需要偏置,默认为True。
  • 感受野:指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。也就是通过卷积核计算原输入图像区域得到一个数值,该数值是通过原图像多少区域的像素区域计算得到。
在这里插入图片描述
from torch import nn
conv=nn.Conv2d(in_channels=2,out_channels=1,kernel_size=3,stride=1,padding=1,dilation=1,groups=1,bias=True)
print(conv.weight)
print(conv.weight.shape)

# Parameter containing:
# tensor([[[[ 0.0739,  0.0794,  0.1655],
#           [-0.0408,  0.1564, -0.0289],
#           [ 0.0037,  0.0103,  0.0007]],
# 
#          [[-0.0174, -0.1041,  0.1424],
#           [-0.1536, -0.0579, -0.2321],
#           [-0.2303, -0.0413,  0.1461]]]], requires_grad=True)
# torch.Size([1, 2, 3, 3])

#第一维为批量大小维度
#第二维为数据通道数,也就是输入channels
inputs = torch.ones(1, 2, 5, 5)
output = conv(inputs)
print(output)
print(output.shape)


# tensor([[[[-0.2497, -0.0248, -0.0248, -0.0248,  0.3116],
#           [-0.3887, -0.3419, -0.3419, -0.3419, -0.0975],
#           [-0.3887, -0.3419, -0.3419, -0.3419, -0.0975],
#           [-0.3887, -0.3419, -0.3419, -0.3419, -0.0975],
#           [-0.2018, -0.2595, -0.2595, -0.2595, -0.0426]]]],
#        grad_fn=<ConvolutionBackward0>)
# torch.Size([1, 1, 5, 5])

激活函数层

def tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
def ReLU(x):
    return np.maximum(0,x)
def sigmoid(x):
    return 1/(1+np.exp(-x))

通常来说,仅仅依靠线性的卷积运算堆叠的神经网络无法形成复杂的表达结构,很难提取出深层次语义信息。通过加入非线性的映射,就能大幅提升神经网络的表达能力,提升结构的复杂程度。

常见的激活函数有Sigmoid函数(Logistic)函数nn.Sigmoid(),其将输入的数据全部映射到0~1之间,通常将其用于二分类。但是用其进行计算计算量较大,且容易出现梯度消失,也就是在数据值过大或过小,其导数趋近于0,就很难将误差损失传递到前面的网络层进行修正。
σ ( x ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{1}{1+exp(-x)} σ(x)=1+exp(x)1
在这里插入图片描述

inputs=torch.randn(1,1,3,3)
#使用nn提供的Sigmoid函数需要进行实例化,其定义为class
sigmoid=nn.Sigmoid()
print(inputs)
print(sigmoid(inputs))
# tensor([[[[ 0.3065, -3.5786, -1.0128],
#           [ 0.1379,  0.7334, -1.1595],
#           [ 1.7581, -2.0699,  0.3463]]]])
# tensor([[[[0.5760, 0.0272, 0.2664],
#           [0.5344, 0.6756, 0.2388],
#           [0.8530, 0.1121, 0.5857]]]])

为了缓解梯度消失现象,ReLU(Rectified Linear Unit)被引入到神经网络之中。该函数在使用中,计算简单,收敛速度快,得到了广泛应用。

在这里插入图片描述

relu=nn.ReLU()
print(relu(inputs))
# tensor([[[[ 0.3065, -3.5786, -1.0128],
#           [ 0.1379,  0.7334, -1.1595],
#           [ 1.7581, -2.0699,  0.3463]]]])
# tensor([[[[0.3065, 0.0000, 0.0000],
#           [0.1379, 0.7334, 0.0000],
#           [1.7581, 0.0000, 0.3463]]]])

在物体检测中,为了对多分类问题进行处理,常见的是使用Softmax函数进行最后的分类工作。该函数工作原理是输入多个类别的得分,输出则为各个类别的概率。
S i = e V i ∑ j C e V j S_i=\frac{e^{V_i}}{\sum_j^Ce^{V_j}} Si=jCeVjeVi

score=torch.randn(1,4)
print(score)
import torch.nn.functional as F
# print(F.softmax(score,1))
# tensor([[-0.0557, -0.5245,  1.0442, -0.5944]])
# tensor([[0.1918, 0.1200, 0.5762, 0.1119]])

池化层

在卷积网络中,通常在卷积层之间会增加池化pooling层,降低特征图的参数量,提升计算速度,增加计算后特征图一个数值的感受野,是一种降采样的操作。池化操作是一种先验操作,预先让模型关注一些全局特征降低那些局部特征的作用,提升容错能力。

CNN–各层的介绍_Miracle Fan的博客-CSDN博客_cnn各层介绍

max_pooling = nn.MaxPool2d(2, stride=2)
aver_pooling = nn.AvgPool2d(2, stride=2)
inputs = torch.randn(1, 1, 4, 4)
print(inputs)
print(max_pooling(inputs))
print(aver_pooling(inputs))

# tensor([[[[ 0.1282,  0.5205, -1.0354, -1.9976],
#           [ 0.1396,  1.7015,  1.8151, -0.4946],
#           [-1.5159, -1.8059, -0.4110,  1.1330],
#           [ 1.5341, -0.1810,  1.0144,  0.6952]]]])
# tensor([[[[1.7015, 1.8151],
#           [1.5341, 1.1330]]]])
# tensor([[[[ 0.6225, -0.4281],
#           [-0.4922,  0.6079]]]])

Dropout层

dropout是对各个层之间加入噪声,进行扰动。

  • 对x加入噪声得到 x ′ x' x,我们希望 E [ x ′ ] = x E[x']=x E[x]=x
    E [ x i ′ ] = p ∗ 0 + ( 1 − p ) x i ′ 1 − p E[x_i']=p*0+(1-p)\frac{x_i'}{1-p} E[xi]=p0+(1p)1pxi

  • dropout对每个元素进行如下扰动,对概率为p的情况将参数至0,其他情况则放大$ \frac{h}{1-p}$倍数

h ′ = { 0  概率为  p h 1 − p  其他情况 \begin{split}\begin{aligned} h' = \begin{cases} 0 & \text{ 概率为 } p \\ \frac{h}{1-p} & \text{ 其他情况} \end{cases} \end{aligned}\end{split} h={01ph 概率为 p 其他情况

  • 常作用在多层感知机隐藏层全连接层的输出上。每次训练都是随机的采样训练,可能这次去除 h 1 , h 5 h_1,h_5 h1,h5,下次则会消除其他参数。

在这里插入图片描述

  • 正则项只在训练中使用,他们影响模型参数的而更新
  • 在预测过程中,丢弃法直接返回输入,也就是 h = d r o p o u t ( h ) h=dropout(h) h=dropout(h)
def dropout_layer(X, dropout):
    assert 0 <= dropout <= 1
    # 在本情况中,所有元素都被丢弃
    if dropout == 1:
        return torch.zeros_like(X)
    # 在本情况中,所有元素都被保留
    if dropout == 0:
        return X
    mask = (torch.rand(X.shape) > dropout).float()
    return mask * X / (1.0 - dropout)
  • 首先限制dropout在0~1之间,dropout代表元素置零的概率。
  • (torch.rand(X.shape) > dropout).float()相当于掩膜,通过点乘消除mask中为0对应在X中的参数,而mask为1时则进行参数的保留。

在这里插入图片描述

使用nn.Dropout()类示例如下,第一个param为置零概率,第二个参数为是否在原数据操作。

drop=nn.Dropout(0.5,inplace=False)
inputs=torch.randn(1,2,3,3)
print(inputs)
print(drop(inputs))

# tensor([[[[ 0.9054, -0.7422, -0.6802],
#           [-0.9904, -0.3879, -0.5484],
#           [-0.3580,  1.7531,  0.4301]],
# 
#          [[ 1.6432,  0.9685, -0.9875],
#           [ 0.0314, -1.2510,  0.2574],
#           [-0.6132,  0.9331,  0.0151]]]])
# tensor([[[[ 0.0000, -1.4843, -1.3605],
#           [-0.0000, -0.0000, -0.0000],
#           [-0.0000,  0.0000,  0.0000]],
# 
#          [[ 0.0000,  1.9369, -1.9750],
#           [ 0.0000, -0.0000,  0.0000],
#           [-1.2265,  1.8661,  0.0302]]]])

全连接层

在物体检测中,卷积层通常是用来进行提取图像的特征,全连接层则是将提取的特征图像进一步通过映射得到特定维度的标签空间,从而求取损失或者预测相关标签。


感受野(Receptive Field)的理解与计算 - 知乎 (zhihu.com)

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

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

相关文章

Python3入门基础(08)一个函数

Python3 函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0…

Windows 11 连接 hercules zOS Websphere MQ 配置

基本配置 zOS v1.10 基本配置可以先参考下面教程 ubuntu 编译 hercules 主机安装 z/OS 教程 zOS MQ 版本为 CSQ700 Windows 11 IBM MQ 版本为最新 9.x IBM MQ 官网有开发者版本可以免费下载&#xff0c;档名如下 mqadv_dev931_windows.zip (全名为 IBM MQ Advanced for Devel…

kafka — 2、基础环境搭建

前述 kafka的运行依赖于zooKeeper&#xff0c;所以在搭建kafka的环境之前需要搭建zookeeper环境。 zooKeeper&#xff1a; ZooKeeper是一个分布式协调服务&#xff0c;它的主要作用是为分布式系统提供一致性服务&#xff0c;可以保证数据在集群间的事务一致性&#xff0c;提供…

Volatile不保证原子性

目录 前言 原子性 代码测试 为什么出现数值丢失 如何解决 其它解决方法 字节码指令表 前言 通过前面对JMM的介绍&#xff0c;我们知道&#xff0c;各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一…

Java Iterator(迭代器)

Java Iterator&#xff08;迭代器&#xff09;不是一个集合&#xff0c;它是一种用于访问集合的方法&#xff0c;可用于迭代 ArrayList 和 HashSet 等集合。 Iterator 是 Java 迭代器最简单的实现&#xff0c;ListIterator 是 Collection API 中的接口&#xff0c; 它扩展了 I…

微信小程序和ros2进行通信

微信小程序和ros2进行通信环境配置ubuntu下安装ros2ubuntu安装mqtt库windows安装微信开发者工具主要功能模块介绍ROS2基础程序讲解微信小程序基础程序讲解编译及运行ros2程序编译及运行微信小程序主要事项ROS2做为一款优秀的机器人操作系统软件&#xff0c;其搭载了丰富的机器人…

深耕低代码领域20年,这个老牌低代码平台有多靠谱

编者按&#xff1a;市面上低代码平台多如牛毛&#xff0c;用户在选型低代码平台时该如何甄别&#xff1f;本文通过介绍20年的老品牌低代码平台的特性&#xff0c;展示了优秀第低代码平台的魅力。 关键词&#xff1a;老厂商&#xff0c;私有化部署&#xff0c;源码交付&#xf…

实现effect的stop和onStop功能

06_实现effect的stop和onStop功能 一、实现stop &#xff08;一&#xff09;单元测试 it(stop, () > {let dummy;const obj reactive({ prop: 1 });const runner effect(() > {dummy obj.prop;});obj.prop 2;expect(dummy).toBe(2);stop(runner);obj.prop 3;expe…

zookeeper学习笔记1(小D课堂)

win和linux双环境安装zookeeper 我们不点击这个download。 进行解压&#xff1a; 我们进入到conf目录。 我们给这个文件进行重命名。 接下来我们去打开它&#xff0c;去修改一下配置&#xff1a; 我们先去掉这部分注释。 去掉注释&#xff0c;一共就这些内容。 tickTime是我们的…

如何开通阿里云语音通知服务?

阿里云语音服务是阿里云为用户提供的一种通信服务的能力。支持快速发送语音通知服务。 安全级别更高&#xff0c;难窃取。支持大容量、高并发&#xff0c;稳定可靠。 一、如何开通阿里云语音服务&#xff1f; 注册阿里云平台账户&#xff1b;实名登记认证&#xff1b;阿里云语…

手把手教你 如何利用github搭建个人网站 无需服务器

目录 前言 准备工作 教程来啦&#xff01;&#xff01;&#xff01; 第一部分 第二部分 链接说明 前言 哈喽&#xff0c;大家好&#xff0c;我是木易巷。 今天给大家分享一下&#xff1a;如何使用GitHub创建自己的个人网站&#xff1f; 准备工作 需要使用GitHub&#xff0c;当…

【python】语法分析-化学分子式解析「编译原理」

题目 编写程序&#xff0c;计算化学分子式中元素的数目&#xff0c;并完成以下测试&#xff1a; atom_count(“He”) 1 atom_count(“H2”) 2 atom_count(“H2SO4”) 7 atom_count(“CH3COOH”) 8 atom_count(“NaCl”) 2 atom_count(“C60H60”) 120 参考语法 specie…

学习周报-20221230

文章目录一 如何设置字符集二 NFS配置文件父目录权限影响子目录三 对IP分组可以批量管理NFS客户端首先查看系统环境 [rootnfs-server ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.7 (Ootpa) [rootnfs-server ~]# uname -r 4.18.0-425.3.1.el8.x86_64这是…

JAVA零基础小白学习免费教程day13-Collection数据结构

day13_JAVAOOP 课程目标 1. 【理解】集合的体系结构 2. 【掌握】Collection集合中常用的方法 3. 【理解】Iterator迭代器 4. 【掌握】增强for的使用 5. 【理解】List集合的特点 6. 【掌握】List集合中特有的方法 7. 【理解】LinkedList集合的特点 8. 【理解】LinkedList集合中…

解读YOLO v7的代码(二)训练数据的准备

在上一篇文章解读YOLO v7的代码(一)模型结构研究_gzroy的博客-CSDN博客&#xff0c;我对Yolo v7的模型结构进行了分析&#xff0c;那么这次我们将进一步研读代码的关键部分&#xff0c;学习是如何对模型进行训练的。 训练数据的准备是模型训练的关键&#xff0c;通常我们需要对…

保姆教程系列一、什么?Redis部署 so easy

系列文章目录 &#xff01;&#xff01;&#xff01;是的没错&#xff0c;胖友们&#xff0c;保姆教程系列又更新了&#xff01;&#xff01;&#xff01; 保姆教程系列一、Redis部署 so easy 保姆教程系列二、Redis高可用&#xff08;主从同步哨兵模式&#xff09; 保姆教程系…

(3)Qt中的变体数据类型(QVariant)

QVariant的使用 QVariant(变体数据类型)这个类很神奇&#xff0c;或者说方便。很多时候&#xff0c;需要几种不同的数据类型需要传递&#xff0c;如果用结构体&#xff0c;又不大方便&#xff0c;容器保存的也只是一种数据类型&#xff0c;而QVariant则可以统统搞定。QVariant …

ceph-mds文件系统操作指南

前言&#xff1a;ceph-mds文件系统操作&#xff0c;常规操作汇总&#xff0c;看这一篇就够了 一、文件系统简介 Ceph 文件系统 (CephFS) 是兼容 POSIX 标准的文件系统&#xff0c;在 Ceph 的分布式对象存储基础上构建&#xff0c;称为 RADOS&#xff08;可靠的自主分布式对象存…

用户级线程和内核级线程

线程的实现可以分为两类&#xff1a;用户级线程和内核级线程&#xff0c;后者又称为内核支持的线程或轻量级进程。在多线程操作系统中&#xff0c;各个系统的实现方式并不相同&#xff0c;在有的系统中实现了用户级线程&#xff0c;有的系统中实现了内核级线程。 用户级线程&am…

Python数据分析案例13——文本特征抽取(TfidfVectorizer)

在做机器学习的时候&#xff0c;构建特征变量有很多时候都是文本型的&#xff0c;比如电影分类的时候的电影标题&#xff0c;房价预测的时候房子地址&#xff0c;股吧评论等......都是文本类型的数据。 文本型数据怎么构建特征&#xff0c;它又不是分类变量不能直接独立热编码…