PyTorch学习笔记之一:卷积层


一、卷积层

卷积层(Convolution Layer):主要用来提取数据特征


PyTorch提供了多种卷积层,其中二维卷积层nn.Conv2d)在计算机视觉中得到广泛的应用。

二、参数

1. 二维卷积层(nn.Conv2d)参数

参数详解

  • in_channels (int):输入通道数,例如:灰度图像为1,RGB彩色图像为3;
  • out_channels (int):输出通道数;
  • kernel_size (int or tuple):卷积核大小。如3x35x5
  • stride (int or tuple, optional):步长,默认值为1;
  • padding (int, tuple or str, optional):填充,默认值为0;
  • dilation (int or tuple, optional):膨胀率,默认值为1;
  • groups (int, optional):分组数,默认值为1;
  • bias (bool, optional):偏置,默认值为True;
  • padding_mode (str, optional):填充模式,默认是zero填充;

2. 举个例子

  • 对一张32x32的彩色图片做一次卷积:
import torch
import torch.nn as nn
 
# 定义卷积层
conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3) # 输入通道数为3,输出通道数为6,卷积核大小为3x3
 
# 输入张量tensor (N, Cin, Hin, Win)
input = torch.rand(1, 3, 32, 32) # 输入通道数为3,图片大小为32x32

# 输出张量tensor (N, Cout, Hout, Wout)
output = conv(input)

# 打印输入和输出的形状
print("输入形状:", input.shape)
print("输出形状:", output.shape)
  • 打印输出结果:
输入形状: torch.Size([1, 3, 32, 32])
输出形状: torch.Size([1, 6, 30, 30])

3. 代码解释

输入一个是(1,3,32,32)的张量,经过Conv2d(3,6,3)卷积后,输出变成一个(1,6,30,30)的张量。

在这里插入图片描述

ps: 注意图中,Channel数目的变化和图片形状大小(h, w)的变化。


卷积后数据维度计算方法:

  • input.shape = ( N = 1, Cin = 3, Hin = 32, Win = 32 )
  • Conv2d(in_channels=3, out_channels=6, kernel_size=3)
  • output.shape = ( N = 1, Cout = 6, Hout= 30, Wout = 30 )
    • Cout = 6: 取自于Conv2dout_channels=6
    • Hout = 30Wout = 30:通过下面计算公式得到:
      • Hout = ⌊ 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 ⌋ \left \lfloor \frac{H_{in}+2 \times padding[0]-dilation[0] \times (kernel\_size[0]-1)-1}{stride[0]} +1\right \rfloor stride[0]Hin+2×padding[0]dilation[0]×(kernel_size[0]1)1+1
      • Wout = ⌊ 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 l _ s i z e [ 1 ] − 1 ) − 1 s t r i d e [ 1 ] + 1 ⌋ \left \lfloor \frac{W_{in}+2 \times padding[1]-dilation[1] \times (kernel\_size[1]-1)-1}{stride[1]} +1\right \rfloor stride[1]Win+2×padding[1]dilation[1]×(kernel_size[1]1)1+1

刚开始,看到公式时候,头就大。静下心来,代入值,化简后,其实很简单。

Hout 为例:

  • Hout = ⌊ 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 ⌋ \left \lfloor \frac{H_{in}+2 \times padding[0]-dilation[0] \times (kernel\_size[0]-1)-1}{stride[0]} +1\right \rfloor stride[0]Hin+2×padding[0]dilation[0]×(kernel_size[0]1)1+1
    其中:
    • padding:默认值为0;
    • dilation:默认值为1;
    • stride:默认值为1;

化简后,

  • Hout = ⌊ H i n − k e r n e l _ s i z e [ 0 ] 1 + 1 ⌋ \left \lfloor \frac{H_{in} - kernel\_size[0]}{1} + 1\right \rfloor 1Hinkernel_size[0]+1 = ⌊ 32 − 3 1 + 1 ⌋ \left \lfloor \frac{32 - 3}{1} + 1\right \rfloor 1323+1 = ⌊ 32 − 3 + 1 ⌋ \left \lfloor 32 - 3 + 1 \right \rfloor 323+1 = 30

同样,化简 Wout 后:

  • Wout = ⌊ W i n − k e r n e l _ s i z e [ 1 ] 1 + 1 ⌋ \left \lfloor \frac{W_{in} - kernel\_size[1]}{1} + 1\right \rfloor 1Winkernel_size[1]+1 = ⌊ 32 − 3 1 + 1 ⌋ \left \lfloor \frac{32 - 3}{1} + 1\right \rfloor 1323+1 = ⌊ 32 − 3 + 1 ⌋ \left \lfloor 32 - 3 + 1 \right \rfloor 323+1 = 30

4. 总结

简单的理解计算公式就是:

  • 在其他参数为默认值情况下: 输出图片大小 = (输入图片大小 − 卷积核大小) 步长 + 1 输出图片大小 = \frac{( 输入图片大小 - 卷积核大小)} {步长} + 1 输出图片大小=步长(输入图片大小卷积核大小)+1

三、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值