Microsoft-cognitive-toolkit-out-of-memory-datasets
CNTK-メモリ不足のデータセット
この章では、メモリ不足のデータセットのパフォーマンスを測定する方法について説明します。
前のセクションでは、NNのパフォーマンスを検証するさまざまな方法について説明しましたが、ここで説明した方法は、メモリに収まるデータセットを処理する方法です。
ここでは、メモリ不足のデータセットについての質問が発生します。本番シナリオでは、 NN をトレーニングするために大量のデータが必要になるためです。 このセクションでは、ミニバッチソースと手動ミニバッチループを使用する場合のパフォーマンスを測定する方法について説明します。
ミニバッチソース
メモリ不足のデータセットを操作しているとき、つまり ミニバッチソースの場合、小さなデータセットを操作するときに使用したセットアップとは少し異なる、セットアップとメトリックのセットアップが必要です。 インメモリデータセット。 最初に、NNモデルのトレーナーにデータをフィードする方法を設定する方法を説明します。
次に、実装手順を示します。
- ステップ1 *-まず、cntk。 ioモジュールから、次のようにミニバッチソースを作成するためのコンポーネントをインポートします-
ステップ2 *-次に、say *create_datasource という名前の新しい関数を作成します。 この関数には、ファイル名と制限という2つのパラメーターがあり、デフォルト値は INFINITELY_REPEAT です。
ステップ3 *-関数内で、 *StreamDef クラスを使用して、3つの機能を持つラベルフィールドから読み取るラベルのストリーム定義を作成します。 また、次のように is_sparse を False に設定する必要があります
ステップ4 *-次に、入力ファイルからファイルされた機能を読み取るために作成し、次のように *StreamDef の別のインスタンスを作成します。
ステップ5 *-次に、 *CTFDeserializer インスタンスクラスを初期化します。 次のように、逆シリアル化する必要があるファイル名とストリームを指定します-
- ステップ6 *-次に、次のようにデシリアライザを使用してminisourceBatchのインスタンスを作成する必要があります-
- ステップ7 *-最後に、前のセクションでも作成したトレーニングとテストのソースを提供する必要があります。 アイリスの花のデータセットを使用しています。
次に、実装手順を示します。
ステップ1 *-トレーニングセッションの出力をログに記録するには、まず次のように *cntk.logging モジュールから ProgressPrinter をインポートします-
ステップ2 *-次に、トレーニングセッションを設定するには、次のように *cntk.train モジュールから trainer および training_session をインポートします。
ステップ3 *-ここで、 *minibatch_size 、 samples_per_epoch 、 num_epochs などの定数のセットを次のように定義する必要があります-
- ステップ4 *-次に、CNTKでのトレーニング中にデータを読み取る方法を知るために、ネットワークの入力変数とミニバッチソースのストリーム間のマッピングを定義する必要があります。
ステップ5 *-次にトレーニングプロセスの出力をログに記録するには、 *progress_printer 変数を新しい ProgressPrinter インスタンスで初期化します。 また、 trainer を初期化し、次のようにモデルを提供します
ステップ6 *-最後に、トレーニングプロセスを開始するには、次のように *training_session 関数を呼び出す必要があります-
モデルをトレーニングしたら、 TestConfig オブジェクトを使用してこの設定に検証を追加し、 train_session 関数の test_config キーワード引数に割り当てることができます。
次に、実装手順を示します。
ステップ1 *-最初に、次のように *cntk.train モジュールから TestConfig クラスをインポートする必要があります-
ステップ2 *-次に、 *test_source を入力として TestConfig の新しいインスタンスを作成する必要があります-
完全な例
出力
手動ミニバッチループ
上記のように、CNTKで通常のAPIを使用してトレーニングするときにメトリックを使用すると、トレーニング中およびトレーニング後のNNモデルのパフォーマンスを簡単に測定できます。 しかし、一方で、手動のミニバッチループで作業している間は、それほど簡単ではありません。
ここでは、前のセクションでも作成したIris Flowerデータセットからの4つの入力と3つの出力を使用して、以下のモデルを使用しています。
次に、モデルの損失は、クロスエントロピー損失関数と、前のセクションで使用したFメジャーメトリックの組み合わせとして定義されます。 以下に示すように、 criterion_factory ユーティリティを使用して、これをCNTK関数オブジェクトとして作成します。
これで損失関数を定義したので、トレーナーでそれを使用して手動トレーニングセッションをセットアップする方法を確認します。
以下は実装手順です-
ステップ1 *-最初に、データをロードして前処理するために *numpy や pandas などの必要なパッケージをインポートする必要があります。
ステップ2 *-次に、トレーニング中に情報をログに記録するために、次のように *ProgressPrinter クラスをインポートします-
- ステップ3 *-次に、次のようにcntk.trainモジュールからトレーナーモジュールをインポートする必要があります-
ステップ4 *-次に、次のように *ProgressPrinter の新しいインスタンスを作成します-
ステップ5 *-次に、損失、学習者、 *progress_writer のパラメーターを使用してトレーナーを次のように初期化する必要があります-
- ステップ6 *-次に、モデルをトレーニングするために、データセットを30回反復するループを作成します。 これが外側のトレーニングループになります。
ステップ7 *-次に、パンダを使用してディスクからデータをロードする必要があります。 次に、 *mini-batches にデータセットをロードするために、 chunksize キーワード引数を16に設定します。
- ステップ8 *-次に、各*ミニバッチ*を反復するループの内部トレーニングを作成します。
ステップ9 *-このループの内部で、 *iloc インデクサーを使用して最初の4つの列を、トレーニングおよびfloat32に変換する*機能*として読み取ります-
- ステップ10 *-次のように、最後の列をトレーニング元のラベルとして読み取ります-
- ステップ11 *-次に、次のようにワンホットベクトルを使用して、ラベル文字列を数値表現に変換します-
- ステップ12 *-その後、ラベルの数値表示を行います。 次に、それらをnumpy配列に変換しますので、次のようにそれらを扱うのが簡単です-
- ステップ13 *-次に、変換したラベル値と同じ行数を持つ新しいnumpy配列を作成する必要があります。
- ステップ14 *-ここで、ワンホットエンコードされたラベルを作成するために、数値ラベル値に基づいて列を選択します。
ステップ15 *-最後に、トレーナーで *train_minibatch メソッドを呼び出し、ミニバッチの処理済みの機能とラベルを提供する必要があります。
完全な例
出力
上記の出力では、トレーニング中の損失とメトリックの両方の出力が得られました。 これは、関数オブジェクトでメトリックと損失を組み合わせ、トレーナー構成でプログレスプリンターを使用したためです。
ここで、モデルのパフォーマンスを評価するために、モデルのトレーニングと同じタスクを実行する必要がありますが、今回は Evaluator インスタンスを使用してモデルをテストする必要があります。 次のPythonコードに示されています
今、私たちは次のような出力を取得します-