pytorch卷积层基础七问

Pytorch:卷积神经网络-空洞卷积 搭建Dilated CNN识别Fashion-MNIST,并可视化相关结果。 阅读详情

1,普通卷积层的参数数量该如何计算?

普通卷积的操作分成3个维度,在空间维度(H和W维度)是共享卷积核权重,滑窗相乘求和(融合空间信息),在输入通道维度是每一个通道使用不同的卷积核参数并对输入通道维度求和(融合通道信息),在输出通道维度操作方式是并行堆叠(多种),有多少个卷积核就有多少个输出通道。

普通卷积层的参数数量 = 输入通道数×卷积核尺寸(如3乘3)×输出通道数(即卷积核个数) + 输出通道数(考虑偏置时)

9be58b33dd2ded186fb25c16a202ef25.gif

2,卷积层的输出尺寸该如何计算?

卷积输出尺寸计算公式 o = (i + 2p -k‘)//s  + 1

对空洞卷积 k' = d(k-1) + 1

o是输出尺寸,i 是输入尺寸,p是 padding大小, k 是卷积核尺寸, s是stride步长, d是空洞卷积dilation膨胀系数。

3,空洞卷积有什么作用?有什么缺点?

空洞卷积和普通卷积相比,空洞卷积可以在保持较小参数规模的条件下增大感受野,常用于图像分割领域。其缺点是可能产生网格效应,即有些像素被空洞漏过无法利用到,可以通过使用不同膨胀因子的空洞卷积的组合来克服该问题,参考文章:https://developer.orbbec.com.cn/v/blog_detail/892

c65e462358d700ef0886a79b848c683f.gif

4,什么是分组卷积,分组卷积有什么作用?

和普通卷积相比,分组卷积将输入通道分成g组,卷积核也分成对应的g组,每个卷积核只在其对应的那组输入通道上做卷积,最后将g组结果堆叠拼接。由于每个卷积核只需要在全部输入通道的1/g个通道上做卷积,参数量降低为普通卷积的1/g。分组卷积要求输入通道和输出通道数都是g的整数倍。参考文章:https://zhuanlan.zhihu.com/p/65377955

58f3562fc2c776983def811800ef9e52.jpeg

5,什么是深度可分离卷积,和普通卷积相比深度可分离卷积有什么优点?

深度可分离卷积的思想是将融合空间信息和融合通道信息的操作在卷积中分成独立的两步完成。做法是先用g=m(输入通道数)的分组卷积逐通道作用融合空间信息,再用n(输出通道数)个1乘1卷积融合通道信息。其参数量为 (m×k×k)+ n×m, 相比普通卷积的参数量 m×n×k×k 显著减小。同时,由于深度可分离卷积融合空间信息与融合通道信息相互分离,往往还能比普通卷积取得更好的效果。2d541fde3a56f01aab9e560a764de928.jpeg

6,什么是转置卷积/反卷积?它有什么作用?

一般的卷积操作后会让特征图尺寸变小,但转置卷积(也被称为反卷积)可以实现相反的效果,即放大特征图尺寸。对两种方式理解转置卷积,第一种方式是转置卷积是一种特殊的卷积,通过设置合适的padding的大小来恢复特征图尺寸。第二种理解基于卷积运算的矩阵乘法表示方法,转置卷积相当于将卷积核对应的表示矩阵做转置,然后乘上输出特征图压平的一维向量,即可恢复原始输入特征图的大小。参考文章:https://zhuanlan.zhihu.com/p/115070523

a9b00cac1de99264d2999c284a93be48.jpeg

7,CV领域有哪些常用的上采样方法?

除了使用转置卷积进行上采样外,在图像分割领域更多的时候一般是使用双线性插值的方式进行上采样,该方法没有需要学习的参数,通常效果也更好,除了双线性插值之外,还可以使用最邻近插值的方式进行上采样,但使用较少。此外,还有一种上采样方法是反池化。使用也不多。

0b7f2c68433f9cd90e8beb192926d5de.jpeg

代码演示1:卷积输出尺寸关系演示

import torch 
from torch import nn 
import torch.nn.functional as F 

