目次


Watson Studio の Neural Network Modeler と Experiments を利用した深層学習モデル

署名詐欺を検出するモデルを作成する

Comments

学習の目的

深層学習は複雑な問題を効率的に解決するためのテクノロジーです。このデータ・サイエンスに必要となる「シーン」の部分は、さまざまな設定を試してその結果を比較することに他なりません。Watson Studio を利用すると、使いやすい GUI を使用してニューラル・ネットワークを簡単に設計できます。さらに、お気に入りのフレームワークを使ってモデルをコードとしてダウンロードし、さまざまなハイパーパラメーター最適化設定を実験して比較することができます。

このチュートリアルでは、深層ニューラル・ネットワークを構築し、署名詐欺を検出するモデルを作成します。このプロセスを通して、Watson Studio の Neural Network Modeler でニューラル・ネットワーク・アーキテクチャーを迅速にプロトタイプ化してテストする方法を説明します。また、Neural Network Modeler から生成されたコードをダウンロードする方法、そのコードに変更を加えて Watson Studio の Experiments に接続し、ハイパーパラメーター最適化を処理する方法も説明します。

このチュートリアルで使用するデータセットには、本物の署名の画像とシミュレーションされた (不正な) 署名の画像が含まれています。このデータセットの出典は ICFHR 2010 Signature Verification Competition [1] です。チュートリアル用に、データセットに含まれる元の画像のサイズを 32×32 ピクセルに変更し、pickle 形式の numpy 配列として保管してあります。

前提条件

所要時間

このチュートリアルを読んで手順に取り組むのにかかる時間はおよそ 1 時間です。

手順

1. データセットを IBM Cloud Object Storage にアップロードする

ニューラル・ネットワークの構築を開始する前に、データが含まれるファイルをクラウド上の Object Storage インスタンスにアップロードする必要があります。それにはまず、前提条件としてダウンロードした assets フォルダーを圧縮解除します。フォルダー内に、training_data.picklevalidation_data.pickletest_data.pickle という 3 つのデータ・ファイルがあることを確認してください。

IBM Cloud 上のダッシュボードを表示して、「Services (サービス)」セクションにある Cloud Object Storage インスタンスをクリックします。

001
001

「Create Bucket (バケットの作成)」を選択し、データを保管するバケットを作成します。このステップを行っておくと、Watson Studio の Neural Network Modeler を操作するときにデータをすぐに見つけられるようになります。

002
002

バケットの名前は IBM Cloud Object Storage でグローバルに一意でなければなりません。自分の名前とプロジェクトを識別する何らかの ID を組み合わせたバケット名にすることをお勧めします。また、「Resiliency (回復機能)」に「Cross Region (領域間)」が選択されていることも確認してください。これを確認してから、「Create bucket (バケットを作成)」をクリックします。

003
003

新しく作成したバケットにファイルを追加していきます。ファイルを追加するには、ページの右上隅にある「Upload (アップロード)」ボタンをクリックし、ドロップダウン・メニューから「Files (ファイル)」項目を選択します。

004
004

「Standard Upload (標準的なアップロード)」項目を選択し、「Select Files (ファイルの選択)」ボタンをクリックします。

005
005

ローカル・ディスク上で圧縮解除した assets フォルダーに含まれている training_data.picklevalidation_data.pickletest_data.pickle という名前の 3 つのファイルを選択します。選択したファイルをアップロードすることを確認するよう求めるダイアログが表示されます。「Upload (アップロード)」をクリックしてアップロード・プロセスを進めます。

006
006

アップロード・プロセスが完了すると、ページが更新されてアップロードされたファイルが表示されます。

007
007

2. Watson Studio Neural Network Modeler を利用してニューラル・ネットワークを作成する

Watson Studio 内で「Create a project (プロジェクトを作成)」を選択します。

008
008

次に表示されるページで、「Standard option (スタンダート・オプション)」を選択します。

009
009

プロジェクトに名前を付けて、Cloud Object Storage を関連付けます。前のステップに従っていれば、Object Storage インスタンスが検出されてドロップダウンから選択できるようになっているはずです。

010
010

これで、Watson Studio の操作を開始できます。

011
011

「Modeler Flow (Modeler フロー)」を作成します。この項目は、プロジェクトのぺージの右上にある「Add to project (プロジェクトに追加)」をクリックすることで選択可能になります。

012
012

モデルの名前を入力して、「Neural Network Modeler」を選択してから「Create (作成)」をクリックします。

013
013

前のステップが正常に完了すると、Modeler のキャンバスが表示されます。Modeler では、コードではなくグラフィック形式で表示されるニューラル・ネットワークを作成することができます。画面左側にある「Palette (パレット)」という名前のサイドバーに、ニューラル・ネットワークに使用できるすべてのコンポーネントが含まれています。基本的な操作としては、ニューラル・ネットワークのさまざまな層を表すノードをドラッグ・アンド・ドロップし、ノードを互いに接続してフローを作成します。

014
014

