📅  最后修改于: 2020-12-10 05:02:28             🧑  作者: Mango
在这里,我们将了解有关在CNTK中训练神经网络的信息。
在上一节中,我们定义了深度学习模型的所有组件。现在该训练它了。如前所述,我们可以使用学习者和训练者的组合训练CNTK中的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])
一旦我们选择并配置了培训者,就该加载数据集了。我们将虹膜数据集另存为。 CSV文件,我们将使用名为pandas的数据整理包来加载数据集。
步骤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-接下来,我们需要从虹膜数据集中选择物种列。我们将使用values属性访问基础的numpy数组。
x = df_source[‘species’].values
如前所述,我们的模型基于分类,它需要数字输入值。因此,这里我们需要将种类列编码为数字矢量表示。让我们看看执行此操作的步骤-
步骤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模型,每当我们通过培训员传递数据时,它都会通过为培训员配置的指标来衡量模型的性能。训练期间神经网络模型性能的这种测量是在训练数据上进行的。但另一方面,要对模型性能进行全面分析,我们还需要使用测试数据。
因此,要使用测试数据衡量模型的性能,我们可以在训练器上调用test_minibatch方法,如下所示:
trainer.test_minibatch({ features: X_test, label: y_test})
训练了深度学习模型后,最重要的是使用该模型进行预测。为了从上面训练有素的NN进行预测,我们可以按照给定的步骤进行操作-
步骤1-首先,我们需要使用以下函数从测试集中选择一个随机项目-
np.random.choice
步骤2-接下来,我们需要使用sample_index从测试集中选择样本数据。
步骤3-现在,为了将数字输出转换为NN并转换为实际标签,请创建一个反向映射。
步骤4-现在,使用选定的样本数据。通过调用NN将z作为函数做出预测。
步骤5-现在,一旦获得了预测输出,就将具有最高值的神经元的索引作为预测值。可以使用numpy包中的np.argmax函数来完成。
第6步-最后,通过使用reverse_mapping将索引值转换为实数标签。
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