# 卷积输出尺寸计算公式 o = (i + 2*p -k')//s  + 1 
# 对空洞卷积 k' = d(k-1) + 1
# o是输出尺寸,i 是输入尺寸,p是 padding大小, k 是卷积核尺寸, s是stride步长, d是dilation空洞参数

inputs = torch.arange(0,25).view(1,1,5,5).float() # i= 5
filters = torch.tensor([[[[1.0,1],[1,1]]]]) # k = 2

outputs = F.conv2d(inputs, filters) # o = (5+2*0-2)//1+1 = 4
outputs_s2 = F.conv2d(inputs, filters, stride=2)  #o = (5+2*0-2)//2+1 = 2
outputs_p1 = F.conv2d(inputs, filters, padding=1) #o = (5+2*1-2)//1+1 = 6
outputs_d2 = F.conv2d(inputs,filters, dilation=2) #o = (5+2*0-(2(2-1)+1))//1+1 = 3

print("--inputs--")
print(inputs)
print("--filters--")
print(filters)

print("--outputs--")
print(outputs,"\n")

print("--outputs(stride=2)--")
print(outputs_s2,"\n")

print("--outputs(padding=1)--")
print(outputs_p1,"\n")

print("--outputs(dilation=2)--")
print(outputs_d2,"\n")

输出如下:

--inputs--
tensor([[[[ 0.,  1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.,  9.],
          [10., 11., 12., 13., 14.],
          [15., 16., 17., 18., 19.],
          [20., 21., 22., 23., 24.]]]])
--filters--
tensor([[[[1., 1.],
          [1., 1.]]]])
--outputs--
tensor([[[[12., 16., 20., 24.],
          [32., 36., 40., 44.],
          [52., 56., 60., 64.],
          [72., 76., 80., 84.]]]]) 

--outputs(stride=2)--
tensor([[[[12., 20.],
          [52., 60.]]]]) 

--outputs(padding=1)--
tensor([[[[ 0.,  1.,  3.,  5.,  7.,  4.],
          [ 5., 12., 16., 20., 24., 13.],
          [15., 32., 36., 40., 44., 23.],
          [25., 52., 56., 60., 64., 33.],
          [35., 72., 76., 80., 84., 43.],
          [20., 41., 43., 45., 47., 24.]]]]) 

--outputs(dilation=2)--
tensor([[[[24., 28., 32.],
          [44., 48., 52.],
          [64., 68., 72.]]]])

代码演示2:卷积层参数数量演示

import torch 
from torch import nn 

features = torch.randn(8,64,128,128)
print("features.shape:",features.shape)
print("\n")

#普通卷积
print("--conv--")
conv = nn.Conv2d(in_channels=64,out_channels=32,kernel_size=3)
conv_out = conv(features)
print("conv_out.shape:",conv_out.shape) 
print("conv.weight.shape:",conv.weight.shape)
print("\n")

#分组卷积
print("--group conv--")
conv_group = nn.Conv2d(in_channels=64,out_channels=32,kernel_size=3,groups=8)
group_out = conv_group(features)
print("group_out.shape:",group_out.shape) 
print("conv_group.weight.shape:",conv_group.weight.shape)
print("\n")

#深度可分离卷积
print("--separable conv--")
depth_conv = nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,groups=64)
oneone_conv = nn.Conv2d(in_channels=64,out_channels=32,kernel_size=1)
separable_conv = nn.Sequential(depth_conv,oneone_conv)
separable_out = separable_conv(features)
print("separable_out.shape:",separable_out.shape) 
print("depth_conv.weight.shape:",depth_conv.weight.shape)
print("oneone_conv.weight.shape:",oneone_conv.weight.shape)
print("\n")

#转置卷积
print("--conv transpose--")
conv_t = nn.ConvTranspose2d(in_channels=32,out_channels=64,kernel_size=3)
features_like = conv_t(conv_out)
print("features_like.shape:",features_like.shape)
print("conv_t.weight.shape:",conv_t.weight.shape)

输出如下:

features.shape: torch.Size([8, 64, 128, 128])


--conv--
conv_out.shape: torch.Size([8, 32, 126, 126])
conv.weight.shape: torch.Size([32, 64, 3, 3])