まず、ニューラル・ネットワークのデータを提供する必要があります。それには、Neural Network Modeler パレットの「Input (入力)」セクションから「Image Data (画像データ)」を選択します。

015
015

「Image Data (画像データ)」ノードをドラッグしてキャンバス上にドロップし、ノードのプロパティーを変更するために、そのノードをダブルクリックします。この操作によって、右側に別のサイドバーが表示されます。

016
016

データ・ソースを定義するために、Object Storage インスタンスへの新しい接続 (COS) を作成します。それには、「Data (データ)」セクションにある「Create a New Connection (新しい接続の作成)」をクリックします。あるいは、既存の接続がある場合は、その接続を選択します。データ・アセットを含むバケット (ステップ 1 を参照) を選択します。トレーニング・データ・ファイルとして training_data.pickle を選択し、テスト・データ・ファイルとして test_data.pickle、検証データ・ファイルとして validation_data.pickle を選択します。

017
017

「Data (データ)」セクションを閉じて、同じ右側のサイド・パネルにある「Settings (設定)」セクションに表示を切り替えます。下のスクリーンショットに示されているように、すべての設定を以下に示す値に調整します。

  • 「Image height (画像の高さ)」を「32」に設定します。
  • 「Image width (画像の幅)」を「32」に設定します。
  • 「Channels (チャネル)」を「1」に設定します。なぜなら、画像はグレースケールだからです。
  • 「Tensor dimensionality (テンソルの次元)」を「channels_last」に設定します。
  • 「Classes (クラス数)」を「2」に設定します。署名の画像を本物と偽造の 2 つのクラスに分類するためです。
  • 「Data format (データ形式)」を「Python Pickle」に設定します。
  • 「Epochs (エポック数)」を「100」に設定します。これは、データを学習し、重みを調整して精度を高めるためにニューラル・ネットワークでデータを繰り返し処理する回数を意味します。
  • 「Batch size (バッチ・サイズ)」を「16」に設定します。これはニューラル・ネットワークに入力して同時に処理する画像の数を意味します。

以上の設定が完了したら、「Close (閉じる)」をクリックして設定を保存し、右側のサイドバーを閉じます。

018
018

次は、ニューラル・ネットワークの作成に取り掛かりましょう。最初に追加する層は、2D 畳み込み層です。左側のサイドバーにある「Convolution (畳み込み)」セクションから「Conv 2D (2D 畳み込み)」ノードを選択し、キャンバスにドラッグしてドロップします。

注: ここに示すしてあるのはアーキテクチャーの一例です。別のノードや、より高度なノードを自由に選んで試してください。
019
019

2 つのノードを接続した後、「Conv 2D (2D 畳み込み)」ノードをダブルクリックし、そのプロパティーを編集します。右側のサイドバーで、設定を次のように変更します。

  • 「Number of filters (フィルター数)」を「32」に設定します。これは、所定の画像内で検出する特徴マップの数を意味します。
  • 「Kernel row (カーネル行)」を「3」に設定します。これは、画像全体を移動して特徴検出を行うフィルター (枠のようなもの) の幅を意味します。
  • 「Kernel col (カーネル列)」を「3」に設定します。これは、フィルターの高さを意味します。
  • 「Stride row (ストライド行)」を「1」に設定します。これは、フィルターの水平方向の移動量を意味します。
  • 「Stride col (ストライド列)」を「1」に設定します。これは、フィルターの垂直方向の移動量を意味します。
020
020

「Conv 2D (2D 畳み込み)」ノードのプロパティーの編集を続けます。

  • 「Weight LR multiplier (重み LR の乗数)」を「10」に設定します。これは、学習レートで乗算する値を意味します (学習レートは、後ほどニューラル・ネットワーク・ハイパーパラメーターで定義します)。この乗数を導入するわけは、層ごとに学習レートの値を変更するためです。
  • 「Weight decay multiplier (重み減衰の乗数)」を「1」に設定します。これは、減衰で乗算する値を意味します (減衰は、後ほどニューラル・ネットワーク・ハイパーパラメーターで定義します)。この乗数を導入するわけは、層ごとに重みの減衰レートを変更するためです。
  • 「Bias LR multiplier (バイアス LR の乗数)」を「10」に設定します。
  • 「Bias decay multiplier (バイアス減衰の乗数)」を「1」に設定します。

ここで編集したのは必須パラメーターのみです。初期の重み値を設定する「Initialization (初期化)」など、他の省略可能なパラメーターにはデフォルトの設定を使用しています。バイアスの初期値を設定して、トレーニング可能かどうかを設定することもできます。また、過剰適合を最小限にしてモデルの汎化を強化するような正規化手法を選択することもできます。正規化によって大きい重みにペナルティーを科し、複雑度の低い小さい重みに重点を置くことで、データをより正確に説明できるようになるため、モデルの汎化を促進できます。

以上の設定が完了したら、「Close (閉じる)」をクリックして設定を保存し、右側のサイドバーを閉じます。

021
021

