《动手学习深度学习》李沫

开篇

2017年

轮子是工具,主要是理解算法。

使用MXNet和Gluon来教学

Pytorch (派托吃)

GLuon(交子)

部署环境Win Liunx有问题时,可以考虑Docker

格式ndarray相关

ndarray 和 numpy的转化

新生成还是旧的

使用autograd来自动求导

5年前还是matlab来做

python的方法 backward() record()

  • MXNet提供autograd模块来自动化求导过程。
  • MXNet的autograd模块可以对一般的命令式程序进行求导。
  • MXNet的运行模式包括训练模式和预测模式。我们可以通过autograd.is_training()来判断运行模式

线性回归

y y

线性回归是最简单的单层神经网络

机器学习W数组和b

损失函数

使用常见的平方误差来衡量预测目标和真实目标之间的差距

优化

线性回归一般没有显解。所以我们需要随机梯度下降(SDG来求解。

给数据 + 定义模型 +

Jupyter 加问号 “?” : 可以查找到变量、函数详细信息。

第二课 过拟合和正则化 多层感知机 安装使用GPU 卷积神经网络

过拟合和正则化——权衡数据和模型

卷积神经网络耗计算量,需要核武器——GPU

CUDA 库达:意思是“守护”

激活函数

W1 W2 两个隐藏层之间,最好是非线性变化。

RelU(儒鲁) 和 Softmax两个函数。优点只有一个:计算简单,避免梯度消失。

过拟合、欠拟合

简单OR复杂?模型视数据量而定。Batch size等。

当模型过于复杂,使用阀门regression来进行正则化。(L2范数 L2 norm)

Scratch UI可视化编程。

实战Kaggle比赛--使用Gluon预测房价和K折交叉验证K floa

  • 处理离散数据
  • 定义模型
  • 训练 验证

*(有代码)Kaggle是一个平台。

安装使用GPU

  • 快慢三四倍
  • 刷竞赛(五个月内一万参数/五万参数)
  • 工业界是 数据 + 计算力

mxnet-cu80 的GPU版本。mxnet有个context的概念,选择cpu GPU。

"炼丹"

CPU到GPU GPU到CPU ,两种相互拷贝。

多GPU做异步,并行内容。

卷积神经网络--0开始Convolution

  • 2D-》1D的pixel的问题
  • 内存问题

* 卷积的权重叫kernel或者filter

*四周边缘1像素需要填充padding

*分离RGB像素,单独3次矩阵的卷积

池化层 : 小窗口减少位置敏感。区间空间的最大值、最小值。

示例:1989年MNIST常用LeNet,两个卷积、两个全连接。

Convolution -> Relu -> Pooling -> Flattern

提前五年弄懂,目前财务自由。

目前100多层,还有各种结构。

nn.Sequential()

nn.Conv2D( channel=20 ,kernel_size=5 ,activation = 'relu')

nn.MaxPool2D(pool_size=2 ,strides=2)

nn.Conv2D( channel=50 ,kernel_size=3,activation = 'relu')

nn.MaxPool2D(pool_size=2 ,strides=2)

nn.Flatten()

nn.Dense(128,activation="relu")

nn.Dense(10)

第三章  卷积神经网络、如何使用Gluon、如何购买核武器

GPU

目前Nvida比较好,AMD、Intel支持不好。Titan显卡。

1.CUDA对深度学习好,对32位浮点运算。

2.内存大小

3.内存带宽

*PyTorch模型不需初始化,xmnet需要初始化?  参与。

nn.Block到底是什么?

整个神经网络可以是一个block,也可以是单层。可以无限的嵌套。

nn.Sequentional是其子类。

时不时备份。线被老鼠啃,GPU会烧,电源会断,硬盘会坏。

查看源代码:

from mxnet.gluon import nn

nn.Dense??

深度卷积神经网络: Dropout Alexnet VGG Transformer(ViT VAE)

Dropout

dropout是新的正则化方法

  • dropout 一个概率probability 0.15
  • 随机的0,和非零
  • scale缩放后,保证期望还是dropout之前的期望值

dropout随机的激活一些层,保证模型都有运行的概率,模型复杂度减小。

dropout是一个阀,避免模型过拟合的一个方法。另一个是L2 norm

通常dropout发生在全连接的后面:

*一般卷积的参数少,不需要dropout。老的深度神经网络,dropout是神奇的东西。

drop_prob1 : 0.2

drop_prob2 : 0.5

为何靠近后面的dropout小?

AlexNet

2012年,开山之作。对比1995年LeNet的加强版。

一种说法:模型特别优美。另外人的一种说法:其实NLP、视觉,模型一样,就是数据集、feature。

底层feature:角度、颜色    高层feature:自己来图片中学

缺失要素1:数据集  2009年李飞飞贡献ImageNet数据库,包含1000类,每类1000张图片。带来刷榜的热潮。Image credit L Ferhat Kurt。这个数据集同时推动计算机视觉和机器学习,之前的学习方式不再合适。

缺失要素2:硬件  对比1980年的模型

#第─阶段

net.add ( nn.Conv2D(

channels=96, kernel_size=11,strides=4, activation='relu '))net.add( nn.MaxPool2D(pool_size=3, strides=2 ) )

#第二阶段

net.add ( nn.conv2D(

channels=256,kernel_size=5,padding=2,activation='relu ' ))net.add( nn.MaxPoo12D(pool_size=3, strides=2 ) )

#第三阶段

net.add ( nn.conv2D(

channels=384, kernel_size=3, padding=1,activation='relu '))net.add ( nn.conv2D(

channels=384, kernel_size=3,padding=1,activation='relu'))net.add ( nn. conv2D(

channels=256, kernel_size=3, padding=1,activation='relu ') )net.add( nn.MaxPool2D(pool_size=3, strides=2 ) )

#第四阶段

net.add ( nn .Flatten( ))

net.add ( nn. Dense(4096,activat1on= reu

net.add ( nn . Dropout ( .5 ))  //数据过大,避免过拟合加dropout

#第五阶段

net.add ( nn. Dense ( 4096, activation="relu" ))

net.add ( nn . Dropout(. 5 ) )

#第六阶段

not .add ( nn  Dense(1000))

从LeNet到AleNet,虽然学术界花了20年,但是实现起来也就多了几行。

VGG

使用重复元素非常非常深的网络(虽然现在看名字过于霸气)

VGG纯用3X3的Conv。

AleNet很难推到10层100层。VGG说想做很深,每层需要尽量重复结构。VGG的关键是很多相对小的kernel(3X3)

def vgg_block(num_convs, num_channels):

    blk = nn.Sequential()

    for _ in range(num_convs):

        blk.add(nn.Conv2D(num_channels, kernel_size=3,

                          padding=1, activation='relu'))

    blk.add(nn.MaxPool2D(pool_size=2, strides=2))

    return blk

循环处理num次。

“历史由成功者书写的”

第四章 BatchNorm 更深的卷积神经网络 NiN GoogleNet ResNet DenseNet  Hybridize:更快更好移植 新的Kaggle练习:CIFAR10分类

BatchNorm (批量归一化)

2014年提出,对很深的神经网络训练,对数据做均值为0,方差为1。

更深的卷积神经网络 NiN GoogleNet ResNet DenseNet

NiN

  • Dense Conv 顺序换下,更改计算量
  • 小网络1x1Conv,代替全连接的功能。全部用卷积计算。

这种“一卷到底”最后加一个平均池化层的做法,成为神经卷积网络的常用设计。

这种思想影响了后续的模型。

GoogleNet

2014年ImageNet竞赛中,Google研究人员取得很大进步。

蓝色的全部是卷积层。

定义Inception

仍然使用1X1的卷积,其中四个并行的块。最后在Concate汇集。

# c1 - c4为每条线路里的层的输出通道数

    def __init__(self, c1, c2, c3, c4, **kwargs):

        super(Inception, self).__init__(**kwargs)

        # 线路1,单1 x 1卷积层

        self.p1_1 = nn.Conv2D(c1, kernel_size=1, activation='relu')

        # 线路2,1 x 1卷积层后接3 x 3卷积层

        self.p2_1 = nn.Conv2D(c2[0], kernel_size=1, activation='relu')

        self.p2_2 = nn.Conv2D(c2[1], kernel_size=3, padding=1,

                              activation='relu')

        # 线路3,1 x 1卷积层后接5 x 5卷积层

        self.p3_1 = nn.Conv2D(c3[0], kernel_size=1, activation='relu')

        self.p3_2 = nn.Conv2D(c3[1], kernel_size=5, padding=2,

                              activation='relu')

        # 线路4,3 x 3最大池化层后接1 x 1卷积层

        self.p4_1 = nn.MaxPool2D(pool_size=3, strides=1, padding=1)

        self.p4_2 = nn.Conv2D(c4, kernel_size=1, activation='relu')

  def forward(self, x):

        p1 = self.p1_1(x)

        p2 = self.p2_2(self.p2_1(x))

        p3 = self.p3_2(self.p3_1(x))

        p4 = self.p4_2(self.p4_1(x))

        return nd.concat(p1, p2, p3, p4, dim=1)  # 在通道维上连结输出

ResNet 深度残差网络

  • 层数多是,直接跳连(jump)
  • 避免深层的串联,jump走高速通道

超过100个卷积。太深了。

谷歌研究员试出来的。大家实践中发现,层多有梯度消失的情况,但是卷积变宽不如变深(计算量)。

Residual残差 ResNet采用VGG3X3卷积,在卷积和池化之间Batch Norm(批处理归一化)。

Transition Block 过度快 : 通过1X1的卷积,同时将宽高减半。

DenseNet

主体是交替串联和过度块。使用全局的growth_rate使得配置更加简单。过度层每次都通道减半。

示例是121层的DesnseNet。

*DenseNet对比ResNet,更多ResidualBlock。但是减少计算量,增加多个TransitionBlock,宽高减半。

新的Kaggle练习:CIFAR10分类

Image Augmentation 图像增强

AlxNet成功的原因之一,是对图片变换,生成新的图片。现在深度卷积神经网络训练中,图片增强必不可少。

  • 图片变形
  • 颜色随机变换
  • 上述两者结合

水平方向翻转 Horizontal Flip : 一种常用变形

随机裁剪 Random Crop :

颜色变化 Brightness Jitter:

第五章 Gluon高级和优化算法基础

Hybridize:更快更好移植

  • 程序性能更好了
  • 结构体json,便于Java C移植

目前为止我们所有的Python编程,都是“命令式”编程。还有符号式编程。

def get_net():

    net = nn.HybridSequential()  # 这里创建HybridSequential实例

    net.add(nn.Dense(256, activation='relu'),

            nn.Dense(128, activation='relu'),

            nn.Dense(2))

    net.initialize()

    return net

net.hybridize() //进行符号式编程

使用HybridBlock类型构造模型

class HybridNet(nn.HybridBlock):

    def __init__(self, **kwargs):

        super(HybridNet, self).__init__(**kwargs)

        self.hidden = nn.Dense(10)

        self.output = nn.Dense(2)

    def hybrid_forward(self, F, x):

        print('F: ', F)

        print('x: ', x)

        x = F.relu(self.hidden(x))

        print('hidden: ', x)

        return self.output(x)

延迟执行 lazy evalution*

  • 空间换时间

自动合并Auto Parallelism

  • 系统自动做分支并行运算
  • 计算和通讯的并行

GPU并行计算  Multiple Gpus Scratch

8块TitanX

TensorflowRT

GPU之间同步数据

def get_params(params, ctx):

    new_params = [p.copyto(ctx) for p in params]

    for p in new_params:

        p.attach_grad()

    return new_params

调参时,希望有一些系统的指导,当观察到现象有系统的调参。

调参主要是优化算法的底层意义。

优化算法 Optimization Intro :

上文已有:

  • 随机梯度
  • 随机梯度加动量

在机器学习中,我们是损失函数,来优化我们的线性回归模型的w b。

图像分类、数值预测的回归问题。

优化算法和机器学习的最大区别?

机器学习,我们希望数据泛化目的,用已知数据去确认未知情况;

优化,对定义好的损失函数、目标函数,不断去优化它。主要是在训练集优化。

*任何最大化问题,都可以转化成最小化问题。

示例1:epoch3

loss值下降到一个稳定值

示例2:有局部最小值的问题

示例3:数据存在鞍点的问题,可能梯度消失

一阶线性回归的数学原理:

Taylor展开式,预测二阶以内的误差。

学习率Δ过大时,做机器学习的前提已经不成立。

问题:步长过大,步长过小。优化算法会失效。

所以需要更改步长lr = 0.2 lr =10,小批量进行手动反复测试。

第六章  优化算法高级和计算机视觉

Fine-tuning 通过微调来迁移学习

当数据很大时,一百万的图片,但是训练很慢。ImageNet是有1000个标注。这些都不是做应用想要的case。我们想识别产品,识别人脸。

在一个比较大的数据集上训练好一个模型,希望用小的数据来适配模型。

pretrained_net = model_zoo.vision.resnet18_v2(pretrained=True)

Feature是ImageNet上的训练得到,Trainer实例中的学习率会低一点。

finetune_net = model_zoo.vision.resnet18_v2(classes=2)

finetune_net.features = pretrained_net.features

finetune_net.output.initialize(init.Xavier())

Adagrad 自迭代梯度下降

第七章  物体检测1

之前章节是图片分类,现在章节是物体检测。

2014年后火起来的。

R-CNN 区域卷积神经网络 开山之作

  • Selective Search
  • ROI Pooling池化层

ROI是分成3X3或者5X5的数据。

为什么用SVMs,而不同Soft-max? 可以的,Fast R-CNN可以使用。

Faster R-CNN :

 Soft-Max和Selective Search(难懂的启发式规则、黑盒)

Region Proposal Network  锚框

 锚框,修改长宽比例。要做BoneBox Regression,再做Softmax的二分类,得到感兴趣物体。

SSD Single Shot Mulitibox 单发多框检测器:

主要对BoneBox嵌套使用锚框。根据 w h 有规则。

*Python一秒几百张图片已经很厉害了。

第八章 物体检测2

讲解SSD的锚框的代码。

IoU 交集除并集

两个集合的相似程度

损失函数

IoU的程度

第九章 物体检测3

稍微SSD(单发单框物体检测)的收尾

*object detection

结论

目标检测比分类要困难的多,因为不仅要预测物体类别,还要找位置。

YOLO You Only Look Once)的算法

因为R-CNN和SSD,都生成大量锚框。所以存在大量重叠的锚框。

因为只看一边,最后一层是全连接(SSD都是卷积),所以细节上可能不好。

YOLO v2 进入CVPR得final。

  • 输入增大13X13
  • 对真实锚框进行聚类
  • 和SSD一样使用卷积

深度神经网络基于卷积得物体检测算法的思想:

第十章  语音分割 FCN

VOC12的一个语义分割竞赛,比ImageNet更火。

Conv2DTranspose : 反卷积,扩展图片

第十一章  样式迁移

Neural Style

第十二章  循环神经网络

NIPS 机器学习两大盛会,2017年八千人。

循环神经网络 RNN

  • 前面看到的都是前馈神经网络MLP。有时时间等维度(序列),比较敏感。需要一个新的隐藏层
  • 购物记录(时间戳)
  • 语言输入法预测

*马尔可夫链,隐马尔可夫链

第十三章 正向传播 反向传播 时间反向传播 (数学推理)

*梯度消减、梯度爆炸

正向传播

多层感知状态机

梯度模型

反向传播

时间反向传播

*计算循环神经网络的方法

第十四章  实现、训练、应用 循环神经网络

购物和用户画像,本质上是词向量的预测。

rnn-scratch的代码

对“词句”进行训练,预测下一个字符。

第十五章  门控循环单元(GRU  长短期记忆神经网络(LSTM 多层循环神经网络

门控循环单元(GRU

Gated recurrent neural networks 2014

用来解决梯度衰减(或梯度爆炸)

gru-scratch

长短期记忆神经网络(LSTM

上个世纪

输入门 遗忘门

lstm-scratch

多层循环神经网络

rnn-scratch

第十六章  词向量(word2vec

2018年1月讲解。

自然语言的复杂系统。不适用one-hot。

word2vec是工具。

中心词 采样词

第十七章  使用预训练的词向量 GloVefastText (更新的词向量)

*

第十八章 seq2seq (编码器和解码器)  注意力机制

seq2seq (编码器和解码器)

编码输入序列,解码输出序列。

注意力机制

第十九章 Transformer机器  机器翻译

NMT代码

调参侠,掉包怪

阿萨

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值