避免过拟合
避免过拟合
欠拟合和过拟合
欠拟合是指在训练集和测试集(或验证集)上模型效果都不好,一般由于模型能力不足导致;过拟合是指模型在训练集上表现好,而在测试集上表现不好,一般由于模型过度拟合了训练集中的噪声导致。本文主要讨论解决过拟合问题的方法。
L2 正则化
无论机器学习还是深度学习,L2 正则化项都用于限制参数 W
过大,它被累加在代价函数之中。
代价函数J除了计算每个实例的误差L,还加入网络中每层参数W的 2
范数的平方,并用λ作为参数,当λ较大时,就需要W接近0,才能得到较小的代价函数,这样一些无关紧要的参数就变成了0,从而减少了模型的复杂度,以及压缩后模型的规模。另外,较小的W也使层之间传递的数据变小,这样在使用
sigmoid 和 tanh
激活函数时,数据刚好集中在中间类似线性变换的一段,使非线性变换的结果类似线性变换。由于多个线性组合叠加相当于单个线性层,因此也倾向于简化模型。
如果使用 L1 正则化,参数矩阵将变得稀疏,根据经验,一般 L2
效果更好。L2
正则化方法可用于简化决策,但不适用于需要复杂决策的问题。使用该方法时,需要尝试多个λ值。
Dropout 方法
Dr ...
初始化网络参数
初始化网络参数
#深度学习
为什么要给网络参数赋初值
既然网络参数通过训练得到,那么其初值是否重要?设置初值不佳是否只影响收敛速度而不影响模型结果?网络参数是否可以设置为全
0 或者全 1?
假设网络的参数W初值都是0,如下图所示,无论输入任何X,第一层的输出A将都为0,再向前传递到
y 也是 0,使用误差函数调参时,每一层的梯度只与该层的输入和输出有关,由于
a1,a2
值相等,计算出的梯度调整的值,以及调整后的梯度也相等;第二次迭代也同理,由于
a1,a2 相等,w[2]中各单元的值也相等。因此该层有 100 个单元与 1
个单元没有差异,该问题被称为“对称性”问题。
试想将 w 设置成全 1,则有 a1=x1+x2,a2=x1+x2,a1 与 a2
值仍然相同,对称性问题依然存在。由此,一般将参数设置为随机值。
设置成随机值还不够,还需要设置成较小的随机值,试想如果 w 的均值在 0.5
附近,某一层的输入输出都为 500
个元素,那么经过该层乘和加的运算,输出约是输入值的 250
倍;如果存在多层,250x250x…,很快就爆炸了。如果在层后使用 Sigmoid
函数,将值映 ...
激活函数
激活函数
为什么使用激活函数
如果没有激活函数,神经网络就变成了线性模型,输出是输入的线性组合,使用一层与使用多层没有区别。如下式所示,输入为
x,经过线性层计算出 a1,将 a1 输入下个线性层得到
a2,展开后可以看出,最终得到的仍然是 wx+b
的线性组合,只是参数值不同。
图片.png
另外,线性层无法解决非线性问题,如在预测房价问题中,如果不使用激活函数,则房价可能计算成负值,这也与实际不符。理论上,加了激活函数后,模型可以逼近任意函数。
激活函数又分线性激活函数和非线性激活函数,一般使用的都是非线性激活函数,线性激活函数与线性层类似,只在输出层偶尔使用,不在此展开讨论。
何时使用激活函数
激活函数一般放置在线性变换之后,在线性变换和激活函数之间,常常插入归一化层,用于解决饱和的非线性激活函数问题(下面
Sigmoid 函数部分详细说明)。
如何选择激活函数
从一些当前流行的深度学习网络代码中,可以看到,当前使用的激活函数绝大部分是
ReLU;在一些特殊情况下,也使用 Sigmoid,比如二分类问题的最后一层使用
Sigmoid 将输出转换到 0-1 之间;又如使用注意 ...
浅析梯度迭代算法
浅析梯度迭代算法
梯度迭代类算法已成为目前各种领域的主流算法。各种现实中的问题分解抽象成机器可以处理的形式之后,基本都可归类为图像、自然语言处理、决策、时序、强化学习这几种类型,而当今解决这些问题的顶尖算法中,梯度迭代(梯度上升或梯度下降)都占据主流地位,比如决策类问题的比赛中,梯度下降决策树
GBDT
类算法是完全的主流,使用深度学习网络处理图片自然语言问题更毋庸置疑。
那么,梯度迭代算法究竟是什么?简单地说,就是代入数据,预测结果,如果结果偏大就调小参数,结果偏小就调大参数。举一个简单的例子,分为三个小问题:
问题一
假设父亲的智商影响儿子的智商,设父亲的智商为x,儿子的智商为y,y=wx,训练一个参数
w 学习二者之间的关系。目前有多个父子智商数据对,其中第一个数据:父亲智商
x=100,儿子智商 w=110,将 w 初值设为 w=1.0;学习率设为
0.00001,计算平均误差。
如下程序用于学习 w。
123456789101112131415161718192021import torch import matplotlib.pyplot as plt %matplo ...
Pytorch常用函数之一_数据类型
Pytorch 常用函数之一 _
数据类型
#Pytorch
编程语言和自然语言一样,不理解的词越多,对全文的理解就越差。掌握必要的基础知识,让后期看代码更加流畅。
机器学习需要掌握数据处理工具
Pandas、Numpy,同理,深度学习也需要掌握相应的工具,在 Pytorch
中数据存储在 Tensor
之中,本篇将介绍它们的基本用法以及与之相关的常用函数。
查看版本信息
包含头文件
11. import torch
1.查看 torch 版本
11. print(torch.__version__)
2.查看 CUDA 版本
11. print(torch.version.cuda)
GPU 相关操作
1. 查看当前是否支持 GPU
11. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2.GPU 相关的数据转换
123451. a = torch.Tensor([5]) 2. b = a.to('cuda') # ...
TorchVision
TorchVision
#Pytorch #图形图像
说明
很多基于 Pytorch 的工具集都非常好用,比如处理自然语言的
torchtext,处理音频的 torchaudio,以及处理图像视频的 torchvision。
torchvision 包含一些常用的数据集、模型、转换函数等等。当前版本 0.5.0
包括图片分类、语义切分、目标识别、实例分割、关键点检测、视频分类等工具,如
mask-rcnn 功能也都包含在内了。mask-rcnn 的 pytorch 版本最高支持
torchvision 0.2.*,0.3.0 之后就将 mask-rcnn 包含到 tensorvision
之中了。
安装
torchvision 安装非常方便。$ pip install torchvision
但需要注意版本匹配:
1234torch 1.1.0/1.1.0 + vision 0.2.* + CUDA 9torch 1.2.0/1.3.0 + vision 0.3.* + CUDA 10torch 1.2.0/1.3.0 + vision 0.4.* + CUDA 10torch 1.4 ...
搭建深度学习的docker环境
搭建深度学习的 docker 环境
介绍
深度学习一般依赖比较复杂的环境,每个项目需要的底层库各有不同,有时在
github
中下载的代码只能运行在版本较低的的工具链之上。想在一台机器上建立适合所有项目的环境非常困难,大多数情况下使用
docker 维护不同项目针对的不同环境。
CUDA 是 NVIDIA 推出的运算平台,一般通过它调用 GPU,CUDA 的主要版本有
7.x, 8.x,9.x,10.x,目前最常用的是 9 和
10,它们对接的上层软件版本也各不相同。如:
1234torch 1.1.0/1.1.0 + torchvision 0.2.* + CUDA 9torch 1.2.0/1.3.0 + torchvision 0.3.* + CUDA 10torch 1.2.0/1.3.0 + torchvision 0.4.* + CUDA 10torch 1.4.0 + torchvision 0.5.* + CUDA 10
除了 CUDA
基础库以外,还需安装相关工具包。可以在同一个操作系统中安装多个 CUDA
版本,使用时切换即可。
在 Docker 中使用 GPU 除 ...
Pytorch提取不同层次图片的特征
Pytorch
提取不同层次图片的特征
#图形图像 #Pytorch
下例使用 torchvision 库提取了 resnet 最后一层的卷积特征;resnet 各
block 的卷积特性,以及金字塔特性。
具体取哪一层特征视使用场景而定,resnet 各 block
的输出包含更丰富的特征;从 resnet 最后一层提取的特征更为抽象;fpn
每层通道数相等,含义也类似,可以在多层之间比较。
123456789101112131415161718192021222324252627import osimport torchvision.models.detection.backbone_utils as backbone_utilsimport torchvisionimport torch.nn as nndevice = 'cuda'os.environ["TORCH_HOME"] = '/notebooks/data/mine/live/code_v7/model/'USE_FPN = Trueif USE_FPN: ...
Pytorch避免更新模型梯度
Pytorch 避免更新模型梯度
#Pytorch
1. torch.no_grad
(1) 用法
12with torch.no_grad(): 具体操作
(2) 说明
上例的“具体操作”中均不更新梯度,这样可以节约计算时间和内存。一般用于验证或者测试阶段。
2. param.requires_grad
(1) 用法
1p.requires_grad=False
(2) 说明
一般用于将某一层设置为不自动更新梯度,以避免训练模型时对该层调参。
3. model.eval
(1) 用法
12model.eval()具体操作
(2) 说明
模型支持 train 模式和 eval 模式,在使用模型之前调用
model.eval(),进入 eval 评估模型,它将改变 forward,如禁止
dropout,并用统计数据做 batch norm。因此,有时 train 模式和 eval
模式模型计算的结果不同。
怎么看目标检测的效果
怎么看目标检测的效果
怎么看目标检测的效果
Recall&Precision 引用一个知乎上的例子:某池塘有 1400
条鲤鱼,300 只虾,300 只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了 700
条鲤鱼,200 只虾,100 只鳖。那么,这些指标分别如下:正确率 Precision =
700 / (700 + 200 + 100) = 70% 召回率 Recall = 700 / 1400 = 50%
(出处:https://www.zhihu.com/question/19645541/answer/39732647)
IoU:预测区域和目标区域重合比例,即交集除并集
IoU=0.50: 重合比例大于 0.5 的算正例。
IoU=0.75: 重合比例大于 0.75 的算正例。
IoU=0.50:0.95: 从 0.50 到 0.95 每隔 0.5
计算一次,然后取均值。
area:区域大小
small:x<32x32
medium:32x32<x<96x96
large:x>96x96
maxDets:最多取几个目标区域
其 ...