3 つ目のノードを追加します。これは、アクティベーション層を表します。このアーキテクチャーではアクティベーション関数として ReLU (正規化線形関数) を使用することにします。ReLU は一般に優れた結果を出すことから、畳み込みニューラル・ネットワークで広く使用されています。

「ReLU」ノードをキャンバスにドラッグしてドロップしてください。このノードは、左側のサイドバーにある「Activation (アクティベーション)」セクションで見つかります。

022
022

さらに畳み込み層を追加します。左側のサイドバーにある「Convolution (畳み込み)」セクションから「Conv 2D (2D 畳み込み)」ノードをドラッグしてキャンバスにドロップしてください。ノードをドロップした後、必ずノード同士を接続してください。

023
023

2 つ目の「Conv 2D (2D 畳み込み)」ノードのプロパティーを編集できるよう、このノードをダブルクリックして右側のサイドバーを表示します。設定を次のように変更します。

  • 「Number of filters (フィルター数)」を「64」に設定します。
  • 「Kernel row (カーネル行)」を「3」に設定します。
  • 「Kernel col (カーネル列)」を「3」に設定します。
  • 「Stride row (ストライド行)」を「1」に設定します。
  • 「Stride col (ストライド列)」を「1」に設定します。
024
024

「Conv 2D (2D 畳み込み)」ノードのプロパティーの編集を続けます。

  • 「Weight LR multiplier (重み LR の乗数)」を「1」に設定します。
  • 「Weight decay multiplier (重み減衰の乗数)」を「1」に設定します。
  • 「Bias LR multiplier (バイアス LR の乗数)」を「1」に設定します。
  • 「Bias decay multiplier (バイアス減衰の乗数)」を「1」に設定します。

以上の設定が完了したら、「Close (閉じる)」をクリックして設定を保存し、右側のサイドバーを閉じます。

025
025

別のアクティベーション層を追加します。左側のサイドバーにある「Activation (アクティベーション)」セクションから「ReLU」ノードをドラッグしてキャンバスにドロップしてください。

026
026

次は、Max プーリング層を追加します。この層で目的とするのは、前の畳み込み層から抽出された特徴をサンプリングして、その数、つまり次元を集約することです。その方法として、この層では、前の層の出力全体を移動して特定の領域 (枠) 内に最大値を取り込みます。このステップにより、多くの低レベルの特徴を集約して最も優勢な特徴だけを抽出できるため、処理するデータ量を削減できるというわけです。

左側のサイドバーにある「Convolutional (畳み込み)」セクションから「Pool 2D (2D プーリング)」ノードをドラッグしてキャンバスにドロップしてください。

027
027

「Pool 2D (2D プーリング)」ノードをダブルクリックして、プロパティーを編集します。設定を次のように変更します。

  • 「Kernel row (カーネル行)」を「2」に設定します。
  • 「Kernel col (カーネル列)」を「2」に設定します。
  • 「Stride row (ストライド行)」を「1」に設定します。
  • 「Stride col (ストライド列)」を「1」に設定します。

以上の設定が完了したら、「Close (閉じる)」をクリックして設定を保存し、右側のサイドバーを閉じます。

028
028

次に、ドロップアウト層を追加します。この層の目的は過剰適合を減らすことです。その主な手段として、ネットワーク内のニューロンの一部をランダムに破棄または無視します。

左側のサイドバーにある「Core (コア)」セクションから「Dropout (ドロップアウト)」ノードをドラッグしてキャンバスにドロップしてください。

029
029

「Dropout (ドロップアウト)」ノードをダブルクリックし、「Probability (確率)」を「0.25」に変更して「Close (閉じる)」をクリックします。

030
030

次は、すべての層を完全に接続しましょう。それには、これまでに取得したすべての出力を 1D 行列にフラット化する必要があります。

「Core (コア)」セクションから「Flatten (フラット化)」ノードをドラッグしてキャンバスにドロップしてください。

031
031

左側のサイドバーにある「Core (コア)」セクションから「Dense (全結合)」ノードをドラッグしてキャンバスにドロップしてください。

033
033

別の「Dropout (ドロップアウト)」ノードを追加します。この層の「Probability (確率)」を「0.5」に変更して「Close (閉じる)」をクリックします。

034
034

Add another Dropout node. Change the Probability of this layer to 0.5 and click Close.

035
035

最後の「Dense (全結合)」ノードを追加します。これは出力クラスを表すノードです。この例の場合、クラスは 2 つあります。「Dense (全結合)」ノードをダブルクリックして、設定の中のノード数を「2」に変更してから「Close (閉じる)」をクリックします。

036
036

このアーキテクチャーの最後にアクティベーション層を追加しましょう。ここでは、ニューラル・ネットワークの最終層として一般的に使われるソフトマックス関数を使用します。この関数は、最終層に含まれるノードごとに、true と false の値を表す [0, 1] の範囲の出力を返します。

「Softmax (ソフトマックス)」ノードをドラッグしてキャンバスにドロップし、先行するノードに接続します。

037
037

