- Microsoft Cognitive Toolkit (CNTK) 教程
- 首页
- 介绍
- 入门
- CPU 和 GPU
- CNTK - 序列分类
- CNTK - 逻辑回归模型
- CNTK - 神经网络 (NN) 概念
- CNTK - 创建第一个神经网络
- CNTK - 神经网络训练
- CNTK - 内存数据集和大型数据集
- CNTK - 性能测量
- 神经网络分类
- 神经网络二元分类
- CNTK - 神经网络回归
- CNTK - 分类模型
- CNTK - 回归模型
- CNTK - 内存不足的数据集
- CNTK - 模型监控
- CNTK - 卷积神经网络
- CNTK - 循环神经网络
- Microsoft Cognitive Toolkit 资源
- Microsoft Cognitive Toolkit - 快速指南
- Microsoft Cognitive Toolkit - 资源
- Microsoft Cognitive Toolkit - 讨论
CNTK - 神经网络训练
在这里,我们将了解如何在 CNTK 中训练神经网络。
在 CNTK 中训练模型
在上一节中,我们已经定义了深度学习模型的所有组件。现在是时候训练它了。正如我们前面讨论的,我们可以使用学习器和训练器的组合在 CNTK 中训练 NN 模型。
选择学习器并设置训练
在本节中,我们将定义学习器。CNTK 提供了多种学习器可供选择。对于我们在上一节中定义的模型,我们将使用随机梯度下降 (SGD) 学习器。
为了训练神经网络,让我们通过以下步骤配置学习器和训练器:
步骤 1 - 首先,我们需要从cntk.learners包中导入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(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 数据集中选择 species 列。我们将使用 values 属性来访问底层的numpy数组。
x = df_source[‘species’].values
将 species 列编码为数值向量表示的步骤
正如我们前面讨论的,我们的模型基于分类,它需要数值输入值。因此,这里我们需要将 species 列编码为数值向量表示。让我们看看执行此操作的步骤:
步骤 1 - 首先,我们需要创建一个列表表达式来迭代数组中的所有元素。然后为每个值在 label_mapping 字典中执行查找。
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
步骤 2 - 接下来,将这个转换后的数值转换为独热编码向量。我们将使用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 - 现在,使用选定的sample数据。通过将 NN z 作为函数来进行预测。
步骤 5 - 现在,一旦得到预测输出,就将具有最高值的 neurons 的索引作为预测值。可以使用numpy包中的np.argmax函数来完成。
步骤 6 - 最后,使用inverted_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