深度学习入门到精通——基本的卷积神经网络

原始卷积神经网络

  • 局部连接(稀疏链接)

  • 原理操作 :卷积核可以当做是个滤波器,核参数的变化会形成不同的滤波器,例如高通滤波器、低通滤波器、阻带滤波器等等。利用不同的卷积核对同一个特征图进行卷积,采用滑动窗口的步长。卷积神经网络的能力强弱一般取决与卷积通道数的多少与特征图的大小。

  • 首先清楚两点:

    1. 深度学习中,网络越深,学习到的特征高度语义化、抽象化、其能力也越强。
    1. 网络模型越宽,学习到的特征更具多样性。
  • 两者往往需要与计算时间效率做一个平衡。
    深度学习入门到精通——基本的卷积神经网络_第1张图片

  • 优点

    1. 局部连接,也叫做稀疏链接。为什么稀疏呢,从之前的之前的全连接神经网络来看。全连接神经网络,上一层的输出就是下一层的输入,完全稠密化连接,对于我们的任务来说,噪声往往占据很大一部分,那么神经元里面往往存在的就是无用特征,这对于网络的效率与内存都是非常耗费的。——太多无用特征参与计算,影响效率。深度学习入门到精通——基本的卷积神经网络_第2张图片
      因此,卷积神经网络,一般情况下,特征图的尺寸都比卷积核的尺寸大。卷积核在特征图上位置进行运算时,都是与特征图的一部分进行连接从而形成卷积后的特征图。
    • 权重共享 每个卷积核针对同一特征图空间上位置输入都是一样滴,只是核不同,卷积核的输入都是一样的。
  • 平移不变形:针对图像分类任务来说,我们要求尽管目标在图中进行一定量的偏移,模型仍然能够输出与同源图像一致的结果。

  • 平移等变性:针对目标检测任务和分割任务。当输入任务目标发生一定偏移量变化时,模型的输出也能够发生相同的变换。

from torch import nn
import torch


class CnnNet(nn.Module):

    def __init__(self, in_ch=1):
        super(CnnNet, self).__init__()

        self.model = nn.Sequential(
            nn.Conv2d(in_channels=in_ch, out_channels=32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1)),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1)),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.Conv2d(in_channels=64, out_channels=32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1)),
            nn.BatchNorm2d(32),
            nn.ReLU()
        )

        self.output = nn.AdaptiveAvgPool2d((1,1))

        self.mlp = nn.Sequential(nn.Linear(32,100),
                                 nn.Dropout(0.5),
                                 nn.Linear(100,10)
                                 )


    def forward(self,x):

        result = self.model(x)
        result = self.output(result)
        result = result.reshape(-1,32)
        result = self.mlp(result)
        return result


if __name__ == '__main__':
    x = torch.randn(1,1,28,28)
    net = CnnNet(in_ch=1)
    print(net(x).shape)

你可能感兴趣的:(深度学习,python,pytorch,卷积,神经网络,计算机视觉,深度学习)