次に必要となるのは、モデルのパフォーマンスを計算する手段です。この計算はコスト関数という形で表され、モデルに予測される出力のエラーをデータセット内の実際のラベルと比較して計算します。ここで目標となるのは、損失をできる限り小さくすることです。分類モデルの損失を計算するために使用できる関数としては、交差エントロピーがあります。

左側のサイドバーにある「Loss (損失)」セクションから「Cross-Entropy (交差エントロピー)」ノードをドラッグしてキャンバスにドロップしてください。

038
038

モデルの予測の精度を計算する別のノードを追加します。左側のサイドバーにある「Metrics (指標)」セクションから「Accuracy (精度)」ノードをドラッグしてキャンバスにドロップしてください。

039
039

「Cross-Entropy (交差エントロピー)」ノードと「Accuracy (精度)」ノードの両方を「Softmax (ソフトマックス)」ノードに接続します。この 2 つのノードが、モデルの出力に対して計算を行います。

040
040

最後に、最適化アルゴリズムを追加します。このアルゴリズムが、損失を最小限にするためにモデルのパラメーターをどのように微調整するかを定義します。さまざまな最適化アルゴリズムがありますが、この例では Adam 最適化ツールを使用します。これは概して有効に機能する最適化アルゴリズムであり、限られた時間内で最良の結果を導き出します。

左側のサイドバーにある「Optimizer (最適化ツール)」セクションから「Adam」ノードをドラッグしてキャンバスにドロップしてください。

041
041

「Adam」ノードをダブルクリックして、このノードの設定を次のように変更します。

  • 「Learning rate (学習レート)」を「0.001」に設定します。
  • 「Decay (減衰)」を「0」に設定します。トレーニングの繰り替えし中にモデルが収束またはグラウンド・トゥルース値に近づくにつれ、減衰により、学習レートの値が小さくなっていきます。けれども Adam 最適化ツールでは、この値を設定する必要はありません。Adam は学習レートをトレーニング中に変更するためです。つまり、SGD などの他の最適化アルゴリズムとは異なり、減衰の値は固定されません。

他のパラメーター (Beta_1 と Beta_2) を使用する理由は、Adam アルゴリズムでは、勾配の指数関数的移動平均とその二乗が更新されるためです。これらの移動平均の指数関数的減衰率を、この 2 つのパラメーターで制御します。移動平均自体は、勾配の最初のモーメント (中央値) と 2 番目のロー・モーメント (修正されていない変動) の推定値です [2]。

パラメーター Beta_1 および Beta_2 は、すでにデフォルト値の「0.9」と「0.999」にそれぞれ設定されています。これらの値は、コンピューター・ビジョンの問題には適切なものです。

042
042

3. Neural Network Modeler からモデルを公開し、Experiments を使用してトレーニングする

ニューラル・ネットワークのアーキテクチャーが仕上がったので、次は、モデルをデータセットでトレーニングして、そのパフォーマンスを評価しましょう。この作業は Watson Studio の Neural Network Modeler インターフェースから直接行うことができます。

上部のツールバーから「Publish training definition (トレーニング定義を公開)」タブを選択してクリックします。

043
043

後で識別できるように、モデルに名前を付けます。(IBM Cloud カタログの) Watson Machine Learning サービスがプロジェクトに関連付けられている必要があります。そうでない場合は、その場でプロジェクトに関連付けるよう求めるメッセージが表示されるので、そのメッセージ内の「Settings (設定)」リンクをクリックします。

044
044

プロジェクトの設定ページにリダイレクトされます。このページで、現在のプロジェクトに関連付けられているすべてのサービスと設定を管理できます。「Associated Services (関連付けられているサービス)」セクションまでスクロールダウンして、「Add service (サービスを追加)」をクリックし、ドロップダウン・リストから「Watson」を選択します。

045
045

利用可能なすべての Watson サービスが表示されます。その中から「Machine Learning」を選択して、「Add (追加)」をクリックします。

046
046

実行中の Machine Learning サービス・インスタンスがまだない場合は、「New (新規)」項目を選択し、その場でインスタンスを作成してください。

047
047

「前提条件」セクションに従って Machine Learning サービス・インスタンスを実行中の状態にしてある場合は、「Existing (既存)」項目を選択し、ドロップダウン・リストから該当するサービスを選択します。

048
048

プロジェクトの設定ページに再びリダイレクトされます。上部のバーにある「Assets (アセット)」をクリックして、Watson Studio 上のメイン・ダッシュボードに戻ってください。「Modeler flows (Modeler フロー)」セクションまでスクロールダウンし、指定した名前に従って、前のセクションで取り組んだフローを選択します。

049
049

フローがロードされたら、上部のツールバーにある「Publish training definition (トレーニング定義を公開)」を再度クリックします。

050
050

モデルに名前が付けられていること、Machine Learning サービスが検出されて選択された状態になっていることを確認してから「Publish (公開)」をクリックします。

051
051

トレーニング定義が公開されると、画面の上部に通知が表示され、そこに Experiments 内でモデルをトレーニングするためのリンクが示されます。このリンクをクリックしてください。

