torch.nn.Conv2d介绍——Pytorch中的二维卷积层

  torch.nn.Conv2d是torch.nn模块中的二维卷积层类,用于构建神经网络中的二维卷积层。

1、基本语法

python 复制代码
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)

将 2D 卷积应用于由多个输入平面组成的输入信号。

在最简单的情况下,具有 input size ( N , C i n , H , W ) (N,C_{in},H,W) (N,Cin,H,W) 和 output ( N , C o u t , H o u t , W o u t ) (N,C_{out},H_{out},W_{out}) (N,Cout,Hout,Wout)的层的输出值可以精确描述为:
o u t ( N i , C o u t j ) = b i a s ( C o u t j ) + ∑ k = 0 C i n − 1 w e i g h t ( C o u t j , k ) ∗ i n p u t ( N i , k ) out(N_i,C_{out_{j}})=bias(C_{out_{j}})+\sum_{k=0}^{C_{in}-1}weight(C_{out_{j}},k)*input(N_{i},k) out(Ni,Coutj)=bias(Coutj)+k=0∑Cin−1weight(Coutj,k)∗input(Ni,k)

其中 ⋆ ⋆ ⋆ 是有效的 2D 互相关运算符, N N N是批量大小, C C C 表示通道数, H H H是输入平面的高度(以像素为单位), W W W是宽度(以像素为单位)。

该模块支持 TensorFloat32。

  • stride 控制互相关的步幅,单个数字或元组。
  • padding 控制应用于输入的填充量。它可以是一个字符串 {'valid', 'same'} 或一个 int / 一个 int 元组,给出在两侧应用的隐式填充量。
  • dilation 控制内核点之间的间距;也称为 à trous 算法。这更难描述,但这个链接很好地可视化了 dilation 它的作用。
  • groups 控制输入和输出之间的连接。 in_channels ,并且 out_channels 两者都必须能被 groups 整除。例如
    在 groups=1 时,所有输入都与所有输出进行卷积。
    在 groups=2 时,该作相当于并排有两个 conv 层,每个 conv 层看到一半的 input channels,产生一半的 output channels,然后两个 级联。
  • 在 groups= in_channels 处,每个输入通道都与自己的一组滤波器(大小 o u t _ c h a n n e l s i n _ c h a n n e l s \frac{out\_channels}{in\_channels} in_channelsout_channels)进行卷积。

参数 kernel_size , stride dilation , padding , 可以是:

  • 一个整数 -- 在这种情况下,height 和 width 维度使用相同的值
  • 两个整数的元组 -- 在这种情况下,第一个 int 用于高度维度,第二个 int 用于宽度维度

2、Parameters 参数

  • in_channels (int) -- 输入图像中的通道数
  • out_channels (int) -- 卷积产生的通道数
  • kernel_size (int or tuple) -- 卷积内核的大小
  • stride (int or tuple, optional) - 卷积的步幅。默认值:1
  • padding (int, tuple or str, optional) -- 添加到输入的所有四个边的填充。默认值:0
  • dilation (int 或 tuple,可选) -- 内核元素之间的间距。默认值:1
  • groups (int, optional) -- 从输入通道到输出通道的阻塞连接数。默认值:1
  • bias (bool, optional) -- 如果 ,则 True 向输出添加可学习的偏差。默认值: True
  • padding_mode (str,可选) -- 'zeros' 、 'reflect' 'replicate' 或 'circular' .默认值: 'zeros'

3、Shape: 形状

  • 输入: ( N , C i n , H i n , W i n ) (N,C_{in},H_{in},W_{in}) (N,Cin,Hin,Win) 或 ( C i n , H i n , W i n ) (C_{in},H_{in},W_{in}) (Cin,Hin,Win)
  • 输出: ( N , C o u t , H o u t , W o u t ) (N,C_{out},H_{out},W_{out}) (N,Cout,Hout,Wout) 或 ( C o u t , H o u t , W o u t ) (C_{out},H_{out},W_{out}) (Cout,Hout,Wout)
    其中:
    H o u t = H i n + 2 × p a d d i n g \[ 0 − d i l a t i o n 0 × ( k e r n e l s i z e 0 − 1 ) − 1 s t r i d e 0 + 1 ] H_{out}=\\frac{H_{in}+2\\times padding\[0-dilation0\times (kernel_size0-1)-1}{stride0}+1] Hout=stride\[0Hin+2×padding0−dilation0×(kernelsize0−1)−1+1]
    W o u t = W i n + 2 × p a d d i n g \[ 1 − d i l a t i o n 1 × ( k e r n e k s i z e 1 − 1 ) − 1 s t r i d e 1 + 1 ] W_{out}=\\frac{W_{in}+2 \\times padding\[1-dilation1 \times (kernek_size1-1)-1}{stride1}+1] Wout=stride\[1Win+2×padding1−dilation1×(kerneksize1−1)−1+1]

4、Variables 变量:

  • weight (Tensor) :形状为 ( o u t _ c h a n n e l s , i n _ c h a n n e l s g r o u p s , k e r n e l _ s i z e 0 , k e r n e _ s i z e 1 ) (out\_channels,\frac{in\_channels}{groups} , kernel\size0,kerne\size1) (out_channels,groupsin_channels,kernel_size0,kerne_size1)的模型的可学习权重。这些权重的值是从 u ( ( − k , k ) u((-\sqrt{k},\sqrt{k}) u((−k ,k )中抽样的, k = g r o u p s C i n ∗ ∏ i = 0 1 k e r n e l _ s i z e i k=\frac{groups}{C{in}* {\textstyle \prod{i=0}^{1}}kernel\_sizei } k=Cin∗∏i=01kernel_sizeigroups
  • bias (Tensor) :形状 ( o u t _ c h a n n e l s ) (out\channels) (out_channels)的模型的可学习偏差。如果 bias 是True 则这些权重的值从 u ( ( − k , k ) u((-\sqrt{k},\sqrt{k}) u((−k ,k )中抽样, k = g r o u p s C i n ∗ ∏ i = 0 1 k e r n e l _ s i z e i k=\frac{groups}{C{in}* {\textstyle \prod_{i=0}^{1}}kernel\_sizei } k=Cin∗∏i=01kernel_sizeigroups

5、例子

python 复制代码
# With square kernels and equal stride
m = nn.Conv2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
# non-square kernels and unequal stride and with padding and dilation
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
input = torch.randn(20, 16, 50, 100)
output = m(input)
相关推荐
IT_陈寒1 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
大模型真好玩2 小时前
什么是Loop Engineering?最通俗易懂的Loop Engineering核心概念
人工智能·agent·deepseek
叁两3 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
顾林海3 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
LaiYoung_3 小时前
🎁 送你一套超好用超实用的 FE AI-Coding Skills
前端·人工智能·开源
ZzT5 小时前
怎么做才不会被 AI 替代?
人工智能·程序员
道友可好5 小时前
从今天开始:你的第一个 Harness Engineering 实践
前端·人工智能·后端
呱呱复呱呱6 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
小姜前线技术7 小时前
AI回答代码块高亮加一键复制
人工智能
洛阳泰山7 小时前
从 0 到 1.6K Star:一个 Java 开源项目的增长复盘
人工智能·后端·开源