CNTK - 创建第一个神经网络


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

构建网络结构

为了应用 CNTK 概念来构建我们的第一个神经网络,我们将使用神经网络根据萼片宽度和长度以及花瓣宽度和长度的物理特性对鸢尾花的种类进行分类。我们将使用鸢尾花数据集来描述不同品种鸢尾花的物理特性 -

  • 萼片长度
  • 萼片宽度
  • 花瓣长度
  • 花瓣宽度
  • ie 类山鸢尾或杂色鸢尾或维吉尼亚鸢尾

在这里,我们将构建一个称为前馈神经网络的常规神经网络。让我们看看构建神经网络结构的实现步骤 -

步骤 1 - 首先,我们将从 CNTK 库导入必要的组件,例如层类型、激活函数以及允许我们为神经网络定义输入变量的函数。

from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu

步骤 2 - 之后,我们将使用顺序函数创建模型。创建后,我们将为它提供我们想要的层。在这里,我们将在神经网络中创建两个不同的层;一个有四个神经元,另一个有三个神经元。

model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])

步骤 3 - 最后,为了编译神经网络,我们将网络绑定到输入变量。它有一个包含四个神经元的输入层和一个包含三个神经元的输出层。

feature= input_variable(4)
z = model(feature)

应用激活函数

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

在输出层

在输出层选择激活函数将取决于我们要用模型解决的问题类型。

  • 对于回归问题,我们应该在输出层使用线性激活函数。

  • 对于二元分类问题,我们应该在输出层使用sigmoid 激活函数。

  • 对于多类分类问题,我们应该在输出层使用softmax激活函数。

  • 在这里,我们将构建一个模型来预测这三个类别之一。这意味着我们需要在输出层使用softmax激活函数

在隐藏层

在隐藏层选择激活函数需要进行一些实验来监控性能,以了解哪种激活函数效果良好。

  • 在分类问题中,我们需要预测样本属于特定类别的概率。这就是为什么我们需要一个为我们提供概率值的激活函数。为了达到这个目标,sigmoid激活函数可以帮助我们。

  • 与 sigmoid 函数相关的主要问题之一是梯度消失问题。为了克服这个问题,我们可以使用ReLU 激活函数,将所有负值转换为零,并作为正值的直通滤波器。

选择损失函数

一旦我们有了神经网络模型的结构,我们就必须对其进行优化。为了优化我们需要一个损失函数与激活函数不同,我们可供选择的损失函数非常少。然而,损失函数的选择取决于我们要用模型解决的问题类型。

例如,在分类问题中,我们应该使用可以衡量预测类与实际类之间差异的损失函数。

损失函数

对于分类问题,我们将使用神经网络模型来解决,分类交叉熵损失函数是最佳候选。在 CNTK 中,它被实现为cross_entropy_with_softmax,可以从cntk.losses包导入,如下所示:

label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)

指标

有了神经网络模型的结构和要应用的损失函数,我们就具备了开始制定优化深度学习模型的方法的所有要素。但是,在深入研究这一点之前,我们应该了解指标。

cntk.metrics

CNTK 有一个名为cntk.metrics的包,我们可以从中导入我们要使用的指标。当我们构建分类模型时,我们将使用分类错误矩阵,该矩阵将生成 0 到 1 之间的数字。0 到 1 之间的数字表示正确预测的样本的百分比 -

首先,我们需要从cntk.metrics包导入指标-

from cntk.metrics import classification_error
error_rate = classification_error(z, label)

上面的函数实际上需要神经网络的输出和期望的标签作为输入。