Microsoft-cognitive-toolkit-training-the-neural-network

提供:Dev Guides
移動先:案内検索

CNTK-ニューラルネットワークのトレーニング

ここでは、CNTKでのニューラルネットワークのトレーニングについて理解します。

CNTKでのモデルのトレーニング

前のセクションでは、ディープラーニングモデルのすべてのコンポーネントを定義しました。 今こそそれを訓練する時です。 前に説明したように、 learnertrainer の組み合わせを使用して、CNTKでNNモデルをトレーニングできます。

学習者の選択とトレーニングのセットアップ

このセクションでは、*学習者*を定義します。 CNTKでは、いくつかの*学習者*から選択できます。 前のセクションで定義したモデルでは、*確率的勾配降下法(SGD)学習器*を使用します。

ニューラルネットワークをトレーニングするために、 learnertrainer を次の手順で構成します-

ステップ1 *-最初に、 *cntk.lerners パッケージから sgd 関数をインポートする必要があります。

from cntk.learners import sgd

ステップ2 *-次に、 *cntk.train .trainerパッケージから Trainer 関数をインポートする必要があります。

from cntk.train.trainer import Trainer

ステップ3 *-次に、 *learner を作成する必要があります。 これは、モデルのパラメーターと学習率の値を提供するとともに 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 *-最初に、データセットからすべての行と最初の4列を選択する必要があります。 *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)

合計データの20%を確保するために、test_sizeに0.2を指定しました。

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モデルのパフォーマンスのこのような測定は、トレーニングデータに基づいています。 しかし一方で、モデルのパフォーマンスを完全に分析するには、テストデータも使用する必要があります。

したがって、テストデータを使用してモデルのパフォーマンスを測定するには、次のように trainertest_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 *-最後に、 *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