[[208000]] ご存知のとおり、Keras-Python ライブラリを使用すると、独自のディープラーニング モデルをすばやく簡単に作成できます。今日は、よく使用される API 関数のいくつかを紹介します。 Sequential API を使用すると、ほとんどの問題に対してレイヤーごとにモデルを作成できます。制限としては、複数の入力または出力を持つ共有レイヤーまたはモデルを作成できないことです。 Keras の API 関数は、より複雑なモデルの作成など、より柔軟なモデルを作成するための代替手段です。 このブログ記事では、Keras の柔軟な API 関数を使用してディープラーニング モデルを定義する方法について説明します。 これを読めば、次のことがわかります。 - 継続的な API と API 関数の違い。
- API 関数を使用して、単純な多層パーセプトロン、畳み込みニューラル ネットワーク、および再帰型ニューラル ネットワーク モデルを定義する方法。
- 共有レイヤーと複数の入力および出力を使用して、より複雑なモデルを定義する方法。
では、始めましょう。 チュートリアルの概要 このチュートリアルは 6 つのパートに分かれています。 - Keras シーケンシャル モデル。
- Keras 機能モデル。
- 標準ネットワークモデル。
- 共有レイヤーモデル。
- 複数の入力および出力モデル。
- ***練習する。
1. Keras シーケンシャルモデル Keras は、Sequential モデル用の API を提供します。 これはディープラーニング モデルを作成する 1 つの方法であり、Sequential クラスのインスタンスを作成し、モデル レイヤーを作成してそれに追加します。 たとえば、レイヤーを定義して配列として Sequential に渡すことができます。 - keras.modelsからSequentialをインポートする
-
- keras.layersからDenseをインポート
-
- モデル = シーケンシャル([Dense(2, input_dim=1), Dense(1)])
レイヤーはセクションごとに追加することもできます。 - keras.modelsからSequentialをインポートする
-
- keras.layersからDenseをインポート
-
- モデル = シーケンシャル()
-
- モデルを追加します(Dense(2, input_dim=1))
-
- モデル.add (密(1))
Sequential Model API は、ほとんどの場合、ディープラーニング モデルの開発に適していますが、いくつかの制限もあります。たとえば、複数の異なる入力ソースを持つモデルを定義することはできません。複数の出力ターゲットが生成されるためです。 2. Kerasの機能モデル Keras 機能 API は、より柔軟なモデル定義方法を提供します。 複数の入力または出力を持つモデルや、レイヤーを共有できるモデルを定義できます。とりわけ、アドホックな非巡回ネットワーク グラフを定義することができます。 モデルは、レイヤーのインスタンスを作成し、それらをペアで直接接続し、指定されたレイヤーをモデルの入力と出力としてモデルを定義することによって定義されます。 Keras 機能 API の 3 つのユニークな側面を見てみましょう。 2.1 入力の定義 Sequential モデルとは異なり、入力データの形状を指定する別の入力レイヤーを作成して定義する必要があります。 入力層は、入力データの次元を表すタプルであるモデル パラメータを受け取ります。 入力データが多層パーセプトロンなどの 1 次元の場合、モデルは、データを分割するためにネットワークをトレーニングするときに使用するミニバッチ サイズの形状を明示的に除外する必要があります。したがって、モデルタプルは常に最初の次元 (2) がぶら下がった状態で定義されます。例: - keras.layersから入力をインポート
-
- 可視 = 入力(形状=(2,))
2.2 接続層 モデル内のレイヤーは、各新しいレイヤーを定義するときに入力の取得元を指定することにより、ペアで接続できます。レイヤーを作成した後、括弧表記を使用して現在のレイヤーから次のレイヤーへの入力を指定します。 これを簡単な例で説明してみましょう。上記のように入力層を作成し、入力層からの入力のみを受け取る密な層として隠し層を作成できます。 - keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- 可視 = 入力(形状=(2,))
-
- 隠された = 密(2)(見える)
このレイヤー接続方法により、機能 API の柔軟性が向上します。特殊なグラフィック用のアドホック レイヤーの定義を開始するのがいかに簡単かがわかります。 2.3 モデルの作成 モデルに必要なすべてのレイヤーを作成し、それらを接続したら、次にモデルを定義する必要があります。 Sequential API と同様に、モデルは概要を作成し、適合し、評価し、予測を行うために使用できるものです。 Keras は、作成したレイヤーからモデルを作成するために使用できる Model クラスを提供します。入力層と出力層を指定する必要があります。例えば: - keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- 可視 = 入力(形状=(2,))
-
- 隠された = 密(2)(見える)
-
- model = モデル(入力=表示、出力=非表示)
Keras 機能 API の重要な部分をすべて理解できたので、さまざまなモデルのセットを定義して学習内容を実践してみましょう。 次の各例は実行可能であり、構造を印刷してグラフを作成します。定義を明確にするために、独自のモデルに対してこれを実行することをお勧めします。 これらの例が、将来、機能 API を使用して独自のモデルを定義するためのテンプレートとなることを願っています。 3. 標準ネットワークモデル 機能 API の使用を開始するときは、まず標準的なニューラル ネットワーク モデルの定義を理解することが重要です。このセクションでは、単純な多層パーセプトロン、畳み込みニューラル ネットワーク、および再帰型ニューラル ネットワークの定義を紹介します。 これらの例は、後でより詳細な例を理解するための基礎となります。 3.1 多層パーセプトロン このセクションでは、バイナリ分類用の多層パーセプトロン モデルを定義します。モデルには 10 個の入力、3 つの隠し層、10 個のニューロンがあり、出力層には 1 つの出力があります。各隠れ層では正規化線形活性化関数が使用され、出力層ではバイナリ分類にシグモイド活性化関数が使用されます。 - # 多層パーセプトロン
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- 表示 = 入力(形状=(10,))
-
- hidden1 = Dense(10, activation= 'relu' )(表示)
-
- hidden2 = Dense(20, activation= 'relu' )(hidden1)
-
- hidden3 = Dense(10, activation= 'relu' )(hidden2)
-
- 出力= Dense(1, 活性化 = 'シグモイド' )(hidden3)
-
- model = モデル(入力=可視、出力=出力)
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'multilayer_perceptron_graph.png' )
例を実行すると、ネットワークの構造が出力されます。 - _________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#
- =================================================================
- input_1 (入力レイヤー) (なし、10) 0
- _________________________________________________________________
- 密_1 (密) (なし、10) 110
- _________________________________________________________________
- 密_2 (密) (なし、20) 220
- _________________________________________________________________
- 密_3 (密) (なし、10) 210
- _________________________________________________________________
- 密_4 (密) (なし、1) 11
- =================================================================
- 合計パラメータ: 551
- トレーニング可能なパラメータ: 551
- トレーニング不可能なパラメータ: 0
- _________________________________________________________________
モデル図の作成とファイルへの保存: 3.2 畳み込みニューラルネットワーク このセクションでは、画像分類用の畳み込みニューラル ネットワークを定義します。 モデルは、入力として白黒の 64×64 画像を受け取り、2 つの畳み込み層とプーリング層のシーケンスが特徴抽出器として機能し、その後に特徴を解釈するための完全接続層が続き、出力層はシグモイド活性化関数です。 - # 畳み込みニューラルネットワーク
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layers.convolutionalからConv2D をインポートします
-
- keras.layers.poolingからMaxPooling2D をインポートします
-
- 表示 = 入力(形状=(64,64,1))
-
- conv1 = Conv2D(32, kernel_size=4, activation= 'relu' )(表示)
-
- プール1 = MaxPooling2D(プールサイズ=(2, 2))(conv1)
-
- conv2 = Conv2D(16, kernel_size=4, activation= 'relu' )(pool1)
-
- プール2 = MaxPooling2D(プールサイズ=(2, 2))(conv2)
-
- hidden1 = Dense(10, activation= 'relu' )(pool2)
-
- 出力= Dense(1, activation= 'sigmoid' )(hidden1)
-
- model = モデル(入力=可視、出力=出力)
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'convolutional_neural_network.png' )
例を実行する: - _________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#
-
- =================================================================
-
- input_1 (入力レイヤー) (なし、64、64、1) 0
-
- ••••••
-
- 合計パラメータ: 8,933
-
- トレーニング可能なパラメータ: 8,933
-
- トレーニング不可能なパラメータ: 0
-
- ________________________________________________________________
モデル グラフのグラフが作成され、ファイルに保存されます。 3.3 リカレントニューラルネットワーク このセクションでは、シーケンス分類用の LSTM 再帰型ニューラル ネットワークを定義します。 モデルには 100 タイム ステップが入力として供給され、シーケンスから特徴を抽出するための単一の LSTM 隠し層、LSTM 出力を解釈するための完全接続層、バイナリ予測を行うための出力層が続きます。 - # リカレントニューラルネットワーク
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layers.recurrentからLSTM をインポートします
-
- 表示 = 入力(形状=(100,1))
-
- 隠し1 = LSTM(10)(可視)
-
- hidden2 = Dense(10, activation= 'relu' )(hidden1)
-
- 出力= Dense(1, activation= 'sigmoid' )(hidden2)
-
- model = モデル(入力=可視、出力=出力)
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'recurrent_neural_network.png' )
例を実行すると、モデル レイヤーが要約されます。 - _________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#
-
- =================================================================
-
- •••••••
-
- =================================================================
-
- 合計パラメータ: 601
-
- トレーニング可能なパラメータ: 601
-
- トレーニング不可能なパラメータ: 0
-
- _________________________________________________________________
モデル図の作成とファイルへの保存: 4. 共有レイヤーモデル 複数のレイヤーが 1 つのレイヤーの出力を共有できます。 たとえば、入力から複数の異なる特徴抽出レイヤーが存在する場合や、特徴抽出レイヤーの出力を解釈するための複数のレイヤーが存在する場合があります。 これら2つの例を見てみましょう。 4.1 共有入力層 このセクションでは、異なるサイズのカーネルを使用して複数の畳み込み層を定義し、画像入力を解釈します。 モデル入力は、サイズが 64×64 ピクセルの白黒画像です。この入力を共有する CNN 特徴抽出サブモデルが 2 つあります。1 つ目はカーネル サイズ 4、2 つ目はカーネル サイズ 8 です。これらの特徴抽出サブモデルの出力はベクトルに平坦化され、1 つの長いベクトルに連結され、最終出力層の前にバイナリ分類のために完全に接続された層に渡されます。 - # 共有入力レイヤー
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layersからフラット化をインポートする
-
- keras.layers.convolutionalからConv2D をインポートします
-
- keras.layers.poolingからMaxPooling2D をインポートします
-
- keras.layers.mergeからインポートして連結する
-
- # 入力レイヤー
-
- 表示 = 入力(形状=(64,64,1))
-
- #最初の特徴抽出器
-
- conv1 = Conv2D(32, kernel_size=4, activation= 'relu' )(表示)
-
- プール1 = MaxPooling2D(プールサイズ=(2, 2))(conv1)
-
- flat1 = フラット化()(pool1)
-
- # 2 番目の特徴抽出器
-
- conv2 = Conv2D(16, kernel_size=8, activation= 'relu' )(表示)
-
- プール2 = MaxPooling2D(プールサイズ=(2, 2))(conv2)
-
- flat2 = フラット化()(pool2)
-
- # 特徴抽出器をマージする
-
- マージ = 連結([flat1, flat2])
-
- # 解釈レイヤー
-
- hidden1 = Dense(10, activation= 'relu' )(マージ)
-
- # 予測出力
-
- 出力= Dense(1, activation= 'sigmoid' )(hidden1)
-
- model = モデル(入力=可視、出力=出力)
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'shared_input_layer.png' )
例を実行すると、モデル レイヤーが要約されます。 - ___________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#接続先
-
- ===================================================================
-
- •••••••••••••••••••••••
-
- 合計パラメータ: 415,045
-
- トレーニング可能なパラメータ: 415,045
-
- トレーニング不可能なパラメータ: 0
-
- ___________________________________________________________________
モデル グラフが作成され、ファイルに保存されます。 4.2 共有特徴抽出層 このセクションでは、2 つの並列サブモデルを使用して、シーケンス分類用の LSTM 特徴抽出器の出力を解釈します。 モデルへの入力は 100 個の特徴を持つタイム ステップであり、10 個のメモリ セルを持つ LSTM レイヤーがシーケンスを解釈します。最初の解釈モードは浅い単一の完全接続層であり、2 番目は深い 3 層モデルです。両方の説明モデルの出力は長いベクトルに連結され、バイナリ予測を行うために出力層に渡されます。 - # 共有特徴抽出レイヤー
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layers.recurrentからLSTM をインポートします
-
- keras.layers.mergeからインポートして連結する
-
- #入力を定義する
-
- 表示 = 入力(形状=(100,1))
-
- # 特徴抽出
-
- extract1 = LSTM(10)(可視)
-
- #最初の解釈モデル
-
- interp1 = Dense(10, activation= 'relu' )(extract1)
-
- # 2番目の解釈モデル
-
- interp11 = Dense(10, activation= 'relu' )(extract1)
-
- interp12 = Dense(20, activation= 'relu' )(interp11)
-
- interp13 = Dense(10, アクティベーション= 'relu' )(interp12)
-
- # マージ解釈
-
- マージ = 連結([interp1, interp13])
-
- #出力
-
- 出力= Dense(1, activation= 'sigmoid' )(merge)
-
- model = モデル(入力=可視、出力=出力)
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'shared_feature_extractor.png' )
例を実行すると、モデル レイヤーが要約されます。 - ___________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#接続先
-
- •••••••
-
- 合計パラメータ: 1,151
-
- トレーニング可能なパラメータ: 1,151
-
- トレーニング不可能なパラメータ: 0
-
- ___________________________________________________________________
モデル図が作成され、ファイルに保存されます。 5. 複数の入力および出力モデル 機能 API は、複数の入力 (場合によっては異なるモダリティ) を持つ、より複雑なモデルを開発するためにも使用できます。複数の出力を生成するモデルの開発にも使用できます。 このセクションでは、それぞれの例を見ていきます。 5.1 マルチ入力モデル それぞれ異なるサイズの 2 つのバージョンの画像を入力として受け取る画像分類モデルを開発します。具体的には、64×64の白黒バージョンと32×32のカラーバージョンです。それぞれに対して個別の特徴抽出 CNN モデルが実行され、両方のモデルの結果が連結されて解釈と最終的な予測が行われます。 Model() インスタンスを作成するときに、2 つの入力レイヤーを配列として定義したことに注意してください。 - モデル = モデル(入力=[visible1, visible2], 出力= output )
完全な例を以下に示します。 - # 複数入力
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layersからフラット化をインポートする
-
- keras.layers.convolutionalからConv2D をインポートします
-
- keras.layers.poolingからMaxPooling2D をインポートします
-
- keras.layers.mergeからインポートして連結する
-
- #最初の入力モデル
-
- visible1 = 入力(形状=(64,64,1))
-
- conv11 = Conv2D(32, kernel_size=4, activation= 'relu' )(visible1)
-
- pool11 = MaxPooling2D(pool_size=(2, 2))(conv11)
-
- conv12 = Conv2D(16, kernel_size=4, activation= 'relu' )(pool11)
-
- pool12 = MaxPooling2D(pool_size=(2, 2))(conv12)
-
- flat1 = フラット化()(pool12)
-
- # 2番目の入力モデル
-
- visible2 = 入力(形状=(32,32,3))
-
- conv21 = Conv2D(32, kernel_size=4, activation= 'relu' )(visible2)
-
- pool21 = MaxPooling2D(pool_size=(2, 2))(conv21)
-
- conv22 = Conv2D(16, kernel_size=4, activation= 'relu' )(pool21)
-
- pool22 = MaxPooling2D(pool_size=(2, 2))(conv22)
-
- flat2 = フラット化()(pool22)
-
- # 入力モデルをマージする
-
- マージ = 連結([flat1, flat2])
-
- # 解釈モデル
-
- hidden1 = Dense(10, activation= 'relu' )(マージ)
-
- hidden2 = Dense(10, activation= 'relu' )(hidden1)
-
- 出力= Dense(1, activation= 'sigmoid' )(hidden2)
-
- モデル = モデル(入力=[visible1, visible2], 出力= output )
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'multiple_inputs.png' )
例を実行する: - ___________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#接続先
-
- •••••••••
-
- input_1 (入力レイヤー) (なし、64、64、1) 0
-
- 合計パラメータ: 49,699
-
- トレーニング可能なパラメータ: 49,699
-
- トレーニング不可能なパラメータ: 0
-
- ___________________________________________________________________
モデル図が作成され、ファイルに保存されます。 5.2 マルチ出力モデル このセクションでは、2 つの異なるタイプの予測を行うことができるモデルを開発します。特徴の 100 タイム ステップの入力シーケンスが与えられると、モデルはシーケンスを分類し、同じ長さの新しいシーケンスを出力します。 LSTM レイヤーは入力シーケンスを解釈し、各タイム ステップの隠し状態を返します。最初の出力モデルは、LSTM のスタックを作成し、特徴を解釈して、バイナリ予測を行います。 2 番目の出力モデルは、同じ出力レイヤーを使用して、各入力時間ステップの実数値予測を行います。 - # 複数の出力
-
- keras.utilsからplot_modelをインポートする
-
- keras.modelsからモデルをインポート
-
- keras.layersから入力をインポート
-
- keras.layersからDenseをインポート
-
- keras.layers.recurrentからLSTM をインポートします
-
- keras.layers.wrappersからTimeDistributed をインポートします
-
- # 入力レイヤー
-
- 表示 = 入力(形状=(100,1))
-
- # 特徴抽出
-
- extract = LSTM(10, return_sequences= True )(表示)
-
- # 分類出力
-
- class11 = LSTM(10)(抜粋)
-
- class12 = Dense(10, activation= 'relu' )(class11)
-
- 出力1 = Dense(1, 活性化= 'シグモイド' )(クラス12)
-
- #順序 出力
-
- output2 = TimeDistributed(Dense(1, activation= 'linear' ))(抽出)
-
- #出力
-
- モデル = モデル(入力=可視、出力=[出力1、出力2])
-
- # レイヤーを要約する
-
- 印刷(モデル.要約())
-
- # グラフをプロットする
-
- plot_model(モデル、to_file= 'multiple_outputs.png' )
例を実行します。 - ___________________________________________________________________
-
- レイヤー(タイプ)出力形状パラメータ#接続先
-
- ===================================================================
-
- input_1 (入力レイヤー) (なし、100、1) 0
-
- ___________________________________________________________________
-
- ········
-
- 合計パラメータ: 1,452
-
- トレーニング可能なパラメータ: 1,452
-
- トレーニング不可能なパラメータ: 0
-
- ___________________________________________________________________
モデル図の作成とファイルへの保存: 6.*** 方法 このセクションでは、独自のモデルを定義するときに機能 API を最大限に活用するためのヒントをいくつか紹介します。 - 一貫した変数名。入力層 (visible) と出力層 (output)、さらに隠し層 (hidden1、hidden2) にも同じ変数名を使用します。物事を正しく接続するのに役立ちます。
- レイヤーマップを表示します。常にモデルの概要を印刷し、レイヤーの出力を確認して、モデルが期待どおりに接続されていることを確認します。
- チャートを表示します。モデル グラフのプロットを作成し、すべてが意図したとおりに適合していることを確認します。
- レイヤーに名前を付けます。モデル図を表示するときや描画するときに使用するレイヤーに名前を割り当てることができます。たとえば、Dense(1, name = 'hidden1') です。
- サブモデルを分離します。個別のサブモデルの開発とサブモデルの組み合わせを検討してください。
|