初始化网络参数
初始化网络参数
#深度学习
为什么要给网络参数赋初值
既然网络参数通过训练得到,那么其初值是否重要?设置初值不佳是否只影响收敛速度而不影响模型结果?网络参数是否可以设置为全
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') # ...
搭建深度学习的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 除 ...
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 ...
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:最多取几个目标区域
其 ...
调节学习率
调节学习率
在深度学习和其它一些循环迭代算法中,学习率都非常重要。在效率上,它几乎是与算力同等重要的因素;在效果上,它也决定着模型的准确率。如果设置太小,则收敛缓慢,也有可能收敛到局部最优解;设置太大又导致上下摆动,甚至无法收敛。
设定学习率
下面总结了设置学习率的一些方法:
理论上,如果将学习率调大 10 倍,现在 10 次训练就可以达成之前 100
次的训练效果。
一般使用工具默认的学习率,如果收敛太慢,比如训练了十几个小时,在训练集和验证集上仍在收敛,则可尝试将学习率加大几倍,不要一下调成太大。
如果误差波动过大,无法收敛,则可考虑减小学习率,以便微调模型。
在测试阶段建议使用较大的学习率,在短时间内测算过拟合位置,尤其好用。
在预训练模型的基础上 fine-tune
模型时,一般使用较小的学习率;反之,如果直接训练,则使用较大的学习率。
对于不同层可使用不同学习率,比如可对新添加的层使用较大的学习率,或者“冻住”某些层。
下图展示了不同学习率的误差变化曲线。
图片来自网络
手动调节学习率
Pytorch
提供在迭代过程中修改学习率的方法。最简单的方法是手动修改学习率的 ...