0118-深度学习基础及一些代码实例

深度学习入门

1.深度学习基础

1.1 深度学习与传统神经网络的区别

在这里插入图片描述

1.2 深度学习合适的目标函数

我们在传统神经网络里已经得到一种目标函数就是均方误差:
在这里插入图片描述但是在深度学习里面最常见的目标函数是交叉熵,如下图所示:
在这里插入图片描述从上图可以的看到交叉熵收敛的比均方差快的多!!可以想象为交叉熵目标函数的最优值搜索空间的“地形”更“陡”,更有利于快速的找到最优值,如下图所示。
在这里插入图片描述

注意线性回归的时候均方差比较好用,但是作分类问题的时候交叉熵比较好用,因为交叉熵涉及到了概率的观念。
有关交叉熵的介绍

1.3 Softmax层

一个介绍Softmax的帖子

1.3.1Softmax层体现和作用?

在做分类预测的时候,经常会选择在神经网络的最后一层的输出结果上,加一个softmax层,来对输出结果进行分类。
如下图示在output layer后多出来的一个黑色的layer,就是用于分类的softmax层。最后紫色的new output层就是经过softmax层后,转换成概率的新输出层。
在这里插入图片描述从这个图上可以看出来,softmax层只是对神经网络的输出结果进行了一次换算,将输出结果用概率的形式表现出来,而且它还起到了突出“最大值”的作用。

2 Softmax层的实现:

softmax层对L2层传来的数值进行一个换算,换算公式如下:

在这里插入图片描述如下图我们最终会得到(3,1,-3)对一的概率是(0.88,0.12,0)且后者和为1:
在这里插入图片描述

1.4 激活函数(Relu)

1.4.1 为什么不用tanh和Sigmoid(梯度消失的直观解释)

在这里插入图片描述在这里插入图片描述

所以所谓的梯度消失和梯度爆炸就是:因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
而对于更普遍的梯度消失问题,都是考虑用ReLU激活函数取代sigmoid激活函数。

1.4.2 Relu激活函数

之前已经介绍过了Relu函数和其导数如下
在这里插入图片描述

在这里插入图片描述

1.4.3 采用ReLU激活函数后

在这里插入图片描述这也避免了调整各层权重时的“梯度消失”的问题。

1.5 学习步长

学习步长的设置是个难题:若学习步长过大,则目标函数可能不降低;但若学习步长过小,则训练过程可能非常缓慢。

解决方法:训练几轮后就按一些因素调整学习步长。

介绍一种修改方法:
在这里插入图片描述根据学习轮次t来对学习步长进行调整

1.6 关于SGD(随机梯度下降算法)的问题讨论(Deep Learning 最优化方法)

(1)learning rate不易确定,如果选择的太小,收敛速度会很慢;如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
(2)每个参数的 learning rate 都是相同的,如果数据是稀疏的,则希望对出现频率低的特征进行大一点的更新。
(3)深层神经网络之所以比较难训练,并不是因为容易进入局部最小,而是因为学习过程容易陷入到马鞍面中,在这种区域中,所有方向的梯度值都几乎是 0。

1.6.1 momentum(动量梯度下降法)

针对极小值处不停地震荡甚至偏离的问题引入动量的概念:

在这里插入图片描述区别: SGD每次都会在当前位置上沿着负梯度方向更新(下降,沿着正梯度则为上升),并不考虑之前的方向梯度大小等等。而动量(moment)为了表示动量,引入了一个新的变量v。v是之前的梯度的累加,但每回合都有一定的衰减。

一个直观的解释动量梯度下降方法是:若当前的梯度方向与累积的历史梯度方向一致,则当前的梯度会被加强,从而这一步下降的幅度更大。若当前的梯度方向与累积的梯度方向不一致,则会减弱当前下降的梯度幅度。即前后梯度方向一致时,能够加速学习;前后梯度方向不一致时,能够抑制震荡。

实现方法:
在这里插入图片描述

1.6.2 Nesterov momentum(牛顿动量)

Nesterov Momentum是对Momentum的改进,可以理解为nesterov动量在标准动量方法中添加了一个校正因子。用一张图来形象的对比下momentum和nesterov momentum的区别:

在这里插入图片描述实现方法:
在这里插入图片描述这个算法的运行速度比momentum要慢两倍,因此在实际实现过程中几乎没人直接用这个算法,而都是采用了变形版本。

1.6.3Adagrad(Adaptive Gradient)

