DataWhale Task03&Task04&Task05

本文深入探讨了深度学习中的过拟合与欠拟合问题,分析了其原因及解决方案,如K折交叉验证、权重衰减和Dropout策略。同时,文章详细介绍了循环神经网络的高级应用,包括GRU、LSTM以及深度和双向RNN,还讲解了机器翻译的模型框架和损失函数。此外,还讨论了注意力机制、Seq2Seq模型以及卷积神经网络的基本原理。

过拟合欠拟合及其解决方案

概念:

  1. 欠拟合(underfitting):模型无法得到较低的训练误差。
  2. 过拟合(overfitting):训练误差远小于它在测试数据集上的误差。
    主要的影响因素是模型的复杂度和训练数据集的大小,通常模型复杂度低容易欠拟合,复杂度高容易过拟合;数据集小容易过拟合。

常用的解决方案:

  1. 从数据集角度:K折交叉验证,提高数据的利用率。
  2. 从模型复杂度角度:可以才用权重衰减正则和dropout。权重衰减即为增加一个模型参数的范数作为惩罚项来表征模型的复杂度,L1,L2皆可,其中L2正则较为常用。dropout策略是即为使网络中的节点随机失活,为了保证训练集和验证集的结果期望一致,对输出进行拉伸。

编码中的笔记:

def dropout(X, drop_prob):
    X = X.float()
    assert 0 <= drop_prob <= 1
    keep_prob = 1 - drop_prob
    # 这种情况下把全部元素都丢弃
    if keep_prob == 0:
        return torch.zeros_like(X)
    mask = (torch.rand(X.shape) < keep_prob).float()
    
    return mask * X / keep_prob

从return语句中可以看出,dropout是对所有的输出都进行拉伸而不是概率拉伸。

梯度消失、梯度爆炸

  1. 当神经网络的层数较多时,模型的数值稳定性容易变差。在优化的过程中,梯度反向传播,传播得越深,就会出现消失或者爆炸。
  2. 参数随机初始化,是为了提高模型的复杂度。常用的有正态分布初始化和均匀分布初始化。
  3. 三个偏移:协变量偏移,标签偏移,概念偏移。
  4. Kaggle实战一般流程:数据获取——数据预处理——模型训练——参数选择——模型选择

循环神经网络进阶

  1. GRU

GRU结构图
重置⻔有助于捕捉时间序列⾥短期的依赖关系;
更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。

2.LSTMLSTM结构图
遗忘门:控制上一时间步的记忆细胞
输出门:控制从记忆细胞到隐藏状态
输入门:控制当前时间步的输入
记忆细胞:⼀种特殊的隐藏状态的信息的流动

GRU和LSTM是带有遗忘功能的RNN,这种遗忘功能可以缓解梯度衰减或者梯度爆炸,也更能模拟人类的记忆行为。

深度循环神经网络即增加RNN的层数,层数多可以学习到更加抽象的特征,但是并不是越深越好。

双向循环神经网络相当于将训练数据正序和逆序输入两个网络,将网络的结果concat拼接起来,这样的结构可以同时记录前向和后向的联系。

机器翻译及其相关技术

本章主要介绍了MT的数据处理方法,基本模型框架,损失函数以及其他解决方法。

  1. 数据处理。这一部分主要是讲述如何建立从文本到数据的映射:用正则表达式对文本进行规整,然后建立从idex到vocabulary的list和map。
  2. 为了解决翻译时文字不等长的问题,提出了encoder-decoder的框架,先对编码器输出训练数据,训练出一个RNN,然后对解码器输入label对RNN结构进行调整。
  3. MT中用到的损失函数是softmax,因为文字是离散的数据,用softmax效果更好,其中在code的过程中,因为要保证每个batch的大小一致,所以针对不同长度的语句会进行padding,整理成一样大小后再输入网络。这里就涉及到了有效长度的概念和解除padding的操作。
def SequenceMask(X, X_len,value=0):
    maxlen = X.size(1)
    mask = torch.arange(maxlen)[None, :].to(X_len.device) < X_len[:, None]   
    X[~mask]=value
    return X
  1. Beam Search。这是一种为了提高模型精度的策略。采用了贪心的思想,因为词与词之间有联系,所以每次输出的结果可能是局部最优而非全局最优,所以这里每次保留最优和次优的结果,增大了解空间,提高了模型的精度。

注意力机制与Seq2Seq模型

Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。 ki∈Rdk,vi∈Rdv . Query q∈Rdq , attention layer得到输出与value的维度一致 o∈Rdv . 对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量 o 则是value的加权求和,而每个key计算的权重与value一一对应。
在MT的encoder-decoder框架中,引入Attention机制可以将目标单词的翻译选择过程显式地建模。
在这里插入图片描述
query 和 keys 的计算可以采用点积也可以采用多层感知机,多层感知机用得相对广泛