052
052

これから、新しい実験を作成します。まず、実験に名前を付けて、Machine Learning サービスを選択します。最後に、データのソースとトレーニングの結果を保管する場所を定義する必要があります。

「Select (選択)」をクリックし、データセットが格納されているバケットを選択します。

053
053

これまでチュートリアルの手順に従っていれば、Object Storage への既存の接続が設定されているはずです。ドロップダウン・リストから、その接続を選択します。

054
054

データセットが格納されているバケットを選択します。それには、「Existing (既存)」ラジオ・ボタンを選択し、このチュートリアルのステップ 1 でデータを保管したバケットの名前を選択します。最後にページの下部にある「Select (選択)」をクリックします。

055
055

新しい実験の詳細ページに再びリダイレクトされます。トレーニング結果を保管する場所を選択するために、「Select (選択)」をクリックします。

056
056

前のステップと同じように、「Existing connection (既存の接続)」を選択し、ドロップダウン・リストから Object Storage 接続を選択します。次に、「New (新規)」ラジオ・ボタンを選択して、結果を保管するバケットを選択し、IBM Cloud Object Storage でグローバルに一意の名前を付けます。最後にページの下部にある「Select (選択)」をクリックします。

注: データセットを保管するバケットとトレーニング結果を保管するバケットは別々のものにすることをお勧めします。
057
057

新しい実験の詳細ページに戻って、ページの右側にある「Add training definition (トレーニング定義を追加)」リンクをクリックしましょう。

058
058

トレーニング定義はすでに Neural Network Modeler から公開しているので、「Existing training definition (既存のトレーニング定義)」項目を選択します。

059
059

ドロップダウン・リストから、前に付けた名前に従ってトレーニング定義を選択します。最後にページの下部にある「Select (選択)」をクリックします。

060
060

モデルのトレーニングに使用するハードウェアの設定を構成しましょう。無料枠の (Lite) アカウントを使用している場合、「Compute Plan (計算プラン)」ドロップダウン・リストの最初の項目にアクセスできます。

061
061

「Hyperparameter Optimization Method (ハイパーパラメーター最適化手法)」には、今のところは「None (なし)」を選択します。次のステップで Neural Network Modeler ではなく Keras コードを使用してトレーニング定義を作成するときに、この設定を再び構成します。最後にページの下部にある「Select (選択)」をクリックします。

062
062

新しい実験の詳細ページにリダイレクトされます。このページにリダイレクトされるのはこれが最後です。選択内容に何も問題がないことを確認してから、ページの下部にある「Create and run (作成して実行)」をクリックしてください。

063
063

モデルのトレーニングが開始され、トレーニング・プロセスの詳細を確認するとともにモデルをモニタリングできるビューが表示されます。

064
064

モデルのトレーニングが完了すると、ページの下部にある「Completed (完了済み)」セクションにモデルとそのトレーニング結果の詳細がリストアップされます。

065
065

モデルが満足できるものであれば、本番環境にモデルを移し、新しい画像でモデルを実際に実行して評価できます。そのための最初のステップは、「Actions (アクション)」タブにある縦に 3 つ並んだドットをクリックし、「Save Model (モデルの保存)」を選択することです。保存後のモデルは、Watson Studio プロジェクトのメイン・ダッシュボード内にある「Models (モデル)」セクションで見つかります。そこから、モデルを REST API としてデプロイすることができます。

066
066

4. エキスパート向け: 独自のモデルをコーティングし、Experiments 内でトレーニングしてハイパーパラメーター最適化を利用する

アーキテクチャー、モデル、ハイパーパラメーターを可能な限りきめ細かに制御したいとしたら、独自のコード・ファイルを Experiments インポートしてトレーニングするという手があります。

Watson Studio Experiments には次の魅力があります。

  • クラウド上の強力なハードウェアを利用できるため、ハードウェアやソフトウェアをセットアップする必要がありません。つまり、Watson Studio は Deep Learning as a Service (DLaaS) として利用できるということです。
  • 複数の実験を同時に実行できます。
  • 各種のハイパーパラメーターに対する一連の値を Watson Studio に渡すことで、ハイパーパラメーター最適化を利用できます。Watson Studio はさまざまに異なるハイパーパラメーター設定を使用して複数のモデル・バリアントを作成し、各バリアントをコンテナーにパッケージ化して Kubernetes クラスター上にデプロイします。これらすべてのモデル・バリアントが並行して実行されて、Kuberenetes で各バリアントのパフォーマンスをリアルタイムでモニタリングします。トレーニング・プロセスの終わりには、さまざまな実行のパフォーマンスに関する詳細とともに、各実行で使用されたハイパーパラメーターの詳細を確認できます。
  • 計算を駆使するトレーニング・ワークロードを分散型深層学習でトレーニングすることで、複数のサーバーにワークロードを分割してトレーニングを飛躍的に加速化できます。