通常,我们在每一次更新参数时,对于所有的参数使用相同的学习率。而AdaGrad算法的思想是:每一次更新参数时(一次迭代),不同的参数使用不同的学习率。AdaGrad 的公式为:
在这里插入图片描述梯度越小,则学习步长越大,反之亦然。通俗的解释是:在缓坡上,可以大步地往下跑;而且陡坡上,只能小步地往下挪。
优点:对于梯度较大的参数, r相对较大,则θ​较小,意味着学习率会变得较小。而对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于徘徊不前。
缺点:由于是累积梯度的平方,到后面 r累积的比较大,会导致梯度 趋向于0,导致梯度消失。

1.6.4 RMSprop

RMSprop是一种改进的Adagrad,通过引入一个衰减系数,让r每回合都衰减一定比例,从而使得梯度不会一直累加。这种方法很好的解决了Adagrad过早结束的问题,适合处理非平稳目标,对于RNN效果很好。
在这里插入图片描述

1.6.5 Adam( adaptive moment estimation,自适应矩估计)

Adam本质上是带有动量项的RMSprop,它利用梯度的一阶矩(momentum)估计和二阶矩(Adagrad,RMSprop)估计动态调整每个参数的学习率。
在这里插入图片描述一个有关动量,rmsprop,adam的帖子,内容很完整

1.6.6 各种梯度下降算法的比较

在这里插入图片描述如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。通常,Adam 是最好的选择。
很多论文里都会用 SGD,没有 momentum 等。SGD 虽然也能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。SGD相对稳定——据说老司机都是开手动挡的。

关于算法

(1)首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑 SGD+Nesterov Momentum或者Adam.

(2)选择熟悉的算法——这样可以更加熟练地利用经验进行调参。

(3)充分了解数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。

(4)根据需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。

(5) 先用小数据集进行实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。因此可以先用一个具有代表性的小数据集进行实验。

(6)考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。

(7) 数据集一定要充分的打散(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。

(8)训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练;对验证数据的监控是为了避免出现过拟合。

(9)制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控。

总结几节课出现的代码

Grabcut的opencv实现

几个关键函数的解读:
(1)

grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)

img: 输入图像,必须是8位3通道图像,在处理过程中不会被修改

mask: 掩码图像,用来确定哪些区域是背景,前景,可能是背景,可能是前景等。GCD_BGD (=0), 背景; GCD_FGD (=1),前景;GCD_PR_BGD (=2),可能是背景;GCD_PR_FGD(=3),可能是前景。

rect: 包含前景的矩形,格式为(x, y, w, h)

bdgModel,fgdModel: 算法内部使用的数组,只需要创建两个大小为(1,65),数据类型为np.float64的数组

iterCount: 算法迭代的次数

mode: 用来指示grabCut函数进行什么操作:
cv.GC_INIT_WITH_RECT (=0),用矩形窗初始化GrabCut;
cv.GC_INIT_WITH_MASK (=1),用掩码图像初始化GrabCut。

(2)在图像上绘制矩形和圆形区域区域

cv.rectangle(img, (ix, iy), (x, y), BLUE, 2)
cv.circle(img, (x, y), thickness, value['color'], -1)

(3)创建鼠标响应事件
窗体对象是’input‘,响应函数是onmouse

 cv.setMouseCallback('input', onmouse) # 创建鼠标响应事件

实现源码:

import numpy as np
import cv2 as cv

BLUE = [255, 0, 0]  # rectangle color
RED = [0, 0, 255]  # PR BG
GREEN = [0, 255, 0]  # PR FG
BLACK = [0, 0, 0]  # sure BG
WHITE = [255, 255, 255]  # sure FG

DRAW_BG = {
   'color': BLACK, 'val': 0}
DRAW_FG = {
   'color': WHITE, 'val': 1}
DRAW_PR_FG = {
   'color': GREEN, 'val': 3}
DRAW_PR_BG = {
   'color': RED, 'val': 2}

# setting up flags
rect = (0, 0, 1, 1)
drawing = False  # flag for drawing curves
rectangle = False  # flag for drawing rect
rect_over = False  # flag to check if rect drawn
rect_or_mask = 100  # flag for selecting rect or mask mode
value = DRAW_FG  # drawing initialized to FG
thickness = 3  # brush thickness


