美文网首页数学和算法
UD机器学习 - C5 深度学习

UD机器学习 - C5 深度学习

作者: 左心Chris | 来源:发表于2019-08-28 16:02 被阅读0次

    1 神经网络

    sigmod函数和softmax函数
    最大似然概率和交叉熵和多类别交叉熵
    Logistic回归和梯度下降推导

    1.1 问题分类

    分类
    回归

    1.2 感知机算法


    输入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,学习速率为η)
    输出:w, b;感知机模型f(x)=sign(w·x+b)
    (1) 初始化w0,b0,权值可以初始化为0或一个很小的随机数
    (2) 在训练数据集中选取(x_i, y_i)
    (3) 如果yi(w xi+b)≤0
    w = w + ηy_ix_i
    b = b + ηy_i
    (4) 转至(2),直至训练集中没有误分类点
    原文链接:https://blog.csdn.net/Dream_angel_Z/article/details/48915561
    但是这个只能定义线性边界

    1.3 激活函数和sigmod函数

    1/(1+e^(-x))

    • one-hot encoding
      • 不能设为0,1,2,英文这样这些特征就会有相关关系
      • 所以要分开来,有的设为1, 没有的设为0

    1.4 最大似然法

    • 每个点为当前预测正确的概率乘积
    • 因为乘积很小,而且一个改变对整体改变影响比较大,所以把乘积变为求和

    1.5 交叉熵(逻辑回归用的损失函数)

    • use log function to change product into sum
    • 然后取相反数求和就是交叉熵(因为概率都是0-1,取log就会变为负数)
    • 交叉熵越小模型越好


    1.6 多类别交叉熵

    • 其实y和1-y只是类别的不同


    1.7 Logistic回归



    单分类和多分类:


    1.8 梯度下降和公式推导

    推导:



    https://blog.csdn.net/programmer_wei/article/details/52072939
    https://blog.csdn.net/programmer_wei/article/details/51941358

    2 深度神经网络

    神经网络结构
    前向反馈和反向传播
    优化方法(梯度消失等等)

    2.1 非线性数据和模型和神经网络结构

    通过累加和计算sigmod函数来计算
    每一个中间层都要用激活函数
    多分类如果多个网络再做softmax有点浪费;所以就在最后一层设置多个sigmod函数,算出不同类别的分数,然后用softmax函数求出每种类别的概率

    前向反馈和反向传播

    • 公式推导

    2.2 keras学习

    优化器 (Optimizer):rmsprop,adam,ada

    2.3 训练优化

    • 早期停止

      根据训练误差和测试误差找到最佳的点,适当的epoch次数,可以完成早期停止

    • 正则化
      L1正则适合稀疏特征,适合于特征选择(1,0,0,1) Lamda(|w1|+...)
      L2适合training models,Lamda
      (w1^2+...)
      如(1,0) (0.5,0.5),L2更倾向于右边

    • Dropout
      一定的概率某些节点不经过前向反馈和反向传播
      更新权重;dropout parameter is the probability that each node gets dropped at a particular epoch

    • 解决梯度消失:激活函数
      • tanh(x)


      • ReLU



    • 解决数据载入一下子过多计算量过大:批次和随机梯度下降
      因为一次载入所有数据计算量太大,每次epoch只选部分的点(batch size)进行训练,比如24个点,分为4个组,每组6个
      可以完成一次数据集,训练4次

    • 解决学不出来:学习速率衰退
      如果模型算不出来,就降低学习率;学习率在越来越接近solution的时候会降低

    • 解决局部最低点:使用随机重新开始
      随机重新开始能尽量找到局部最低点

    • 解决局部最低点:动量beta是动量系数,第二个乘以beta,第三个乘以beta^2。。。

      可以越过临时最低点

    2.4 Keras优化程序

    Keras 中有很多优化程序,建议你访问此链接或这篇精彩博文(此链接来自外网,国内网络可能打不开),详细了解这些优化程序。这些优化程序结合使用了上述技巧,以及其他一些技巧。最常见的包括:

    • SGD
      这是随机梯度下降。它使用了以下参数:

      • 学习速率。
      • 动量(获取前几步的加权平均值,以便获得动量而不至于陷在局部最低点)。
      • Nesterov 动量(当最接近解决方案时,它会减缓梯度)。
    • Adam
      Adam (Adaptive Moment Estimation) 使用更复杂的指数衰减,不仅仅会考虑平均值(第一个动量),并且会考虑前几步的方差(第二个动量)。

    • RMSProp
      RMSProp (RMS 表示均方根误差)通过除以按指数衰减的平方梯度均值来减小学习速率。

    &http://ruder.io/optimizing-gradient-descent/index.html#rmsprop
    &https://keras.io/optimizers/

    2.5 神经网络回归

    如果想把分类变为回归,就把最后的sigmod函数删了,然后直接用上一relu层算y,然后用(y-yhat)^2作为误差函数进行训练



    我们的内容开发者之一 Jay Alammar 创建了这个神奇的神经网络 “游乐场”,在这里你可以看到很棒的可视化效果,并可以使用参数来解决线性回归问题,然后尝试一些神经网络回归。 预祝学习愉快!

    https://jalammar.github.io/visual-interactive-guide-basics-neural-networks/

    2.6 keras小项目:使用 Keras 分析 IMDB 电影数据

    加载数据,检查数据,特征工程(one hot),模型构建,训练模型,评估模型,模型调优

    3 卷积神经网络

    3.1 应用

    3.2 手写数据库MNIST database

    预处理:/255归一化
    对标记进行one-hot label
    矩阵的每一行向量进行拼接成输入向量

    • MLP
      use keras flatten function
      Relu function 非线性性

      dropout function 防止过拟合
    • loss functions 分类交叉熵 categorical cross-entropy loss
      有很多梯度下降方法


      • 如果你想详细了解 Keras 中的完全连接层,请阅读这篇关于密集层的文档。你可以通过为 kernel_initializerbias_initializer 参数提供值更改权重的初始化方法。注意默认值分别为 'glorot_uniform''zeros'。你可以在相应的 Keras 文档中详细了解每种初始化程序的工作方法。
      • Keras 中有很多不同的损失函数。对于这节课来说,我们将仅使用 categorical_crossentropy
    • 模型验证


    在训练过程中,你可以使用很多回调(例如 ModelCheckpoint)来监控你的模型。你可以参阅此处的详情内容。建议你先详细了解 EarlyStopping 回调。如果你想查看另一个 ModelCheckpoint 代码示例,请参阅这篇博文

    • MLP和CNN适用场景



      MLP适用于数据预处理过后的,处于图像中间,大小类似的应用

    • 对比
      MLPs 数据太多容易失控,只接受向量作为输入,失去二维位置信息

      CNN用稀疏互联,接受矩阵作为输入

    3.3 细节

    • 局部连接层,将完全连接层换成局部连接层



    • 卷积层
      定义一个卷积窗


    filter 大小和卷积窗差不多大小
    filter和卷积窗求和再用ReLU函数去算
    在边缘检测的特别有效,用水平或者垂直的filter来组合

    对于彩色的图片可以理解为三层,是三维的

    一层一层的卷积层发现规律

    • Stride和填充
      number of filters and size of filters(window size)
      stride是filter每次滑动的距离1输入和输出基本一样,是2的话,输出是输入的一半

      填充是padding='valid'丢掉没有的点;
      padding='same'是填充为0
    • keras怎么调用和维度

    from keras.models import Sequential
    from keras.layers import Conv2D
    
    model = Sequential()
    model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid', 
        activation='relu', input_shape=(200, 200, 1)))
    model.summary()
    
    上面的参数量是80,计算方法见图下:
    • 公式:卷积层中的参数数量
      卷积层中的参数数量取决于 filters、kernel_size 和 input_shape 的值。我们定义几个变量:
      K - 卷积层中的过滤器数量
      F - 卷积过滤器的高度和宽度
      D_in - 上一层级的深度
      注意:K = filters,F = kernel_size。类似地,D_in 是 input_shape 元组中的最后一个值。
      因为每个过滤器有 FFD_in 个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 KFFD_in。因为每个过滤器有 1 个偏差项,卷积层有 K 个偏差。因此,卷积层中的参数数量是 KFFD_in + K。
      比如上面的图就是16*4+16 = 80

    • 公式:卷积层的形状
      卷积层的形状取决于 kernel_size、input_shape、padding 和 stride 的值。我们定义几个变量:
      K - 卷积层中的过滤器数量
      F - 卷积过滤器的高度和宽度
      H_in - 上一层级的高度
      W_in - 上一层级的宽度
      注意:K = filters、F = kernel_size,以及S = stride。类似地,H_in 和 W_in 分别是 input_shape 元组的第一个和第二个值。
      卷积层的深度始终为过滤器数量 K。
      如果 padding = 'same',那么卷积层的空间维度如下:
      height = ceil(float(H_in) / float(S))
      width = ceil(float(W_in) / float(S))
      如果 padding = 'valid',那么卷积层的空间维度如下:
      height = ceil(float(H_in - F + 1) / float(S))
      width = ceil(float(W_in - F + 1) / float(S))

    • 池化层
      过多的参数可能会造成过拟合,需要池化层来降低维数

      • 最大池化层
        跟卷积层一样需要配置配置window size和stride

        把多维数组变为了一半
      • global average pooling layer

        把多维数组变成了向量
    • Keras池化

    from keras.models import Sequential
    from keras.layers import MaxPooling2D
    
    model = Sequential()
    model.add(MaxPooling2D(pool_size=2, strides=2, input_shape=(100, 100, 15)))
    model.summary()
    

    3.4 图片分类CNN

    先要把图片处理成统一格式,比如32*32像素,彩色图片分为3层,黑白图片为1层,皆为RGB 0-255数值
    模型配置:


    • 从刚开始含有空间信息到最后没有空间信息
    • 最后加一个flatten变为向量,然后加两个全连接层预测


    3.5 keras中的CNN实例

    你可以在 aind2-cnn GitHub 资源库中访问视频中描述的 Jupyter Notebook。转到 cifar10-classification/ 文件夹并打开 cifar10_mlp.ipynbcifar10_cnn.ipynb

    • 验证集注意事项
      在这节课的早些时候,我们通过验证方式训练了一个神经网络,方法是将 model.fit 中的 validation_split 参数设为 0.2。这样会将训练数据的最后 20% 数据变成验证数据。在此视频的 notebook 中,我们自己硬编码了拆分比例,而不是让 Keras 为我们拆分验证集。
    • 课外资料
      • 这是用于在 Keras 中指定神经网络(包括 CNN)的备忘单
      • 参阅 CIFAR-10 竞赛的获胜架构

    3.6 keras中的图片增强功能

    scale(图片放大或缩小)和rotation(图片旋转)和translation invariance(图片平移)
    如果想要这些特征,就在数据集中加入转化了这些特征的图集 data augmentation
    你可以在 aind2-cnn GitHub 资源库中访问视频中描述的 Jupyter 记事本。转到 cifar10-augmentation/ 文件夹并打开 cifar10_augmentation.ipynb

    • 关于 steps_per_epoch 的注意事项
      fit_generator 具有很多参数,包括
    steps_per_epoch = x_train.shape[0] / batch_size
    

    其中 x_train.shape[0] 对应的是训练数据集 x_train 中的独特样本数量。通过将 steps_per_epoch 设为此值,我们确保模型在每个 epoch 中看到 x_train.shape[0] 个增强图片。

    • 课外资料
      • 阅读这篇对 MNIST 数据集进行可视化的精彩博文
      • 参阅此详细实现,了解如何使用增强功能提高 Kaggle 数据集的效果。
      • 阅读关于 ImageDataGenerator 类的 Keras 文档

    3.7 突破性的CNN架构

    ImageNet为超过1千万手动标记图片的数据库,ImageNet Large Scale Visual Recognition Competition

    AlexNet
    VGG Net
    ResNet

    3.8 可视化CNN

    通过不同的filter发现组合后的图片
    如果你想详细了解如何解读 CNN(尤其是卷积层),建议查看以下资料:

    • 这是摘自斯坦福大学的 CS231n 课程中的一个a 章节,其中对 CNN 学习的内容进行了可视化。

    • 参阅这个关于很酷的 OpenFrameworks 应用的演示,该应用可以根据用户提供的视频实时可视化 CNN!

    • 这是另一个 CNN 可视化工具的演示。如果你想详细了解这些可视化图表是如何制作的,请观看此视频

    • 这是另一个可与 Keras 和 Tensorflow 中的 CNN 无缝合作的可视化工具

    • 阅读这篇可视化 CNN 如何看待这个世界的 Keras 博文。在此博文中,你会找到 Deep Dreams 的简单介绍,以及在 Keras 中自己编写 Deep Dreams 的代码。阅读了这篇博文后:

      • 再观看这个利用 Deep Dreams 的音乐视频(注意 3:15-3:40 部分)!
      • 使用这个网站创建自己的 Deep Dreams(不用编写任何代码!)。
    • 如果你想详细了解 CNN 的解释

      • 这篇文章详细讲解了在现实生活中使用深度学习模型(暂时无法解释)的一些危险性。
      • 这一领域有很多热点研究。这些作者最近朝着正确的方向迈出了一步。
    • 深度可视化工具箱
      我们要查看的 CNN 在 ImageNet 上进行了训练(请参阅这篇来自 Zeiler 和 Fergus 的https://cs.nyu.edu/~fergus/papers/zeilerECCV2014.pdf
      。在下面的图片中(摘自上述同一论文)
      上述图片来自 Matthew Zeiler 和 Rob Fergus 的深度可视化工具箱(YOUTUBE链接,国内网络可能打不开),使我们能够可视化 CNN 中的每个层级侧重的是什么。

    3.9 迁移学习 transfer learning

    迁移学习
    迁移学习是指对提前训练过的神经网络进行调整,以用于新的不同数据集。

    • 取决于以下两个条件:
      新数据集的大小,以及
      新数据集与原始数据集的相似程度

    • 使用迁移学习的方法将各不相同。有以下四大主要情形:
      新数据集很小,新数据与原始数据相似
      新数据集很小,新数据不同于原始训练数据
      新数据集很大,新数据与原始训练数据相似
      新数据集很大,新数据不同于原始训练数据

    • 演示网络
      为了解释每个情形的工作原理,我们将以一个普通的预先训练过的卷积神经网络开始,并解释如何针对每种情形调整该网络。我们的示例网络包含三个卷积层和三个完全连接层:


    • 下面是卷积神经网络的作用一般概述:
      第一层级将检测图片中的边缘
      第二层级将检测形状
      第三个卷积层将检测更高级的特征
      每个迁移学习情形将以不同的方式使用预先训练过的神经网络。

    • 情形 1:小数据集,相似数据

      如果新数据集很小,并且与原始训练数据相似:
      删除神经网络的最后层级
      添加一个新的完全连接层,与新数据集中的类别数量相匹配
      随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
      训练该网络以更新新连接层的权重
      为了避免小数据集出现过拟合现象,原始网络的权重将保持不变,而不是重新训练这些权重。
      因为数据集比较相似,每个数据集的图片将具有相似的更高级别特征。因此,大部分或所有预先训练过的神经网络层级已经包含关于新数据集的相关信息,应该保持不变。

      以下是如何可视化此方法的方式:
    • 情形 2:小型数据集、不同的数据

      如果新数据集很小,并且与原始训练数据不同:
      将靠近网络开头的大部分预先训练过的层级删掉
      向剩下的预先训练过的层级添加新的完全连接层,并与新数据集的类别数量相匹配
      随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
      训练该网络以更新新连接层的权重
      因为数据集很小,因此依然需要注意过拟合问题。要解决过拟合问题,原始神经网络的权重应该保持不变,就像第一种情况那样。
      但是原始训练集和新的数据集并不具有相同的更高级特征。在这种情况下,新的网络仅使用包含更低级特征的层级。

      以下是如何可视化此方法的方式:
    • 情形 3:大型数据集、相似数据

      如果新数据集比较大型,并且与原始训练数据相似:
      删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
      随机地初始化新的完全连接层的权重
      使用预先训练过的权重初始化剩下的权重
      重新训练整个神经网络
      训练大型数据集时,过拟合问题不严重;因此,你可以重新训练所有权重。
      因为原始训练集和新的数据集具有相同的更高级特征,因此使用整个神经网络。

      以下是如何可视化此方法的方式:
    • 情形 4:大型数据集、不同的数据

      如果新数据集很大型,并且与原始训练数据不同:
      删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
      使用随机初始化的权重重新训练网络
      或者,你可以采用和“大型相似数据”情形的同一策略
      虽然数据集与训练数据不同,但是利用预先训练过的网络中的权重进行初始化可能使训练速度更快。因此这种情形与大型相似数据集这一情形完全相同。
      如果使用预先训练过的网络作为起点不能生成成功的模型,另一种选择是随机地初始化卷积神经网络权重,并从头训练网络。

      以下是如何可视化此方法的方式:
    • 课外资料

      • 参阅这篇 研究论文,该论文系统地分析了预先训练过的 CNN 中的特征的可迁移性。
      • 阅读这篇详细介绍 Sebastian Thrun 的癌症检测 CNN 的《自然》论文
      • 这是提议将 GAP 层级用于对象定位的首篇研究论文
      • 参阅这个使用 CNN 进行对象定位的资源库
      • 观看这个关于使用 CNN 进行对象定位的视频演示(Youtube链接,国内网络可能打不开)。
      • 参阅这个使用可视化机器更好地理解瓶颈特征的资源库
    • keras
      可以在此处链接的 GitHub 资源库中访问视频中提到的 Jupyter Notebook。转到 transfer-learning/ 文件夹并打开 transfer_learning.ipynb

    4 癌症检测模型 (单独写了一篇)

    5 狗狗分类项目

    • 项目概况
      欢迎来到卷积神经网络(CNN)项目!在这一项目中,你将学到如何建立一个处理现实生活中的,用户提供的图像的算法。给你一个狗的图像,你的算法将会识别并估计狗的品种,如果提供的图像是人,代码将会识别最相近的狗的品种。
      你可以查看项目的 Github 地址从那里开始你的项目
    • 过程
      导入数据,检测人(用OpenCV's implementation of Haar feature-based cascade classifiers
      )还是狗(use a pre-trained ResNet-50 model to detect dogs in images While looking at the dictionary, you will notice that the categories corresponding to dogs appear in an uninterrupted sequence and correspond to dictionary keys 151-268, inclusive, to include all categories from 'Chihuahua' to 'Mexican hairless'),创建CNN分辨狗的种类(从头构建,准确率比较低3%;迁移学习能达到37%;尝试不同的迁移,最后能达到80%),算法构建,测试算法

    相关文章

      网友评论

        本文标题:UD机器学习 - C5 深度学习

        本文链接:https://www.haomeiwen.com/subject/qmipectx.html