卷积神经网络的padding是什么?如何计算?

news2024/11/22 19:11:44

文章目录

  • 为什么需要padding?
    • 1.Valid Padding(有效填充)
    • 2.Same Padding(相同填充)
      • 2.1.如何计算padding?
        • 1. 计算总 padding
        • 2. 分配 padding:
      • 2.2.举例子
        • 1. 步幅为 1 的 Same Padding
        • 2. 步幅不为 1 的 Same Padding
    • 3.F.pad()和卷积中的padding互相转换
      • 1.torch.nn.functional.pad()函数
      • 2.举例


为什么需要padding?

  • 控制输出尺寸: 卷积操作通常会减少输入图像的尺寸。例如,使用3×3
    卷积核时,边缘的像素不会像中间部分的像素一样得到处理(因为卷积核无法完全跨越边缘区域),导致输出图像的尺寸小于输入图像。通过适当的
    padding,可以保持输入和输出尺寸相同,或者控制输出的尺寸。
  • 保留边缘信息: 如果没有padding,卷积操作会丢失输入图像的边缘部分的信息。通过为输入图像添加零填充,卷积核可以处理这些边缘区域,从而保留更多的信息。

1.Valid Padding(有效填充)

  • 定义:在卷积操作中没有额外的填充,也就是在卷积时不添加任何零填充。此时,输出图像的尺寸会小于输入图像,具体减少的大小取决于卷积核的尺寸和步幅。
  • 输出尺寸:由于没有 padding,输出尺寸通常会小于输入尺寸,且与卷积核大小和步幅有关。
  • 优点:计算效率较高,减少了不必要的计算。
  • 缺点:会丢失图像的边缘信息。

2.Same Padding(相同填充)

  • 定义:通过添加零填充来确保输出的尺寸与输入尺寸相同(在步幅为 1 时)。为了实现这一点,通常需要在输入的边缘添加一定数量的零。
  • 输出尺寸:输入和输出尺寸相同(对于步幅为1的情况)。当步幅大于1时,输出尺寸会根据步幅的大小调整,但仍尽量保持输入和输出的比例相同。
  • 优点:能够保留输入的边缘信息,适用于需要保持特征图大小不变的任务。
  • 缺点:可能会引入一些零值,这对网络学习可能是无用的。

2.1.如何计算padding?

在这里插入图片描述

1. 计算总 padding
P_h = (H - 1) * S + K - H
P_w = (W - 1) * S + K - W
2. 分配 padding:
P_top = P_h // 2
P_bottom = P_h - P_top
P_left = P_w // 2
P_right = P_w - P_left

2.2.举例子

1. 步幅为 1 的 Same Padding

  当stride = 1,dilation=1,卷积公式的输出为H_out = H_in+2p-k+1,要保证H_out = H_in,所以2p = k-1,p = (k-1)/2。假设输入尺寸是 5×5,卷积核大小是 3×3,步幅为 1。我们希望卷积操作后的输出尺寸与输入相同。计算padding:
在这里插入图片描述

import torch
import torch.nn as nn

# 定义输入数据(5x5)
input_data = torch.randn(1, 1, 5, 5)  # Batch size = 1, Channels = 1, Height = 5, Width = 5

# 定义卷积层,kernel_size = 3, padding = 1 (为了使用same padding)
conv_layer = nn.Conv2d(1, 1, kernel_size=3, stride=1, padding=1)

# 输出卷积后的数据
output_data = conv_layer(input_data)

print(f'输入形状: {input_data.shape}')
print(f'输出形状: {output_data.shape}')
输入形状: torch.Size([1, 1, 5, 5])
输出形状: torch.Size([1, 1, 5, 5])
2. 步幅不为 1 的 Same Padding

根据公式推导得,P = (S(H-1)-H+K)/2,当S=2,上述例子为,P = floor[(8-4+3)/2]=3

import torch
import torch.nn as nn

# 定义输入数据(5x5)
input_data = torch.randn(1, 1, 5, 5)  # Batch size = 1, Channels = 1, Height = 5, Width = 5