def onmouse(event, x, y, flags, param):
    global img, img2, drawing, value, mask, rectangle, rect, rect_or_mask, ix, iy, rect_over

    # 以下为绘制矩形的整个阶段:鼠标右键按下,鼠标移动,鼠标右键松开
    if event == cv.EVENT_RBUTTONDOWN:
        rectangle = True
        ix, iy = x, y

    elif event == cv.EVENT_MOUSEMOVE:
        if rectangle is True:
            img = img2.copy()
            cv.rectangle(img, (ix, iy), (x, y), BLUE, 2)
            rect = (min(ix, x), min(iy, y), abs(ix - x), abs(iy - y))
            rect_or_mask = 0

    elif event == cv.EVENT_RBUTTONUP:
        rectangle = False
        rect_over = True
        cv.rectangle(img, (ix, iy), (x, y), BLUE, 2)
        rect = (min(ix, x), min(iy, y), abs(ix - x), abs(iy - y))
        rect_or_mask = 0
        print(" 如确定当前图无需再改按下'n'  \n")

    # 绘制细节

    if event == cv.EVENT_LBUTTONDOWN:
        if rect_over is False:
            print("矩形区域还没有绘制!! \n"
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深度学习基础教程 PDF 是一本介绍深度学习基础知识和应用的教程资料。该教程以简明易懂的方式系统地介绍了深度学习的原理、算法和常用工具,是学习深度学习的入门指南。 这本教程首先从深度学习的基本概念开始讲解,包括神经网络结构、激活函数、前向传播和反向传播算法等。然后,教程详细介绍了深度学习中常用的模型,如卷积神经网络、循环神经网络和生成对抗网络,并对它们的结构和应用进行了深入解析。 在教程中,还介绍了一些深度学习的常用工具和框架,如TensorFlow和PyTorch。这些工具和框架提供了丰富的函数库和示例代码,方便读者理解和实践深度学习的内容。 教程的每一章都包含了理论知识的详细解释和丰富的实例代码,读者可以通过阅读教程和运行代码来加深对深度学习的理解。此外,教程还提供了一些练习题和实战项目,读者可以通过完成这些任务来检验和巩固所学的知识。 总的来说,深度学习基础教程PDF 提供了一个全面且易于理解的深度学习学习资源。无论是初学者还是已经有一定基础的人,通过阅读这本教程,都能够系统地学习和掌握深度学习的基本概念、原理和应用。 ### 回答2: 深度学习基础教程是一本关于深度学习的入门教材。这本教程为读者提供了深度学习的基本概念、算法和应用案例等方面的知识。教程的作者将复杂的理论和算法内容以简洁明了的方式进行了阐述,并提供了大量的示例代码和实战项目,有助于读者更好地理解和掌握深度学习基础知识。 这本教程的主要内容包括神经网络的基本原理、反向传播算法、卷积神经网络、循环神经网络、深度学习常用框架等。通过学习这些内容,读者可以了解深度学习的基本概念和算法,并能够使用常见的深度学习框架进行实际的应用开发。 该教程的特点之一是提供了大量的示例代码和实战项目。通过参考这些实例代码,读者可以学习如何使用Python等编程语言实现深度学习模型,并对深度学习算法的具体应用有更深入的理解。此外,实战项目的设计也能帮助读者将学到的知识应用到实际问题中,提高解决实际问题的能力。 总之,深度学习基础教程是一本实用性很强的深度学习教材,适合对深度学习感兴趣的初学者阅读。通过学习这本教程,读者可以系统地掌握深度学习的基本原理和算法,并且能够使用常见的深度学习框架进行实际开发。 ### 回答3: 深度学习基础教程 PDF 是一本关于深度学习入门的电子书籍。深度学习是一种机器学习方法,通过建立多层神经网络来模拟人类大脑的工作原理,并用于解决各种复杂的问题。 这本教程以简明易懂的方式介绍了深度学习的基本原理和常用的技术。它涵盖了深度学习基础知识,包括神经网络的构建、激活函数的选择、损失函数的定义等。同时,该教程还介绍了一些经典的深度学习模型,如卷积神经网络(CNN)和循环神经网络(RNN),以及它们在图像识别、自然语言处理等领域的应用。 通过学习这本教程,读者可以了解深度学习的基本概念和原理,并学会使用常见的深度学习工具和框架,如TensorFlow和PyTorch。此外,这本教程还提供了大量的实例和练习,帮助读者巩固所学知识,并通过实践掌握深度学习的应用技巧。 总而言之,深度学习基础教程 PDF 是一本详尽的入门资料,适合初学者快速了解和入门深度学习。无论是对于学术界的研究者,还是对于工业界的从业者,这本教程都提供了很好的学习资源,有助于开展相关的研究和应用工作。希望有兴趣的读者能够通过学习这本教程,掌握深度学习的基本原理和实践技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值