注: この機能についてはチュートリアルで取り上げませんが、このリンク先の Watson Studio ドキュメントで詳細を確認できます。

まずは、コードに取り組みましょう。

モデルをゼロから作成するには、TensorFlowKeras?PyTorchCaffe などのサポートされている深層学習フレームワークを使用できます。別の方法としては、ここで説明するように、任意のフレームワーク・コードを使用して Watson Studio の Neural Network Modeler に自動的にコードを生成させて、そのコードに変更を加えることもできます。

前に作成したニューラル・ネットワーク・フローを開いてください。上部のツールバーにある「Download (ダウンロード)」タブをクリックし、ドロップダウン・リストから任意のフレームワークを選択します。このチュートリアルでは Keras コードを使用します。

067
067

コードがローカル・マシン上の zip フォルダー内にダウンロードされます。フォルダー内には keras_helper.pykeras_driver.py という 2 つのファイルが格納されているはずです。

注: zip フォルダーとそこに格納されているファイルの名前は、上述の名前とは異なる場合があります。
63
63

モデルを処理するコードは keras_driver.py ファイル内にあるので、任意のコード・エディターでこのファイルを開きます。

コードにいくつかの変更を加えて、Watson Studio の Experiments HPO に接続できるようにします。

最初の変更として、ライブラリーをインポートします。コードの import セクション内に以下の行を追加します。

import json
from os import environ
from emetrics import EMetrics

emetrics インポートは、これと同じ名前の python スクリプトを参照します。このスクリプトはチュートリアルに付属の assets フォルダー内にあり、「前提条件」セクションですでにダウンロードしてあります。emetrics スクリプトは、モデルの結果をログに書き込んで、Watson Studio インターフェースが期待する形にフォーマット化します。

次は、imports セクションの直下に以下のコード・ブロックを追加します。

###############################################################################
# Set up working directories for data, model and logs.
###############################################################################
model_filename = "SignatureFraud.h5"

# writing the train model and getting input data
if environ.get('RESULT_DIR') is not None:
    output_model_folder = os.path.join(os.environ["RESULT_DIR"], "model")
    output_model_path = os.path.join(output_model_folder, model_filename)
else:
    output_model_folder = "model"
    output_model_path = os.path.join("model", model_filename)

os.makedirs(output_model_folder, exist_ok=True)


###############################################################################
# Set up HPO.
###############################################################################

config_file = "config.json"

if os.path.exists(config_file):
    with open(config_file, 'r') as f:
        json_obj = json.load(f)
    if "initial_learning_rate" in json_obj:
        learning_rate = json_obj["initial_learning_rate"]
    else:
        learning_rate = 0.001000
    if "batch_size" in json_obj:
        batch_size = json_obj["batch_size"]
    else:
        batch_size = 16
    if "num_epochs" in json_obj:
        num_epochs = json_obj["num_epochs"]
    else:
        num_epochs = 100
    if "decay" in json_obj:
        decay = json_obj["decay"]
    else:
        decay = 0.100000
    if "beta_1" in json_obj:
        beta_1 = json_obj["beta_1"]
    else:
        beta_1 = 0.900000
    if "beta_2" in json_obj:
        beta_2 = json_obj["beta_2"]
    else:
        beta_2 = 0.999000  
else:
    learning_rate = 0.001000
    batch_size = 16
    num_epochs = 100
    decay = 0.100000
    beta_1 = 0.900000
    beta_2 = 0.999000

def getCurrentSubID():
    if "SUBID" in os.environ:
        return os.environ["SUBID"]
    else:
        return None

class HPOMetrics(keras.callbacks.Callback):
    def __init__(self):
        self.emetrics = EMetrics.open(getCurrentSubID())

    def on_epoch_end(self, epoch, logs={}):
        train_results = {}
        test_results = {}

        for key, value in logs.items():
            if 'val_' in key:
                test_results.update({key: value})
            else:
                train_results.update({key: value})

        #print('EPOCH ' + str(epoch))
        self.emetrics.record("train", epoch, train_results)
        self.emetrics.record(EMetrics.TEST_GROUP, epoch, test_results)

    def close(self):
        self.emetrics.close()


# Perform data pre-processing
defined_metrics = []
defined_loss = []

このコード・ブロックの主な役割は、モデルの結果を格納する宛先フォルダーを定義し、トレーニング済みのモデルを保存してログを書き込むことです。さらに、Watson Studio の Experiment HPO インターフェースから渡されるデータを受け取る役割も果たします。インターフェース内に用意されているハイパーパラメーターは config_file 内に保管されています。この config_file を使用してハイパーパラメーターの値を抽出して変数に格納し、モデルでこれらの値にアクセスできるようにします。

重要な注意事項: これ以降、ハイパーパラメーター変数を再定義したり、変数に新しい値を代入したりする場合は、コード行が一切競合しないようにしてください。コード行が競合すると、HPO が正常に機能しません。

以下のコード・ブロックを見つけてください。

model_inputs = [ImageData_1]
model_outputs = [Softmax_12]
model = Model(inputs=model_inputs, outputs=model_outputs)

