CNTK - 训练神经网络

  • 简述

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

    在上一节中,我们已经定义了深度学习模型的所有组件。现在是训练它的时候了。如前所述,我们可以在 CNTK 中使用learnertrainer的组合来训练 NN 模型。

    选择学习者并设置培训

    在本节中,我们将定义学习者。CNTK 提供了多种学习器可供选择。对于我们在前面部分中定义的模型,我们将使用随机梯度下降 (SGD) 学习器。
    为了训练神经网络,让我们在以下步骤的帮助下配置学习器和训练器 -
    第 1 步- 首先,我们需要从cntk.lerners包中导入sgd函数。
    
    
    from cntk.learners import sgd
    
    
    第 2 步 - 接下来,我们需要从cntk.train .trainer 包中导入Trainer函数。
    
    
    from cntk.train.trainer import Trainer
    
    
    第 3 步- 现在,我们需要创建一个学习者。它可以通过调用sgd函数以及提供模型的参数和学习率值来创建。
    
    
    learner = sgd(z.parametrs, 0.01)
    
    
    第 4 步 - 最后,我们需要初始化trainer。它必须提供网络、损失度量的组合以及学习器
    
    
    trainer = Trainer(z, (loss, error_rate), [learner])
    
    
    控制优化速度的学习率应该是0.1到0.001之间的小数字。

    选择学习者并设置培训 - 完整示例

    
    
    from cntk.learners import sgd
    
    from cntk.train.trainer import Trainer
    
    learner = sgd(z.parametrs, 0.01)
    
    trainer = Trainer(z, (loss, error_rate), [learner])
    
    
  • 将数据输入训练器

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

    从 .CSV 文件加载数据集的步骤

    第 1 步- 首先,我们需要导入pandas包。
    
    
    from import pandas as pd
    
    
    第 2 步- 现在,我们需要调用名为read_csv的函数来从磁盘加载 .csv 文件。
    
    
    df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, 
    
    ‘petal_length’, ‘petal_width’, index_col=False)
    
    
    加载数据集后,我们需要将其拆分为一组特征和一个标签。

    将数据集拆分为特征和标签的步骤

    第 1 步 - 首先,我们需要从数据集中选择所有行和前四列。它可以通过使用iloc函数来完成。
    
    
    x = df_source.iloc[:, :4].values
    
    
    第 2 步- 接下来我们需要从 iris 数据集中选择物种列。我们将使用 values 属性来访问底层的numpy数组。
    
    
    x = df_source[‘species’].values
    
    

    将物种列编码为数字向量表示的步骤

    正如我们前面所讨论的,我们的模型是基于分类的,它需要数字输入值。因此,这里我们需要将物种列编码为数字向量表示。让我们看看它的步骤 -
    第 1 步- 首先,我们需要创建一个列表表达式来迭代数组中的所有元素。然后在 label_mapping 字典中查找每个值。
    
    
    label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
    
    
    第 2 步 - 接下来,将此转换后的数值转换为 one-hot 编码向量。我们将使用one_hot函数如下 -
    
    
    def one_hot(index, length):
    
    result = np.zeros(length)
    
    result[index] = 1
    
    return result
    
    
    第 3 步- 最后,我们需要将此转换后的列表转换为numpy数组。
    
    
    y = np.array([one_hot(label_mapping[v], 3) for v in y])
    
    

    检测过拟合的步骤

    当您的模型记住样本但无法从训练样本中推断出规则时,这种情况就是过度拟合。借助以下步骤,我们可以检测模型的过度拟合 -
    第 1 步- 首先,从sklearn包中,从model_selection模块导入train_test_split函数。
    
    
    from sklearn.model_selection import train_test_split
    
    
    第 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}
    
    

    向我们的模型提供训练集和验证集的步骤

    第 1 步- 为了训练我们的模型,首先,我们将调用train_minibatch方法。然后给它一个字典,将输入数据映射到我们用来定义 NN 及其相关损失函数的输入变量。
    
    
    trainer.train_minibatch({ features: X_train, label: y_train})
    
    
    第 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))
    
    

    将数据输入训练器 - 完整示例

    
    
    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))
    
    
  • 测量 NN 的性能

    为了优化我们的 NN 模型,每当我们通过训练器传递数据时,它都会通过我们为训练器配置的指标来衡量模型的性能。这种在训练期间对NN模型性能的测量是基于训练数据的。但另一方面,为了全面分析模型性能,我们也需要使用测试数据。
    因此,要使用测试数据测量模型的性能,我们可以在训练器上调用test_minibatch方法,如下所示 -
    
    
    trainer.test_minibatch({ features: X_test, label: y_test})
    
    
  • 使用 NN 进行预测

    一旦你训练了一个深度学习模型,最重要的是使用它进行预测。为了从上述训练的 NN 中进行预测,我们可以按照给定的步骤 -
    第 1 步- 首先,我们需要使用以下函数从测试集中选择一个随机项目 -
    
    
    np.random.choice
    
    
    第 2 步 - 接下来,我们需要使用sample_index从测试集中选择样本数据。
    第 3 步- 现在,为了将 NN 的数字输出转换为实际标签,创建一个反向映射。
    第 4 步- 现在,使用选定的样本数据。通过调用 NN z 作为函数进行预测。
    第 5 步- 现在,一旦获得预测输出,将具有最高值的神经元的索引作为预测值。它可以通过使用numpy包中的np.argmax函数来完成。
    第 6 步- 最后,使用reverse_mapping将索引值转换为真实标签。

    使用 NN 进行预测 - 完整示例

    
    
    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)
    
    
  • 输出

    训练上述深度学习模型并运行后,您将获得以下输出 -
    
    
    Iris-versicolor