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)
应用激活函数
有很多激活函数可供选择,选择正确的激活函数肯定会对我们的深度学习模型的表现产生很大的影响。
在输出层
在输出层选择激活函数将取决于我们要用模型解决的问题类型。
对于回归问题,我们应该在输出层上使用线性激活函数。
对于二元分类问题,我们应该在输出层上使用S 型激活函数。
对于多类分类问题,我们应该在输出层上使用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 的包,我们可以从中导入要使用的指标。在构建分类模型时,我们将使用 classification_error 矩阵,该矩阵将产生一个介于 0 和 1 之间的数字。0 和 1 之间的数字表示正确预测的样本百分比 −
首先,我们需要从 cntk.metrics 包导入指标 −
from cntk.metrics import classes_error error_rate = classes_error(z, label)
上述函数实际上需要 NN 的输出和预期标签作为输入。