上記のコード・ブロックを以下のコード・ブロック全体で置き換えます。

# Starting Hyperparameter Optimization
hpo = HPOMetrics()

# Define optimizer
optim = Adam(lr=learning_rate, beta_1=beta_1, beta_2=beta_2, decay=decay)

# Perform training and other misc. final steps
model.compile(loss=defined_loss, optimizer=optim, metrics=defined_metrics)
if len(model_outputs) > 1:
    train_y = [train_y] * len(model_outputs)
    if len(val_x) > 0: val_y = [val_y] * len(model_outputs)
    if len(test_x) > 0: test_y = [test_y] * len(model_outputs)

# Writing metrics
log_dir = os.environ.get("LOG_DIR")
sub_id_dir = os.environ.get("SUBID")
static_path_train = os.path.join("logs", "tb", "train")
static_path_test = os.path.join("logs", "tb", "test")
if log_dir is not None and sub_id_dir is not None:
    tb_directory_train = os.path.join(log_dir, sub_id_dir, static_path_train)
    tb_directory_test = os.path.join(log_dir, sub_id_dir, static_path_test)

    tensorboard_train = TensorBoard(log_dir=tb_directory_train)
    tensorboard_test = TensorBoard(log_dir=tb_directory_test)
else:
    tb_directory_train = static_path_train
    tb_directory_test = static_path_test

    tensorboard_train = TensorBoard(log_dir=tb_directory_train)
    tensorboard_test = TensorBoard(log_dir=tb_directory_test)

if (len(val_x) > 0):
    history = model.fit(
        train_x,
        train_y,
        batch_size=batch_size,
        epochs=num_epochs,
        verbose=1,
        validation_data=(val_x, val_y),
        shuffle=True,
        callbacks=[tensorboard_train, tensorboard_test, hpo])
else:
    history = model.fit(
        train_x,
        train_y,
        batch_size=batch_size,
        epochs=num_epochs,
        verbose=1,
        shuffle=True,
        callbacks=[tensorboard_train, tensorboard_test, hpo])

hpo.close()

#print("Training history:" + str(history.history))

if (len(test_x) > 0):
    test_scores = model.evaluate(test_x, test_y, verbose=1)
    #print(test_scores)
    print('Test loss:', test_scores[0])
    print('Test accuracy:', test_scores[1])

model.save(output_model_path)
print("Model saved in file: %s" % output_model_path)

コードの末尾はこのコード・ブロックになるはずです。

以上の変更で導入したのは、emetrics ヘルパー・モジュールをモデルに接続する手段です。これにより、モデルのトレーニング履歴を読み取ることも、トレーニングのログを書き込んで保存することもできるようになりました。また、この変更により、モデルのパフォーマンスを測定する手段としてモデル・トレーニングの各ステップでの精度を格納する val_dict.json も作成されます。この val_dict.json ファイルを Watson Studio のインターフェースで使用して、異なるハイパーパラメーターを設定したさまざまなトレーニング実行のパフォーマンスを表示し、比較できるようにします。

参考として keras_driver.py 内の完全なコードを確認するには、このリンク先の keras_driver.py にアクセスしてください。

コードを Watson Studio Experiments にアップロードするには、コードを zip フォルダーに圧縮する必要があります。フォルダーには次のファイルを含めます。

  • 上記で変更を加えた keras_driver.py
  • keras_helper.py
  • emetrics.py: このチュートリアルに付属の assets フォルダー内にあるもの
  • training_data.pickle: 同上
  • validation_data.pickle: 同上
  • test_data.pickle: 同上

すべてのファイルを zip フォルダー内に揃えたら、Watson Studioに切り替えてトレーニング・プロセスを開始できます。

Watson Studio のメイン・ダッシュボードで、「Experiments (実験)」セクションまでスクロールダウンし、「New experiment (新しい実験)」をクリックします。

068
068

新しく作成する実験に名前を付けます。Machine Learning サービスが選択されていることを確認して、ステップ 3 と同じようにセットとトレーニング結果を格納するバケットを選択します。

069
069

画面右側にある「Add training definition (トレーニング定義を追加)」をクリックします。

070
070

「New training definition (新しいトレーニング定義)」項目を選択し、トレーニング定義に名前を付けてから、前に準備したコード・ファイルとデータセットが含まれる zip フォルダーをドラッグ・アンド・ドロップします。

071
071

トレーニングに使用するフレームワークを選択します。この例では Keras コードを作成しました。Keras は Tensorflow をベースに動作するため、ドロップダウン・リストから「TensorFlow」項目を選択します。

実行コマンドとして pythonkeras-code/keras_driver.py というコードを作成します。このコードは、ターミナルからローカルでコードを実行する方法と同様です。

「Compute plan (計算プラン)」を選択し、「Hyperparameter optimization method (ハイパーパラメーター最適化手法)」として「RBFOpt」、「Number of optimizer steps (最適化ツールのステップ数)」として「100」、「Objective (目標)」として「accuracy (精度)」を選択します。「Maximize or minimze (最大化または最小化)」フィールドでは「maximize (最大化)」を選択します。最後に、「Add hyperparameter (ハイパーパラメーターを追加)」をクリックします。