# 定义卷积层,kernel_size = 3, padding = 1 (为了使用same padding)
conv_layer = nn.Conv2d(1, 1, kernel_size=3, stride=2, padding=3)

# 输出卷积后的数据
output_data = conv_layer(input_data)

print(f'输入形状: {input_data.shape}')
print(f'输出形状: {output_data.shape}')
输入形状: torch.Size([1, 1, 5, 5])
输出形状: torch.Size([1, 1, 5, 5])

3.F.pad()和卷积中的padding互相转换

1.torch.nn.functional.pad()函数

torch.nn.functional.pad(input, pad, mode='constant', value=0)

参数说明

  • input (Tensor): 输入张量。
  • pad (tuple or int): 指定每个维度上的填充宽度。可以是一个整数或一个元组。
    • 如果是整数,表示所有维度的两侧都填充相同的值。
    • 如果是元组,元组的长度必须是输入张量维度的两倍。元组的形式为 (pad_left,pad_right, pad_top, pad_bottom, …),表示每个维度上的填充宽度。
  • mode (str, optional): 填充模式,默认为 ‘constant’。可选值有:
    • constant: 使用常数值填充,默认值为 0。
    • reflect: 使用边界元素的反射值填充。
    • replicate:使用边界元素的复制值填充。
    • circular: 使用循环方式填充。
  • value (float, optional): 当 mode 为 constant’时,指定填充的常数值,默认为 0。

2.举例

input = torch.arange(1, 65,dtype=torch.float).view(2, 2, 4, 4)
padded_input = F.pad(input, pad=[2, 2, 1, 1], mode='constant', value=0)


conv_padding = nn.Conv2d(in_channels=2, out_channels=2, kernel_size=2,stride=1,padding=[1,2],padding_mode='zeros',bias=False)

conv = nn.Conv2d(in_channels=2, out_channels=2, kernel_size=2,stride=1,bias=False)

conv.weight.data = torch.ones(2,2,2,2)
conv_padding.weight.data = torch.ones(2,2,2,2)

out11 = conv_padding(input)
out2 = conv(padded_input)
print(torch.equal(out11,out2))  # True
tensor([[[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.],
          [ 0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.],
          [ 0.,  0.,  9., 10., 11., 12.,  0.,  0.],
          [ 0.,  0., 13., 14., 15., 16.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]],

         [[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 17., 18., 19., 20.,  0.,  0.],
          [ 0.,  0., 21., 22., 23., 24.,  0.,  0.],
          [ 0.,  0., 25., 26., 27., 28.,  0.,  0.],
          [ 0.,  0., 29., 30., 31., 32.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]],


        [[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 33., 34., 35., 36.,  0.,  0.],
          [ 0.,  0., 37., 38., 39., 40.,  0.,  0.],
          [ 0.,  0., 41., 42., 43., 44.,  0.,  0.],
          [ 0.,  0., 45., 46., 47., 48.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]],

         [[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 49., 50., 51., 52.,  0.,  0.],
          [ 0.,  0., 53., 54., 55., 56.,  0.,  0.],
          [ 0.,  0., 57., 58., 59., 60.,  0.,  0.],
          [ 0.,  0., 61., 62., 63., 64.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]]])
import pdb;pdb.set_trace()
(Pdb) padded_input
tensor([[[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.],
          [ 0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.],
          [ 0.,  0.,  9., 10., 11., 12.,  0.,  0.],
          [ 0.,  0., 13., 14., 15., 16.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]],

         [[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 17., 18., 19., 20.,  0.,  0.],
          [ 0.,  0., 21., 22., 23., 24.,  0.,  0.],
          [ 0.,  0., 25., 26., 27., 28.,  0.,  0.],
          [ 0.,  0., 29., 30., 31., 32.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]],


        [[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 33., 34., 35., 36.,  0.,  0.],
          [ 0.,  0., 37., 38., 39., 40.,  0.,  0.],
          [ 0.,  0., 41., 42., 43., 44.,  0.,  0.],
          [ 0.,  0., 45., 46., 47., 48.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]],

         [[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0., 49., 50., 51., 52.,  0.,  0.],
          [ 0.,  0., 53., 54., 55., 56.,  0.,  0.],
          [ 0.,  0., 57., 58., 59., 60.,  0.,  0.],
          [ 0.,  0., 61., 62., 63., 64.,  0.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]]])

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

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

