pytorch学习—conv2d

1. 卷积层

一般完整的CNN整个卷积神经网络,使用的层包括:

1.卷积层(Convolutional layer)

2.池层(Pooling layer)

3.全连接层(fully connected layer)

典型的cnn网络结构是由上述三类层构成:

在CNN中,卷积层(CONV)使用过滤器执行卷积操作。因为它扫描输入图像的尺寸。它的超参数包括滤波器大小,可以是2x2、3x3、4x4、5x5(或其它)和步长S。结果输出O称为特征映射或激活映射,具有使用输入层计算的所有特征和过滤器。
下面描绘了应用卷积的工作过程:

2. conv2d函数

pytorch深度学习库中的Conv2d是用来实现2d卷积操作的函数,一般应用于图像卷积。 conv2d的输入是:batch, channels, H, W],卷积核是矩形,在三四维上进行。例如:

input(2, 3, 4, 5) -> filter(5, 3, 2, 3) -> output(2, 5, 3, 4)。
 

函数定义

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
参数说明:
  • in_channels (int) – 输入通道个数。
  • out_channels (int) – 输出通道个数 。有多少个out_channels,就需要多少个卷积(也就是卷积核的数量)
  • kernel_size(int or tuple) – 卷积核的尺寸;卷积核的第二个维度由in_channels决定,所以实际上卷积核的大小为kernel_size * in_channels
  • stride (int or tuple, optional) – 卷积操作的步长, 默认:1

  • padding (int or tuple, optional) – 输入数据各维度各边上要补齐0的层数,默认: 0

  • dilation (int or tuple, optional) – 卷积核各元素之间的距离,默认: 1

  • groups (int, optional) – 输入通道与输出通道之间相互隔离的连接的个数, 默认:1

  • bias (bool, optional) – 如果被置为True,向输出增加一个偏差量,此偏差是可学习参数。 默认:True

参数dilation——扩张卷积

如果设置了dilation参数,卷积输出公式为:
             --- 公式1
dilation是卷积核各元素参数的距离,所以引入dilation参数后,卷积核尺寸会相应变大。相当于原有kernal_size变为了:
             --- 公式2

 所以,上面的公式2相当于:

          

以一个例子来看,假设定义了一个3*3的卷积核,dialtion参数设置为1。此时的卷积和常规卷积是一样的,卷积过程如下:
图1 dilation=1 的3*3卷积过程
如果把dilation设置为2, 卷积核中各元素之间的间距为2, 即中间隔着一个空白方格。此时new_kernalsize为2*(3-1)=6, 相当于一个6*6的卷积核。
图2 dilation=2的3*3卷积过程

3. 代码示例

通过torch生成batch_size:3,channel3,W:9,  H:9,  即[3, 3, 9, 9]的样本数据,分别应用6种卷积核对样本数据进行卷积, 如下:
def conv2d_example():
    # 样本数为3,channel:3, w:9, H:9
    x = torch.rand(3, 3, 9, 9)
    print(x.shape)

    # case1 in_channels=3, out_channels=6, kernel_size=3
    conv1 = nn.Conv2d(3, 6, 3)
    x1 = conv1(x)
    print("[case1] in_channels=3, out_channels=6, kernel_size=3: ", x1.shape)

    # [case2] stride_size=3
    conv2 = nn.Conv2d(3, 6, 3, 3)
    x2 = conv2(x)
    print("[case2] stride_size=3: ", x2.shape)

    # [case3] kernel_size=(3,2)
    conv3 = nn.Conv2d(3, 6, (3, 2))
    x3 = conv3( x)
    print("[case3] kernel_size=(3,2): ", x3.shape)

    # [case4] padding=3
    conv4 = nn.Conv2d(3, 6, 3, 1, 2)
    x4 = conv4(x)
    print("[case4]padding=3: ", x4.shape)

    # [case5] dilation=3
    conv5 = nn.Conv2d(3, 6, 3, 1, 0, 3)
    x5 = conv5(x)
    print("[case5]dilation=3: ", x5.shape)

    # [case6] groups=3
    conv6 = nn.Conv2d(3, 6, 3, groups=3)
    x6 = conv6(x)
    print("[case6]groups=3: ", x6.shape)
运行结果如下:

4. 参考文档

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值