072
072

最初のパラメーターを追加して名前を付けましょう。注: config.json 内で定義されている名前と完全に一致する名前にしてください。ハイパーパラメーター値を抽出した keras_driver.py 内のコード・ブロックを参照すると、該当する名前を確認できます。ハイパーパラメーターの名前として「initial_learning_rate」と入力します。この例では異なる値を追加するので、「Distinct value(s) (個別の値)」ラジオ・ボタンを選択します。最後に、トレーニング中にモデルに選択させる値を入力します。ここでは、値として「0.0001,0.0003,0.001」と入力しています。設定が完了したら、画面下部にある「Add and Create another (追加してさらに作成)」をクリックします。

073
073

次のハイパーパラメーターでは、「Name (名前)」フィールドに「batch_size」と入力します。今回は、事前定義されているステップを使用して値の範囲を追加するため、「Range (範囲)」ラジオ・ボタンを選択します。「Lower bound (下限)」として「8」と入力し、「Upper bound (上限)」として「32」と入力します。「Traverse (トラバース)」手法としては「Step (ステップ)」を選択し、「Step (ステップ)」の値として「8」を入力します。最後に、「Add and Create another (追加してさらに作成)」をクリックします。

074
074

最後のハイパーパラメーターを追加しましょう。このハイパーパラメーターの「Name (名前)」フィールドには「num_epochs」と入力します。「Distinct value(s) (個別の値)」ラジオ・ボタンを選択して「Value(s) (値)」フィールドに「100,200」と入力します。最後にページの下部にある「Add (追加)」をクリックします。他にもハイパーパラメーターを追加する場合は (decay、beta_1、beta_2、dropout_1、dropout_2 など)、前と同じように「Add and Create another (追加してさらに作成)」をクリックしてください。

075
075

トレーニング定義の詳細ページに戻り、すべての設定を調べて必要な詳細のすべてが指定されていることを確認したら、ページの下部にある「Create (作成)」をクリックします。

いつでもトレーニング定義を追加して、すべてのトレーニング定義を同時に実行することができます。

076
076

新しく作成した実験の詳細ページにリダイレクトされます。すべての設定が揃っていることを確認したら、ページの下部にある「Create and run (作成して実行)」をクリックします。

077
077

Watson Studio が、トレーニング実行ごとにハイパーパラメーターに指定された異なる値を使用して、さまざまなトレーニング実行を作成します。これらのトレーニングは並行して実行され、リアルタイムの進捗状況が表示されます。トレーニングが完了すると、すべての実行がそれぞれのパフォーマンスの詳細と併せて一覧表示されます。上部のバーにある「Compare Runs (実行の比較)」をクリックすると、各モデルのパフォーマンスの概要と、そのモデルに使用されたハイパーパラメーターが表示されます。

078
078

トレーニングのすべてのイテレーションにわたるモデルの履歴とパフォーマンスのグラフを表示することもできます。

079
079
080
080

各モデルのパフォーマンスを調べて、特定のモデルに満足した場合は、そのモデルを保存して、デプロイメントと評価に使用できる状態にすることができます。

まとめ

このチュートリアルでは、Watson Studio 上に用意されている強力な深層学習ツールについて説明しました。そのうちの 1 つ、Neural Network Modeler を使用すると、ニューラル・ネットワーク・アーキテクチャーのプロトタイプを迅速に作成できることがわかったはずです。また、ニューラル・ネットワーク・フローを公開して、Experiments を使用してトレーニングする方法も説明しました。さらに、Experiments と HPO を使用して、独自のコードをインポートする方法、そのモデルをトレーニングして最適化する方法、モデルのパフォーマンスをモニタリングする方法も説明しました。

参考資料

  1. Marcus Liwicki、Muhammad Imran Malik、Linda Alewijnse、Elisa van den Heuvel、Bryan Found 共著「ICFHR2012 Competition on Automatic Forensic Signature Verification (4NsigComp 2012)」、Proc. 13th Int. Conference on Frontiers in Handwriting Recognition、2012 年
  2. Diederik P. Kingma、Jimmy Ba 共著「Adam: A Method for Stochastic Optimization」、3rd International Conference for Learning Representations, San Diego、2015 年
  3. 深層学習に関する IBM Watson Studio ドキュメント (https://dataplatform.cloud.ibm.com/docs/content/analyze-data/ml_dlaas.html?context=analytics)
  4. IBM Watson Studio: Coding guidelines for deep learning programs (https://dataplatform.cloud.ibm.com/docs/content/analyze-data/ml_dlaas_code_guidelines.html)

ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=ビジネス・アナリティクス, Cognitive computing, Cloud computing
ArticleID=1066139
ArticleTitle=Watson Studio の Neural Network Modeler と Experiments を利用した深層学習モデル
publish-date=06272019