神经网络与深度学习-2

本文介绍了卷积神经网络的基础,包括卷积层的特征提取、池化层的降维策略以及BP算法的应用。重点讨论了LeNet-5网络的结构,强调了其特点如不填充、平均池化、ReLU激活函数等,并对比了不同规模网络的变化。
摘要由CSDN通过智能技术生成

1、卷积神经网络基础

1.1卷积层

      现在我要识别一个带数字的图像(比如是3),得到其中的数字是几,考虑:把0—9分别跟图像对照,得到一组概率,概率最大的对应数字就是结果,这组概率是如何计算的呢?这就涉及到了特征值与特征提取。

数学层面的思考:

特征选择与特征提取-CSDN博客

      对于全连接网络,权值过多,计算慢,难收敛,同时可能进入局部极小值,也容易产生过拟合问题,为解决该问题,使用局部连接网络,在上层提取特征的基础上获取进行再处理,得到更高级别的特征。

       计算卷积:有两个已知量:图像的二维矩阵(图中蓝色)和卷积核(深蓝色),作卷积(对应位置数值相乘后再相加),按步长(图中为2)运算,得到一个二维矩阵(绿色)。可以看到,五阶阵变为了二阶阵。

    在这种计算中,中间的部分会比边缘值计算更多次,因此通常用0或者复制边界像素来进行填充,保证计算的“公平”。

1.2池化层

      为进一步解决特征值过多问题,引入池化层,如下图:把这个4阶阵分成4部分,每块取本区域的最大值,这种计算的本质是进一步得到更符合的特征值。还可以取区域内平均值作为结果。

1.3 BP算法

        将全连接网络与卷积层、池化层结合,如下图,针对文章识别数字的问题,经过两次卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。

     对于卷积层和池化层,再次推导BP算法,得到结果:

机器学习(十三)卷积神经网络(CNN)详细公式推导_cnn卷积神经数学公式-CSDN博客 

2、LeNet-5网络

 

C1卷积层:经过(5*5*1)*6卷积核,6为滤波器的数量,stride=1,生成特征图为28*28*6。输入的图像是一个单通道的图像,所以这里特征图的数量,就等于卷积核的数量,每一个输入通道都与输入通道相连。C1层包含了156个可训练的参数,122304个连接。
S2池化层:这是一个(2*2)的采样核,stride=2,生成特征图为(14*14*6),这里的池化层虽然没有卷积核,但是也有训练参数,即偏移量。所以包含12个训练参数,5880个连接。
C3卷积层:经过(5*5*6)*16卷积核,stride=1,生成特征图为10*10*16.输入是6个通道,输出是16个通道。编码表如上面连接表所示。C3层总共包含了1516个可训练数据,151600个连接。
S4池化层:经过(2*2)采样核,stride=2,生成特征图为5*5*16。S4有32个可训练参数,2000个连接。
C5全连接层:经过(5*5*16)*120卷积核,stride=1,生成特征图为1*1*120,这就是一个全连接层了,所以输出的每一个通道都会跟输入的所有通道相连。C5层有48120个可训练数据。
F6全连接层:输入为1*1*120,输出为1*1*84,总参数量为120*84。

import torch.nn as nn
class LeNet5(nn.Module):
 
    def __init__(self):
        super(LeNet5, self).__init__()
        # 1 input image channel, 6 output channels, 5x5 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 5 * 5, 120) # 这里论文上写的是conv,官方教程用了线性层
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
 
    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
 
    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features
 
 
net = LeNet5()
print(net)
===========================================================
LeNet5(
  (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
  (fc1): Linear(in_features=400, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

LeNet-5一些特点:

(1) 卷积时不进行填充( padding
(2)池化层选用平均池化而非最大池化
(3)选用 Sigmoid tanh 而非 ReLU 作为非线性环节激活函数
(4)层数较浅,参数数量小(约为 6 万)

 

3、基本卷积神经网络

网络结构:

 特点:

(1) 池化层均采用最大池化
(2)选用 ReLU 作为非线性环节激活函数
   Relu函数:f(x)=max(0,x)
   采用非饱和线性单元——ReLU 代替传统的经常使用的 tanh 和 sigmoid 函数,加速了网络训练的速度,降低了计算的复杂度,对各种干扰更加具有鲁棒性,并且在一定程度上避免了梯度消失问题。
(3)网络规模扩大,参数数量接近 6000
(4)出现“多个卷积层 + 一个池化层”的结构

(5)dropout 防止过拟合,提高泛化能力

使用了 Dropout 技巧随机忽略一部分神经元,缓解了神经网络的过拟合现象,和防止对网络参数优化时陷入局部最优的问题,该网络是利用 Dropout 在训练过程中将输入层和中间层的一些神经元随机置零,使得训练过程收敛的更慢,但得到的网络模型更加具有鲁棒性。 

5种经典卷积神经网络(含代码)_卷积神经网络代码-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值