卷积神经网络

CNN和普通的神经网络的不同在于卷积操作。但卷积层中用到的并非卷积运算而是互相关运算。我们将核数组上下翻转、左右翻转,再与输入数组做互相关运算,这一过程就是卷积运算。由于卷积层的核数组是可学习的,所以使用互相关运算与使用卷积运算并无本质区别。

  1. 通道
    CNN在输出上有一个新的概念——通道。因为图片的颜色是有通道的,所以很自然地引入了这个概念,在我看来,这个概念是和图片的形状正交的,所以这个概念可以扩展,扩展到除了颜色的其他特征维度,故而有了出入通道和输出通道的引入。
  2. 卷积
    在单个通道上的卷积操作实际上是前面提到的互相关运算,在计算时可以通过调节kernel的size,padding和stride的大小而控制卷积层的输出size,所以在卷积操作中,整个kernel核组成的二维数组等同于全连接层中的一个w,所以有了下面的代码中bias的size
class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super(Conv2D, self).__init__()
        self.weight = nn.Parameter(torch.randn(kernel_size))
        self.bias = nn.Parameter(torch.randn(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias
  1. 池化
    池化层主要用于缓解卷积层对位置的过度敏感性。同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出,池化层直接计算池化窗口内元素的最大值或者平均值,该运算也分别叫做最大池化或平均池化。
    池化层也可以在输入的高和宽两侧填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。
    在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。
Security-feature-detection-system 安全检测系统 简介 安全检测系统-多目标识别(YOLOv5)和人脸识别(Facenet)快速部署系统。 功能上:本项目使用YOLOv5实现多目标识别,使用Facenet实现人脸识别,最终需要人脸和此人应具备的多目标同时满足才能通过安全检测,部署上:使用pyqt5实现前端可视化,在前端页面运行YOLOv5多目标识别系统(将模型运行封装到Qt中),使用Docker封装人脸识别后端系统,使用网络请求等包实现前后端交互 案例:进行多目标识别的同时,进行人脸识别,前端系统发送请求,携带参数到后端进行人脸识别,最终返回人脸识别结果,获取人脸识别结果后,检索该成员应具备的多目标特征,与YOLOv5多目标识别的实际结果进行比对,若无误则通过安全检测。 根据原作 https://pan.quark.cn/s/9784cdf4abfd 的源码改编 项目背景 出于一些比赛的需要,以及逃离懵懂状态开始探索,我于2023.12~2024.1(大二上)开始一些CV、LLM项目的研究,苦于能力有限,当时大部分的项目都是依托开源搭建而来,诸如本项目就是依托开源的Compreface和Yolov5搭建,我只不过做了缝合的工作,所以在此必须提及这两个项目的巨大贡献:https://.com/exadel-inc/CompreFace https://.com/ultralytics/yolov5 今天是2024.7.11(大二下暑假),时隔半年我才开始这个项目的开源工作是因为,半年前的水平有限,虽然自己能实现项目的运作,但是恐很多细节介绍不好,当然本文自发出,后续我还会跟进,欢迎指正:22012100039@stu.xidian.edu.c...
使用教程: https://pan.quark.cn/s/c0f2b4acdf83,有不会的再问我  功能介绍: 用户输入人脸照片,程序从照片库中选出10张最相似人脸照片输出在文件夹中,并且给出这十张人脸与输入人脸的相似度值。 照片库可以增删 调节相似度阈值可调节 自定义UI操作界面 视频演示: [[项目分享]基于OpenCV的人脸集合相似度检测系统(源码&UI&教程)哔哩哔哩bilibili](https://www.bilibili.com/video/BV1Wa41137CW/?vd_source=bc9aec86d164b67a7004b996143742dc) 图片演示: png png 人脸相似度对比原理: 整体思路: 1、预先导入所需要的人脸识别模型; 2、遍历循环识别文件夹里面的图片,让模型“记住”人物的样子; 3、输入一张新的图像,与前一步文件夹里面的图片比对,返回最接近的结果。 使用到的第三方模块和模型: 1、模块:os,dlib,glob,numpy; 2、模型:人脸关键点检测器,人脸识别模型。 导入需要的模型。 这里解释一下两个dat文件: 它们的本质是参数值(即神经网络的权重)。 人脸识别算是深度学习的一个应用,事先需要经过大量的人脸图像来训练。 参考该博客,设计一个神经网络结构,来“记住”人类的脸。 对于神经网络来说,即便是同样的结构,不同的参数也会导致识别的东西不一样。 在这里,这两个参数文件就对应了不同的功能(它们对应的神经网络结构也不同): shapepredictor.dat这个是为了检测人脸的关键点,比如眼睛,嘴巴等等;dlibface_recognition.dat是在前面检测关键点的基础上,生成人脸的特征值。 所以后面使用dlib模块的时...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值