Microsoft Cognitive Toolkit 简明教程

CNTK - Training the Neural Network

在这里,我们将了解如何在CNTK中训练神经网络。

Training a model in CNTK

在上一节中,我们已经定义了深度学习模型的所有组成部分。现在是时候对其进行训练了。如我们之前讨论过的,我们可以使用 learnertrainer 的组合在CNTK中训练神经网络模型。

Choosing a learner and setting up training

在本节中,我们将定义 learner 。CNTK提供几个 learners 供我们选择。对于我们在前面部分中定义的模型,我们将使用 Stochastic Gradient Descent (SGD) learner

为了训练神经网络,让我们借助以下步骤配置 learnertrainer

Step 1 −首先,我们需要从 cntk.lerners 包中导入 sgd 函数。

from cntk.learners import sgd

Step 2 −接下来,我们需要从 cntk.train .trainer包中导入 Trainer 函数。

from cntk.train.trainer import Trainer

Step 3 −现在,我们需要创建一个 learner 。可以通过调用 sgd 函数,以及提供模型参数和学习速率值来创建它。

learner = sgd(z.parametrs, 0.01)

Step 4 −最后,我们需要初始化 trainer 。必须为其提供网络、 lossmetric 的组合以及 learner

trainer = Trainer(z, (loss, error_rate), [learner])

控制优化速度的学习速率应该是0.1到0.001之间的较小子。

Choosing a learner and setting up the training - Complete example

from cntk.learners import sgd
from cntk.train.trainer import Trainer
learner = sgd(z.parametrs, 0.01)
trainer = Trainer(z, (loss, error_rate), [learner])

Feeding data into the trainer

一旦我们选择了并配置了训练器,就该加载数据集了。我们已经将 iris 数据集保存为. CSV 文件,并且我们将使用名为 pandas 的数据整理包来加载数据集。

Steps to load the dataset from .CSV file

Step 1 −首先,我们需要导入 pandas 包。

from import pandas as pd

Step 2 −现在,我们需要调用名为 read_csv 的函数来从磁盘加载.csv文件。

df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’,
‘petal_length’, ‘petal_width’, index_col=False)

在加载数据集后,我们需要将其分割成一组特征和一个标签。

Steps to split the dataset into features and label

Step 1 - 首先,我们需要从数据集中选择所有行和前四列。可以通过使用 iloc 函数来完成。

x = df_source.iloc[:, :4].values

Step 2 - 然后我们需要从 iris 数据集中选择 species 列。我们将使用 values 属性来访问底层的 numpy 数组。

x = df_source[‘species’].values

Steps to encode the species column to a numeric vector representation

正如我们前面所讨论的,我们的模型基于分类,它需要数字输入值。因此,在这里我们需要将 species 列编码为一个数字向量表示。下面来看一下执行此操作的步骤 −

Step 1 - 首先,我们需要创建一个列表表达式来遍历数组中的所有元素。然后为每个值在 label_mapping 字典中执行查找。

label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}

Step 2 - 然后,将这个转换后的数字值转换为一个独热编码向量。我们将使用 one_hot 函数,如下所示 −

def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result

Step 3 - 最后,我们需要将这个转换后的列表变成一个 numpy 数组。

y = np.array([one_hot(label_mapping[v], 3) for v in y])

Steps to detect overfitting

当模型记住样本但无法从训练样本中推导出规则时,这种情况称为过拟合。通过以下步骤,我们可以检测出模型的过拟合 −

Step 1 - 首先,从 sklearn 包中导入 train_test_split *function from the *model_selection 模块。

from sklearn.model_selection import train_test_split

Step 2 - 然后,我们需要使用特征 x 和标签 y 调用 train_test_split 函数,如下所示 −

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2,
stratify=y)

我们指定 test_size 为 0.2 以保留 20% 的总数据。

label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}

Steps to feed training set and validation set to our model

Step 1 - 为了训练我们的模型,首先,我们将调用 train_minibatch 方法。然后给它一个字典,将输入数据映射到我们用来定义神经网络及其相关损失函数的输入变量。

trainer.train_minibatch({ features: X_train, label: y_train})

Step 2 - 然后,通过使用以下 for 循环调用 train_minibatch

for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))

Feeding data into the trainer - Complete example

from import pandas as pd
df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, index_col=False)
x = df_source.iloc[:, :4].values
x = df_source[‘species’].values
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result
y = np.array([one_hot(label_mapping[v], 3) for v in y])
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2, stratify=y)
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
trainer.train_minibatch({ features: X_train, label: y_train})
for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))

Measuring the performance of NN

为了优化我们的神经网络模型,每当我们通过训练器传递数据时,它都会通过我们为训练器配置的指标来衡量模型的性能。这种在训练过程中衡量神经网络模型性能的方法是通过训练数据。但是另一方面,为了对模型性能进行全面分析,我们还需要使用测试数据。

因此,为了使用测试数据衡量模型的性能,我们可以调用 trainer 上的 test_minibatch 方法,如下所示 −

trainer.test_minibatch({ features: X_test, label: y_test})

Making prediction with NN

一旦你训练了一个深度学习模型,最重要的是使用它进行预测。为了从上面训练的神经网络中进行预测,我们可以按照以下步骤进行操作 −

Step 1 - 首先,我们需要使用以下函数从测试集中挑选一个随机项 −

np.random.choice

Step 2 - 然后,我们需要使用 sample_index 从测试集中选择样本数据。

Step 3 - 现在,为了将神经网络的数字输出转换为实际标签,创建一个反向映射。

Step 4 − 现在,使用选定的 sample 数据。通过将 NN z 作为函数来调用,做出预测。

Step 5 − 现在,一旦获得了预测输出,将具有最高值的神经元的索引作为预测值。可以使用 numpy 包中的 np.argmax 函数来完成此操作。

Step 6 − 最后,使用 inverted_mapping 将索引值转换为真实的标签。

Making prediction with NN - Complete example

sample_index = np.random.choice(X_test.shape[0])
sample = X_test[sample_index]
inverted_mapping = {
   1:’Iris-setosa’,
   2:’Iris-versicolor’,
   3:’Iris-virginica’
}
prediction = z(sample)
predicted_label = inverted_mapping[np.argmax(prediction)]
print(predicted_label)

Output

在训练完上述深度学习模型并运行它之后,你将获得以下输出 −

Iris-versicolor