CNTK - 创建一个神经网络

  • 简述

    本章将详细介绍在 CNTK 中创建神经网络。
  • 构建网络结构

    为了应用 CNTK 概念来构建我们的第一个 NN,我们将使用 NN 根据萼片宽度和长度以及花瓣宽度和长度的物理特性对鸢尾花的种类进行分类。我们将使用鸢尾花数据集的数据集描述了不同品种鸢尾花的物理特性 -
    • 萼片长度
    • 萼片宽度
    • 花瓣长度
    • 花瓣宽度
    • 类即鸢尾花或花斑鸢尾或鸢尾花
    在这里,我们将构建一个称为前馈 NN 的常规 NN。让我们看看构建 NN 结构的实施步骤 -
    第 1 步- 首先,我们将从 CNTK 库导入必要的组件,例如层类型、激活函数和允许我们为 NN 定义输入变量的函数。
    
    
    from cntk import default_options, input_variable
    
    from cntk.layers import Dense, Sequential
    
    from cntk.ops import log_softmax, relu
    
    
    第 2 步- 之后,我们将使用顺序函数创建模型。创建后,我们将为它提供所需的层。在这里,我们将在 NN 中创建两个不同的层;一个有四个神经元,另一个有三个神经元。
    
    
    model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
    
    
    第 3 步- 最后,为了编译 NN,我们将网络绑定到输入变量。它有一个带有四个神经元的输入层和一个带有三个神经元的输出层。
    
    
    feature= input_variable(4)
    
    z = model(feature)
    
    
  • 应用激活函数

    有很多激活函数可供选择,选择正确的激活函数肯定会对我们的深度学习模型的性能产生很大影响。

    在输出层

    在输出层选择激活函数将取决于我们要使用模型解决的问题类型。
    • 对于回归问题,我们应该在输出层使用线性激活函数
    • 对于二元分类问题,我们应该在输出层使用sigmoid 激活函数
    • 对于多类分类问题,我们应该在输出层使用softmax激活函数
    • 在这里,我们将建立一个模型来预测三个类别之一。这意味着我们需要在输出层使用softmax 激活函数

    在隐藏层

    在隐藏层选择一个激活函数需要一些实验来监控性能,看看哪个激活函数效果很好。
    • 在分类问题中,我们需要预测样本属于特定类别的概率。这就是为什么我们需要一个为我们提供概率值的激活函数。为了达到这个目标,sigmoid 激活函数可以帮助我们。
    • 与 sigmoid 函数相关的主要问题之一是梯度消失问题。为了克服这个问题,我们可以使用ReLU 激活函数,将所有负值转换为零,并作为正值的直通滤波器。
  • 选择损失函数

    一旦有了 NN 模型的结构,我们就必须对其进行优化。为了优化,我们需要一个损失函数。与激活函数不同,我们可以选择的损失函数非常少。但是,选择损失函数将取决于我们要使用模型解决的问题类型。
    例如,在分类问题中,我们应该使用可以衡量预测类和实际类之间差异的损失函数。

    损失函数

    对于分类问题,我们将使用我们的 NN 模型来解决,分类交叉熵损失函数是最佳候选。在 CNTK 中,它被实现为cross_entropy_with_softmax,可以从cntk.losses包中导入,如下 -
    
    
    label= input_variable(3)
    
    loss = cross_entropy_with_softmax(z, label)
    
    
  • 指标

    有了 NN 模型的结构和要应用的损失函数,我们就拥有了开始制定优化深度学习模型的方法的所有要素。但是,在深入研究之前,我们应该了解指标。
    
    
    cntk.metrics
    
    
    CNTK 有一个名为cntk.metrics的包,我们可以从中导入我们将要使用的指标。在构建分类模型时,我们将使用分类误差矩阵,该矩阵将产生 0 到 1 之间的数字。0 到 1 之间的数字表示正确预测的样本百分比 -
    首先,我们需要从cntk.metrics包中导入指标 -
    
    
    from cntk.metrics import classification_error
    
    error_rate = classification_error(z, label)
    
    
    上述函数实际上需要NN的输出和预期的标签作为输入。