--group conv--
group_out.shape: torch.Size([8, 32, 126, 126])
conv_group.weight.shape: torch.Size([32, 8, 3, 3])


--separable conv--
separable_out.shape: torch.Size([8, 32, 126, 126])
depth_conv.weight.shape: torch.Size([64, 1, 3, 3])
oneone_conv.weight.shape: torch.Size([32, 64, 1, 1])


--conv transpose--
features_like.shape: torch.Size([8, 64, 128, 128])
conv_t.weight.shape: torch.Size([32, 64, 3, 3])

代码演示3:上采样层

import torch 
from torch import nn 

inputs = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
print("inputs:")
print(inputs)
print("\n")

nearest = nn.Upsample(scale_factor=2, mode='nearest')
bilinear = nn.Upsample(scale_factor=2,mode="bilinear",align_corners=True)

print("nearest(inputs):")
print(nearest(inputs))
print("\n")
print("bilinear(inputs):")
print(bilinear(inputs))

输出如下:

inputs:
tensor([[[[1., 2.],
          [3., 4.]]]])


nearest(inputs):
tensor([[[[1., 1., 2., 2.],
          [1., 1., 2., 2.],
          [3., 3., 4., 4.],
          [3., 3., 4., 4.]]]])


bilinear(inputs):
tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
          [1.6667, 2.0000, 2.3333, 2.6667],
          [2.3333, 2.6667, 3.0000, 3.3333],
          [3.0000, 3.3333, 3.6667, 4.0000]]]])

公众号后台回复关键词:pytorch,获取本文源代码和Bilibili吃货本货视频讲解。【注:本文节选自《eat pytorch in 20 days》当中的《5-2,模型层》 中的第2部分。】

1c1f2015cd88b2795156dc506972fd5f.png

【学习笔记】【Pytorch】七、卷积层 一、**卷积操作**示例 三、**functional.conv2d**函数的使用 **作用**:对几个输入平面组成的输入信号应用2D卷积。 四、**torch.Tensor**与**torch.tensor**区别 **作用**:图片尺寸缩放。 五、**nn.Conv2d**类的使用 **作用**:二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)。 六、**卷积**公式 阅读详情

相关推荐

PyTorch 卷积层详解

本文详细介绍了 PyTorch 的二维卷积层(`nn.Conv2d`),涵盖其参数设置、卷积核的作用、特征图的生成过程,以及如何根据任务需求设置 `out_channels` 参数。通过示例代码展示了如何读取 JPEG 图片、进行卷积操作并保存结果为新图片。解释了 `stride` 和 `padding` 参数对特征图大小的影响,为什么使用 Sigmoid 函数处理输出,以及每个卷积核的独立性和特征提取能力。本文旨在帮助读者更好地理解和应用 PyTorch 的卷积层,构建高效的深度学习模型。

fydw_715的博客 1995

如何计算卷积层的参数个数

一般文献中卷积过程多是对一个通道的图像进行卷积, 但实际中图篇是多通道的,卷积核个数也大于1。比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定不是的。 输出的个数依然是 卷积核的个数,仍然是10个featuremap, 每一层输出feature map 个数 就是该层卷积核的个数。 实际上,卷积操作通过卷...

david0611的博客 2万+

pytorch中卷积层Conv2d函数

pytorch中卷积层Conv2d函数: torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros') 二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,...

qq_24503095的博客 1595

空洞卷积原理详解及其pytorch代码实现

空洞卷积及其pytorch实现

m0_46378271的博客 1万+

pytorch学习笔记(十九):二维卷积层

文章目录1. 二维互相关运算2. 二维卷积层3. 图像中物体边缘检测4. 通过数据学习核数组 卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。 1. 二维互相关运算 虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-cor

逐梦er的博客 4294

【pytorch】卷积层计算规则

torch.nn 里有很多神经网络模型需要的各种层和工具。 神经网络的工作流程: A typical training procedure for a neural network is as follows: Define the neural network that has some learnable parameters (or weights) Iterate over a dataset of inputs Process input through the network Compute

学渣的博客 1万+

Pytorch常用的函数(七)空洞卷积详解

Pytorch常用的函数(七)空洞卷积详解

qq_44665283的博客 3174

pytorch中的卷积操作详解

