PyTorch 卷积神经网络介绍

2020-10-5 16:36:56 来源: GNSSer 发布人:

本文代码:

卷积神经网络简介

卷积神经网络(CNN)主要由一些卷积层堆叠在一起,通常还会有一些正则层和激活层。

神经网络的组成

卷积神经网络的组成部分总结如下:

  • CNN—— 一堆卷积层。
  • 卷积层—— 能够检测一定的特征,具有特定数量的通道。
  • 通道—— 能够检测图像中的具体特征。
  • 核/过滤器—— 每个通道中会被检测到的特征。它有固定的大小,通常为3X3。
  • 简单来说,卷积层相当于一个特征检测层。每个卷积层有特定数目的通道,每个通道能够检测出图像中的具体特征。需要检测的每个特征常常被叫做核(kernel)或过滤器,它们都有固定大小,通常为3X3。

    PyTorch中的模型架构

    在PyTorch中,通过能扩展Module类的定制类来定义模型。模型的所有组件可以在torch.nn包中找到。因此,我们只需导入这个包就可以了。这里我们会搭建一个简单的CNN模型,用以分类来自CIFAR 10数据集的RGB图像。该数据集包含了50000张训练图像和10000张测试图像,所有图像大小为32 X 32。

    在下面的代码中,我们首先定义了一个新的类,叫做SimpleNet,它会扩展nn.Module类。在这个类的构造函数中,我们指明了神经网络的全部层。我们的神经网络结构为——ReLU层——卷积层——ReLU层——池化层——卷积层——ReLU层——卷积层——ReLU层——线性层。

    # 导入需要的包
    import torch
    import torch.nn as nn


    class SimpleNet(nn.Module):
    def __init__(self, num_classes=10):
    super(SimpleNet, self).__init__()

    self.conv1 = nn.Conv2d(in_channels=3, out_channels=12, kernel_size=3, stride=1, padding=1)
    self.relu1 = nn.ReLU()

    self.conv2 = nn.Conv2d(in_channels=12, out_channels=12, kernel_size=3, stride=1, padding=1)
    self.relu2 = nn.ReLU()

    self.pool = nn.MaxPool2d(kernel_size=2)

    self.conv3 = nn.Conv2d(in_channels=12, out_channels=24, kernel_size=3, stride=1, padding=1)
    self.relu3 = nn.ReLU()

    self.conv4 = nn.Conv2d(in_channels=24, out_channels=24, kernel_size=3, stride=1, padding=1)
    self.relu4 = nn.ReLU()

    self.fc = nn.Linear(in_features=16 * 16 * 24, out_features=num_classes)

    def forward(self, input):
    output = self.conv1(input)
    output = self.relu1(output)

    output = self.conv2(output)
    output = self.relu2(output)

    output = self.pool(output)

    output = self.conv3(output)
    output = self.relu3(output)

    output = self.conv4(output)
    output = self.relu4(output)

    output = output.view(-1, 16 * 16 * 24)

    output = self.fc(output)

    return output


    卷积层

    nn.Conv2d(in_channels=3, out_channels=12, kernel_size=3, stride=1, padding=1)
    

    因为我们的输入为有 3 个通道(红-绿-蓝)的 RGB 图像,我们指明 in_channels 的数量为 3。接着我们想将 12 特征的检测器应用在图像上,所以我们指明 out_channels 的数量为 12。这里我们使用标准大小为 3X3 的核。步幅设定为 1,后面一直是这样,除非你计划缩减图像的维度。将步幅设置为 1,卷积会一次变为 1 像素。最后,我们设定填充(padding)为 1:这样能确保我们的图像以0填充,从而保持输入和输出大小一致。

    基本上,你不用太担心目前的步幅和填充大小,重点关注 in_channels 和 out_channels 就好了。
    注意这一层的 out_channels 会作为下一层的 in_channels,如下所示:

    nn.Conv2d(in_channels=12, out_channels=12, kernel_size=3, stride=1, padding=1)
    
    ReLU

    这是标准的 ReLU 激活函数,它基本上会将所有输入进来的特征变为 0 或更大的值。简单说,当你用 ReLU 处理输入特征时,任何小于 0 的数字都会被变为 0,其余值保持不变。

    MaxPool2d

    这一层会通过将 kernel_size 设置为 2、将图像的宽和高减少 2 倍来降低图像的维度。它的基本操作就是在图像的 2X2 区域内取像素最大值,用它来表示整个区域,因此 4 像素就会变成只有 1 个。

    线性层

    我们的神经网络的最后一层为线性层。这是个标准的全连接层,它会计算每个类的分值——在我们这个例子中是 10 个类。

    注意:我们在将最后一个卷积 -ReLU 层中的特征图谱输入图像前,必须把整个图谱压平。最后一层有 24 个输出通道,由于 2X2 的最大池化,在这时我们的图像就变成了16 X 16(32/2 = 16)。我们压平后的图像的维度会是16 x 16 x 24,实现代码如下:
    output = output.view(-1, 16 * 16 * 24)

    在我们的线性层中,我们必须指明 input_features 的数目同样为 16 x 16 x 24,out_features 的数目应和我们所希望的类的数量一致。

    注意在 PyTorch 中定义模型的简单规则。在构造函数中定义层级,在前馈函数中传递所有输入。






    阅读次数: 248

    下一篇: SimpleNet.py -PyTorch从零搭建图像分类模型
    上一篇: 用PyTorch从零搭建图像分类模型

    尚无评论!

    返回上一页面