相关文章

介绍一下strncmp(c基础)

strncmp是strcmp的进阶版 链接介绍一下strcmp(c基础)-CSDN博客 作用 比较两个字符串的前n位 格式 #include <string.h> strncmp (arr1,arr2,n); 工作原理&#xff1a;strcmp函数按照ACII&#xff08;字符编码顺序&#xff09;比较两个字符串。它从两个字符串的第一…

列出D3的所有交互方法,并给出示例

D3.js 提供了丰富的交互方法&#xff0c;可以用来增强图表的用户交互体验。以下是一些常用的交互方法及其示例&#xff1a; 1. 鼠标事件 on("mouseover", function) 用途: 当鼠标悬停在元素上时触发。示例:svg.selectAll(".bar").on("mouseover&qu…

丹摩征文活动 | AI创新之路,DAMODEL助你一臂之力GPU

目录 前言—— DAMODEL&#xff08;丹摩智算&#xff09; 算力服务 直观的感受算力提供商的强大​ 平台功能介绍​ 镜像选择 云磁盘创建 总结 前言—— 只需轻点鼠标,开发者便可拥有属于自己的AI计算王国 - 从丰富的GPU实例选择,到高性能的云磁盘,再到预配置的深度学习…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

六、卷积神经网络(CNN)基础

卷积神经网络&#xff08;CNN&#xff09;基础 前言一、CNN概述二、卷积层2.1 卷积2.2 步幅(Stride)2.3 填充(Padding)2.4 多通道卷积2.5 多卷积计算2.6 特征图大小计算2.7 代码演示 三、池化层3.1 池化层计算3.1.1 最大池化层3.1.2 平均池化层 3.2 填充(Padding)3.3 步幅(Stri…

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域&#xff0c;大中型项目对于视频监控管理平台的需求日益增长&#xff0c;特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的&#xff0c;它不仅提供了全面的管理功能&#xff0c;还支持…

Jmeter中的断言(四)

13--XPath断言 功能特点 数据验证&#xff1a;验证 XML 响应数据是否包含或不包含特定的字段或值。支持 XPath 表达式&#xff1a;使用 XPath 表达式定位和验证 XML 数据中的字段。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测试需求。 配置步骤 添加…

实验室管理解决方案:Spring Boot技术

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

【STM32】USART串口数据包

数据包的作用是将一个个单独的数据打包起来&#xff0c;方便进行多字节的数据通信 数据包格式 HEX数据包 文本数据包 数据包接收 HEX数据包接收&#xff08;固定包长&#xff09; 文本数据包接收&#xff08;可变包长&#xff09; 串口收发HEX数据包 接线图 Serial模块 se…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#xff0c; 你尽可以试试&#xff0c;从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#…

【智谱开放平台-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器&#xff0c;由七个电路模块组成&#xff0c;分别是&#xff1a;单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中&#xff0c;单片机模块是整个…

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

内网安全隧道搭建-ngrok-frp-nps-sapp

1.ngrok 建立内网主机与公网跳板机的连接&#xff1a; 内网主机为客户机&#xff1a; 下载客户端执行 2.frp &#xff08;1&#xff09;以下为内网穿透端口转发 frp服务端配置&#xff1a; bindPort 为frp运行端口 服务端运行 ./frps -c frps.ini frp客户端配置&#xf…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址&#xff1a;功能展示项目结构项目引用1. 新建模型2. Data层&#xff0c;依赖EF Core&#xff0c;实现数据库增删改查3. Bussiness层&#xff0c;实现具体的业务逻辑4. Service层&am…

Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建 目录 6、光耦及二极管元件库模型创建 7、元件库模型的调用 二、原理图绘制及编译检查 8、元件的放置 9、器件的复制及对齐 10、…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;完成网络部署 2、任务 2&#xff1a;设计全网 IP 地址 3、任务 3&#xff1a;实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域&#xff0c;Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展&#xff0c;这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件&#xff0c;帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…