深度好文-----pytorch中的卷积操作详解 首先说下pytorch中的Tensor通道排列顺序是:[batch, channel, height, width] 我们常用的卷积(Conv2d)在pytorch中对应的函数是: torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, gr

Lily的博客 3090

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 298

RTC温度补偿:如何让时间分秒不差?

RTC(实时时钟)温度补偿技术通过"检测温度→计算误差→动态调整频率"的闭环机制,解决振荡器频率随温度变化导致的时间误差问题。核心步骤包括:1)高精度温度检测;2)基于温度-频率误差模型计算偏差;3)通过硬件(可编程电容/DAC)或软件方式调整振荡频率。该技术需突破温度检测精度、误差模型拟合、频率调整分辨率等关键点,根据不同应用场景(消费电子±5ppm至军工±0.1ppm)选择匹配方案。典型实现如STM32的分段线性补偿算法,可将工业级RTC精度提升至±2ppm以内。

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1230

PyTorch卷积层基础七问

卷积层基础知识

xingman510的博客 729

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 320

pytorch 卷积层

在中,是透过两个函数 f 和 g生成第三个函数的一种数学算子,表征函数 f 与经过翻转和平移的 g 的乘积函数所围成的曲边梯形的面积。函数f,g是定义域上的,两者的卷积记作f*g,即:例如:两个方波的卷积。

浩瀚之水的专栏 1371

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 472

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2855

PyTorch构建卷积层

Pytorch实现2维卷积层

weixin_43276033的博客 1713

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5700

PyTorch学习笔记之一:卷积层

经过卷积后,特征图shape是如何计算?

jinming021的博客 1307

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pytorch mmcv工程之卷积层定义

MMCV卷积层定义 Introduction MMCV is a foundational python library for computer vision research and supports many research projects as below: MMDetection: Detection toolbox and benchmark MMDetection3D: General 3D object detection toolbox and benchmark MMSegme

bairw_Bella的博客 5881

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Pytorch卷积层手动初始化权值

由于研究关系需要自己手动给卷积层初始化权值,但是好像博客上提到的相关文章比较少(大部分都只提到使用nn.init里的按照一定分布初始化方法),自己参考了下Pytorch的官方文档,发现有两种方法吧。所以mark下。 import torch import torch.nn as nn import torch.optim as optim import numpy as np # 第一一个卷积层...

Learn2Learn的博客 1万+

Pytorch 学习 - 8.卷积层

先掌握,学好pytorch, 才能学好人工智能。

chenchihwen的专栏 1332

【PyTorch】卷积层、池化层与 Dropout 层

二维卷积操作

Esperanto.的博客 2931

【PyTorch】PyTorch中torch.nn模块的卷积层

本文介绍了PyTorch中torch.nn模块的核心功能,重点讲解了卷积层的定义、类型及重要参数。torch.nn模块提供神经网络构建所需的层(如卷积层、全连接层)、损失函数和激活函数,支持高度模块化设计和自动求导。文章详细解析了卷积数学原理,并分类说明了一维、二维、三维卷积等常见卷积层的应用场景。最后深入剖析了卷积层的关键参数(in_channels、out_channels、kernel_size等)及其作用机制,通过代码示例展示了参数设置方法。

goldfisheye的博客 1022

pytorch基础(七):卷积层的使用torch.nn.Conv2d和torch.nn.Conv1d

文章目录前言一、前置知识二、torch.nn.Conv2d三、torch.nn.Conv1d 前言   本系列主要是对pytorch基础知识学习的一个记录,尽量保持博客的更新进度和自己的学习进度。本人也处于学习阶段,博客中涉及到的知识可能存在某些问题,希望大家批评指正。另外,本博客中的有些内容基于吴恩达老师深度学习课程,我会尽量说明一下,但不敢保证全面。 一、前置知识   上图就是一个多过滤器(过滤器也被称作为卷积核)卷积层的操作,输入为(6,6,3)的矩阵,输出为(4,4,2)的矩阵。   对于输

一个bug是bug,多个bug能work 4227
上一篇: 30分钟吃掉pytorch中的各种归一化层
下一篇: python cv2报错:ImportError: libGL.so.1: cannot open shared object file: No such file or directory
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值