AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络

过拟合

造成过拟合的几种情况:
①训练集时间过久
②模型过于庞大,超出任务规模
③训练集的数据太好,测试集的数据太差

过拟合的现象:
训练时分数很高,测试时分数很低
回归曲线过于复杂,且过度详细的描述了变化

造成过拟合的根本原因:
参数过多
模型中的参数过多,令模型规模过大,学习到的错误信息更多。
也更可能超出了任务需求的规模
基于此原因,过拟合,常常出现在大型深度网络中

不同模型的过拟合情况:
相对于卷积,全连接“更容易”过拟合
原因如图:
AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络_第1张图片
解决过拟合的几种方式:
①增大数据量。使用更多数据来匹配网络深度,确保每个参数都能表述数据特征
②提高数据质量。使用更好的、噪声更小、标签更详细的数据集进行训练,避免错误学习
③数据增强。对已有的高质量数据精细旋转、剪切、变形、卷积等操作,提升高质量数据率
④丢弃法(Dropout)。在训练开始时随机忽略一部分参数,降低参数数量和网络深度,避免进一步错误学习
⑤优化网络结构,如卷积层间的连接方式、池化的顺序等

池化

概念:通过选定某区域内中的特定数值,对原图像进行压缩操作(下采样)
目的:保留特征、压缩尺寸
定位:与激活函数类似,不产生参数,不算神经元(感知机)/感受野(卷积)
用法:“最大池化(MaxPool)”最常用,平均池化偶尔用

池化的过程图解:
AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络_第2张图片

Dropout(随机删除参数)

在训练开始时随机忽略一部分参数,降低参数数量和网络深度,避免进一步错误学习

值得注意的是,测试模式中的eval()方法与之相反。
eval()会使用所有的网络参数来进行计算

使用例:

'''
过拟合的抑制方法:dropout
使用例:

# 普通卷积层
nn.Conv2d(3, 10, 3, 1)
nn.ReLU()
# 使用Dropout随机抑制20%的参数(权重),防止过拟合
nn.Dropout2d(0.2)  # 注意:卷积使用的是2d


# 普通全连接层
nn.Linear(256,512)
nn.Dropout(0.2)  # 全连接直接Dropout()即可

# 测试时使用net.eval()模式,即可恢复使用全部参数
'''

交叉熵

一种“常用于回归问题”的损失函数。计算方式为,将输出与标签one_hot(独热化)后的对数相乘、求和计算得到的结果
因与信息熵的计算方式相似而得名
AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络_第3张图片
在实际使用中,由于会存在“不符合标签,乘积为0的情况”
一般会加上“补充交叉熵”(个人命名),在不符合标签时用其输出/标签的“补数”独立计算,并加入损失函数中
如下图中:
判断为狗时,狗的期望(标签)=1,概率为0.89,可以正常计算交叉熵
判断为猫时,狗的期望=0,计算得到的交叉熵消失。这时使用补充交叉熵即可正常表达损失
AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络_第4张图片

残差网络

一种解决梯度消失问题而建立的网络模块
核心方法:在所有输出后,+上原始输入
原理:常规网络并不能避免梯度消失——某层参数为0时,使后续输出全都为0,导致无法进行反向传播和梯度计算——
导致此问题的核心即为:参数与输入作乘法

残差网络即为:在这一前提下,在所有输出后,一个输入参数
由于加法的引入,大大降低了梯度消失的出现概率
AI学习[随堂笔记1124]_过拟合基础_池化_丢弃法Dropout_交叉熵_残差网络_第5张图片

代码实现

import torch
from torch import nn


# 残差网络的模块化建立
class res_net(nn.Module):
    def __init__(self, in_size, out_size):
        super(res_net, self).__init__()
        # 为何要引入输入值?
        # A:残差网络不进行数值计算,只进行“增加输入值”这一项操作,不需要进行真正卷积
        # 建立一个卷积层,入:输入大小;出:无所谓,并不进行实际运算
        self.conv1 = nn.Conv2d(in_size, 64, 1, 1)
        # 入:与上层一致即可;出:输出尺寸
        self.conv2 = nn.Conv2d(64, out_size, 1, 1)

    def forward(self, x):
        # 一次前向传播,平平无奇
        out1 = self.conv1(x)
        # 可以激活,也可以不激活
        out1 = self.relu(out1)
        # 再使用一次卷积层
        out2 = self.conv2(out1)
        return out2 + x  #核心中的核心,重点中的重点
        # 常规网络并不能避免**梯度消失**——某层参数为0时,使后续输出全都为0,导致无法进行反向传播和梯度计算——
        # 问题的核心是:”乘法运算“。既然如此,便进行”加法运算来破解“。
        # 在所有网络层后,都加上此层的原始输入,以降低“参数为0”的概率————即为残差网络的核心
        ```

你可能感兴趣的:(深度学习,过拟合,笔记,人工智能,学习,网络)