[[380280]] Keras Python ライブラリを使用すると、ディープラーニング モデルをすばやく簡単に作成できます。シーケンシャル API を使用すると、ほとんどの問題に対してレイヤーごとにモデルを作成できます。複数の入力または出力を持つ共有レイヤーまたはモデルを作成できないという制限があります。 Keras の機能 API は、より複雑なモデルの作成など、より高い柔軟性を提供するモデルを作成するための代替手段です。 このチュートリアルでは、Keras のより柔軟な機能 API を使用してディープラーニング モデルを定義する方法を説明します。このチュートリアルを完了すると、次のことが分かります。 - シーケンシャル API と機能 API の違い。
- 機能 API を使用して、単純な多層パーセプトロン、畳み込みニューラル ネットワーク、および再帰型ニューラル ネットワーク モデルを定義する方法。
- 共有レイヤーと複数の入力および出力を持つより複雑なモデルを定義する方法。
チュートリアルの概要 このチュートリアルは 7 つのパートに分かれています。彼らです: - Keras シーケンシャルモデル
- Keras 機能モデル
- 標準ネットワークモデル
- 共有レイヤーモデル
- 複数の入力および出力モデル
- ベストプラクティス
- 新機能: 機能 API Python 構文の説明
1. Keras シーケンシャルモデル 要約すると、Keras は Sequential モデル API を提供します。 Keras またはディープラーニングを初めて使用する場合は、このステップバイステップの Keras チュートリアルをご覧ください。 Sequential モデル API は、Sequential クラスのインスタンスを作成し、モデル レイヤーを作成してモデルに追加するディープラーニング モデルを作成する方法です。たとえば、レイヤーを定義して、それを配列として Sequential に渡すことができます。 - keras.modelsからSequentialをインポートする
- keras.layersからDenseをインポート
- モデル=シーケンシャル([Dense(2, input_dim = 1 ), Dense(1)])
レイヤーはセクションごとに追加することもできます。 - keras.modelsからSequentialをインポートする
- keras.layersからDenseをインポート
- モデル=シーケンシャル()
- モデルを追加します(密度(2, input_dim = 1 ))
- モデルを追加します(密(1))
Sequential Model API は、ほとんどの状況でディープラーニング モデルの開発に適していますが、いくつかの制限もあります。たとえば、複数の異なる入力ソースを持ち、複数の出力ターゲットを生成したり、レイヤーを再利用したりする可能性のあるモデルを定義するのは簡単ではありません。 2. Kerasの機能モデル Keras 機能 API は、より柔軟なモデル定義方法を提供します。具体的には、複数の入力モデルまたは出力モデル、およびレイヤーを共有するモデルを定義できます。それだけでなく、アドホックな非巡回ネットワーク グラフを定義することもできます。モデルは、レイヤー インスタンスを作成し、それらをペアで直接接続し、それらのレイヤーをモデルの入力と出力として指定するモデルを定義することによって定義されます。 Keras 機能 API の 3 つのユニークな側面を順番に見ていきましょう。 1. 入力を定義する Sequential モデルとは異なり、入力データの形状を指定するには、別の入力レイヤーを作成して定義する必要があります。入力層は、入力データの次元を示すタプルである形状パラメータを受け取ります。入力データが 1 次元 (多層パーセプトロンなど) の場合、ネットワークのトレーニング時にデータを分割するときに使用するミニバッチ サイズの形状に明示的に余裕を持たせる必要があります。したがって、入力が 1-D (2,) の場合、形状タプルは常に最後のぶら下がり次元で定義されます。次に例を示します。 - keras.layersから入力をインポート
- 可視=入力(形状=(2,))
2. 接続層 モデル内のレイヤーはペアで接続されています。これは、各新しいレイヤーを定義するときに入力の取得元を指定することによって行われます。レイヤーを作成した後、括弧表記を使用して現在のレイヤー入力のソース レイヤーを指定します。簡単な例でこれを明確にしてみましょう。上記のように入力層を作成し、入力層からの入力のみを受け取る Dense として隠し層を作成できます。 - keras.layersから入力をインポート
- keras.layersからDenseをインポート
- 可視=入力(形状=(2,))
- 隠された=密集した(2)(見える)
入力レイヤーの出力を密なレイヤーとして連結する密なレイヤーを作成した後の (可視) レイヤーに注意してください。このレイヤーごとの接続アプローチにより、機能 API に柔軟性がもたらされます。たとえば、レイヤーの一時的なグラフィックの定義を開始するのは非常に簡単であることがわかります。 3. モデルを作成する すべてのモデル レイヤーを作成し、それらを接続したら、モデルを定義する必要があります。 Sequential API と同様に、モデルは集計、適合、評価し、予測を行うために使用できるものです。 Keras には、作成したレイヤーからモデルを作成するために使用できる Model クラスが用意されています。入力層と出力層を指定するだけです。例えば: - keras.modelsからモデルをインポート
- keras.layersから入力をインポート
- keras.layersからDenseをインポート
- 可視=入力(形状=(2,))
- 隠された=密集した(2)(見える)
- model =モデル(入力=表示、出力=非表示)
Keras 機能 API の重要な部分をすべて理解できたので、さまざまなモデルのセットを定義して練習してみましょう。各例は実行可能であり、構造を印刷し、グラフのプロットを作成します。物事を明確に定義するために、独自のモデルに対してこれを実行することをお勧めします。これらの例が、将来、機能 API を使用して独自のモデルを定義するときにテンプレートとして役立つことを願っています。 3. 標準ネットワークモデル 機能 API を使い始めるときは、まずいくつかの標準的なニューラル ネットワーク モデルを定義する方法を理解するのが最適です。このセクションでは、単純な多層パーセプトロン、畳み込みニューラル ネットワーク、および再帰型ニューラル ネットワークの定義について説明します。これらの例は、後でより詳細な例を理解するための基礎となります。 このセクションでは、バイナリ分類のための多層パーセプトロン モデルを定義します。このモデルには、10 個の入力、10、20、10 個のニューロンを持つ 3 つの隠し層、および 1 つの出力を持つ出力層があります。各隠れ層では正規化線形活性化関数が使用され、バイナリ分類の出力層ではシグモイド活性化関数が使用されます。 - # 多層パーセプトロン
- keras.utilsからplot_modelをインポートする
- keras.modelsからモデルをインポート
- keras.layersから入力をインポート
- keras.layersからDenseをインポート
- 可視=入力(形状=(10,))
- hidden1 =密(10、アクティベーション= 'relu' )(表示)
- hidden2 =密(20,アクティベーション= 'relu' )(hidden1)
- hidden3 =密(10、アクティベーション= 'relu' )(hidden2)
- 出力=密(1、活性化= 'シグモイド' )(hidden3)
- model =モデル( inputs =可視、 output =出力)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- 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
- _________________________________________________________________
ネットワーク構造図は以下のとおりです。 このセクションでは、画像分類用の畳み込みニューラル ネットワークを定義します。このモデルは、入力として白黒の 64×64 画像を受け取り、特徴抽出器として 2 つの畳み込み層とプーリング層のシーケンスを備え、その後に特徴を解釈するための完全接続層、および 2 クラス予測用のシグモイド活性化を備えた出力層が続きます。 - # 畳み込みニューラルネットワーク
- keras.utilsからplot_modelをインポートする
- keras.modelsからモデルをインポート
- keras.layersから入力をインポート
- keras.layersからDenseをインポート
- keras.layersからフラット化をインポートする
- 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、カーネルサイズ= 4 、アクティベーション= 'relu' )(プール1)
- プール2 = MaxPooling2D (プールサイズ= (2, 2))(conv2)
- flat =フラット化()(pool2)
- hidden1 =密(10、活性化= 'relu' )(フラット)
- 出力=密(1、活性化= 'シグモイド' )(hidden1)
- model =モデル( inputs =可視、 output =出力)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'convolutional_neural_network.png' )
出力は次のようになります。 - _________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#
- =================================================================
- input_1 (入力レイヤー) (なし、64、64、1) 0
- _________________________________________________________________
- conv2d_1 (Conv2D) (なし、61、61、32) 544
- _________________________________________________________________
- max_pooling2d_1 (MaxPooling2 (なし、30、30、32) 0
- _________________________________________________________________
- conv2d_2 (Conv2D) (なし、27、27、16) 8208
- _________________________________________________________________
- max_pooling2d_2 (MaxPooling2 (なし、13、13、16) 0
- _________________________________________________________________
- flatten_1 (フラット化) (なし、2704) 0
- _________________________________________________________________
- 密_1 (密) (なし、10) 27050
- _________________________________________________________________
- 密_2 (密) (なし、1) 11
- =================================================================
- 合計パラメータ: 35,813
- トレーニング可能なパラメータ: 35,813
- トレーニング不可能なパラメータ: 0
- _________________________________________________________________
ネットワーク構造図は以下のとおりです。 このセクションでは、シーケンス分類用の Long Short-Term Memory Recurrent Neural Network を定義します。モデルは、入力として機能の 100 タイム ステップを想定しています。このモデルには、シーケンスから特徴を抽出するための単一の LSTM 隠し層があり、その後に LSTM 出力を解釈するための完全接続層が続き、最後にバイナリ予測を行うための出力層が続きます。 - # リカレントニューラルネットワーク
- keras.utilsからplot_modelをインポートする
- keras.modelsからモデルをインポート
- keras.layersから入力をインポート
- keras.layersからDenseをインポート
- keras.layers.recurrent から LSTM をインポートします
- 可視=入力(形状=(100,1))
- 隠し1 = LSTM (10)(表示)
- hidden2 =密(10、アクティベーション= 'relu' )(hidden1)
- 出力=密(1、活性化= 'シグモイド' )(hidden2)
- model =モデル( inputs =可視、 output =出力)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'recurrent_neural_network.png' )
出力は次のようになります。 - _________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#
- =================================================================
- input_1 (入力レイヤー) (なし、100、1) 0
- _________________________________________________________________
- lstm_1 (LSTM) (なし、10) 480
- _________________________________________________________________
- 密_1 (密) (なし、10) 110
- _________________________________________________________________
- 密_2 (密) (なし、1) 11
- =================================================================
- 合計パラメータ: 601
- トレーニング可能なパラメータ: 601
- トレーニング不可能なパラメータ: 0
- _________________________________________________________________
モデル構造図は以下のとおりです。 4. 共有レイヤーモデル 複数のレイヤーが 1 つのレイヤーの出力を共有できます。たとえば、入力からの特徴抽出の異なるレイヤーが複数存在する場合や、特徴抽出レイヤーからの出力を解釈するためのレイヤーが複数存在する場合があります。 2つの例を見てみましょう。 このセクションでは、画像入力を解釈するために、異なるサイズのカーネルを持つ複数の畳み込み層を定義します。モデルは、64×64 ピクセルのサイズの白黒画像を撮影します。この入力を共有する CNN 特徴抽出サブモデルが 2 つあります。最初のカーネル サイズは 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 =密(10,アクティベーション= 'relu' )(マージ)
- # 予測出力
- 出力=密(1、活性化= 'シグモイド' )(hidden1)
- model =モデル( inputs =可視、 output =出力)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'shared_input_layer.png' )
出力は次のようになります。 - ____________________________________________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#接続先
- ====================================================================================================
- input_1 (入力レイヤー) (なし、64、64、1) 0
- ____________________________________________________________________________________________________
- conv2d_1 (Conv2D) (なし、61、61、32) 544 input_1[0][0]
- ____________________________________________________________________________________________________
- conv2d_2 (Conv2D) (なし、57、57、16) 1040 input_1[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_1 (MaxPooling2D) (なし、30、30、32) 0 conv2d_1[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_2 (MaxPooling2D) (なし、28、28、16) 0 conv2d_2[0][0]
- ____________________________________________________________________________________________________
- flatten_1 (フラット化) (なし、28800) 0 max_pooling2d_1[0][0]
- ____________________________________________________________________________________________________
- flatten_2 (フラット化) (なし、12544) 0 max_pooling2d_2[0][0]
- ____________________________________________________________________________________________________
- concatenate_1 (連結) (なし、41344) 0 flatten_1[0][0]
- フラット化_2[0][0]
- ____________________________________________________________________________________________________
- 密_1 (密) (なし、10) 413450 連結_1[0][0]
- ____________________________________________________________________________________________________
- 密_2 (密) (なし, 1) 11 密_1[0][0]
- ====================================================================================================
- 合計パラメータ: 415,045
- トレーニング可能なパラメータ: 415,045
- トレーニング不可能なパラメータ: 0
- ____________________________________________________________________________________________________
ネットワーク構造図は以下のとおりです。 このセクションでは、2 つの並列サブモデルを使用して、シーケンス分類用の LSTM 特徴抽出器の出力を解釈します。モデルへの入力は、1 つの機能の 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 =密(10、アクティベーション= 'relu' )(extract1)
- # 2番目の解釈モデル
- interp11 =密(10、アクティベーション= 'relu' )(extract1)
- interp12 =密(20、活性化= 'relu' )(interp11)
- interp13 =密(10、活性化= 'relu' )(interp12)
- # マージ解釈
- マージ=連結([interp1, interp13])
- # 出力
- 出力=密(1、活性化= 'シグモイド' )(マージ)
- model =モデル( inputs =可視、 output =出力)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'shared_feature_extractor.png' )
出力は次のようになります。 - ____________________________________________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#接続先
- ====================================================================================================
- input_1 (入力レイヤー) (なし、100、1) 0
- ____________________________________________________________________________________________________
- lstm_1 (LSTM) (なし、10) 480 input_1[0][0]
- ____________________________________________________________________________________________________
- 密_2 (密) (なし、10) 110 lstm_1[0][0]
- ____________________________________________________________________________________________________
- 密_3 (密) (なし、20) 220 密_2[0][0]
- ____________________________________________________________________________________________________
- 密_1 (密) (なし、10) 110 lstm_1[0][0]
- ____________________________________________________________________________________________________
- 密_4 (密) (なし, 10) 210 密_3[0][0]
- ____________________________________________________________________________________________________
- concatenate_1 (連結) (なし、20) 0 dense_1[0][0]
- 密_4[0][0]
- ____________________________________________________________________________________________________
- 密_5 (密) (なし、1) 21 concatenate_1[0][0]
- ====================================================================================================
- 合計パラメータ: 1,151
- トレーニング可能なパラメータ: 1,151
- トレーニング不可能なパラメータ: 0
- ____________________________________________________________________________________________________
ネットワーク構造図は以下のとおりです。 5. 複数の入力および出力モデル 機能 API は、複数の入力 (異なるスキーマを使用する可能性あり) を持つより複雑なモデルを開発するためにも使用できます。複数の出力を生成するモデルの開発にも使用できます。このセクションでは、それぞれの例を見ていきます。 それぞれ異なるサイズの 2 つのバージョンの画像を入力として受け取る画像分類モデルを開発します。具体的には、白黒 64×64 バージョンとカラー 32×32 バージョンです。各 CNN モデルで個別に特徴抽出が実行され、その後 2 つのモデルの結果が連結されて解釈と最終的な予測が行われます。 Model() インスタンスを作成するときに、2 つの入力レイヤーを配列として定義したことに注意してください。特別: - model =モデル( inputs =[visible1, visible2], output outputs =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、カーネルサイズ= 4 、アクティベーション= 'relu' )(visible1)
- pool11 = MaxPooling2D (プールサイズ=(2, 2))(conv11)
- conv12 = Conv2D (16、カーネルサイズ= 4 、アクティベーション= 'relu' )(pool11)
- pool12 = MaxPooling2D (プールサイズ= (2, 2))(conv12)
- flat1 =フラット化()(pool12)
- # 2番目の入力モデル
- visible2 =入力(形状=(32,32,3))
- conv21 = Conv2D (32、カーネルサイズ= 4 、アクティベーション= 'relu' )(visible2)
- pool21 = MaxPooling2D (プールサイズ= (2, 2))(conv21)
- conv22 = Conv2D (16、カーネルサイズ= 4 、アクティベーション= 'relu' )(pool21)
- pool22 = MaxPooling2D (プールサイズ= (2, 2))(conv22)
- flat2 =フラット化()(pool22)
- # 入力モデルをマージする
- マージ=連結([flat1, flat2])
- # 解釈モデル
- hidden1 =密(10,アクティベーション= 'relu' )(マージ)
- hidden2 =密(10、アクティベーション= 'relu' )(hidden1)
- 出力=密(1、活性化= 'シグモイド' )(hidden2)
- model =モデル( inputs =[visible1, visible2], output outputs =output)
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'multiple_inputs.png' )
出力は次のようになります。 - ____________________________________________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#接続先
- ====================================================================================================
- input_1 (入力レイヤー) (なし、64、64、1) 0
- ____________________________________________________________________________________________________
- input_2 (入力レイヤー) (なし、32、32、3) 0
- ____________________________________________________________________________________________________
- conv2d_1 (Conv2D) (なし、61、61、32) 544 input_1[0][0]
- ____________________________________________________________________________________________________
- conv2d_3 (Conv2D) (なし、29、29、32) 1568 input_2[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_1 (MaxPooling2D) (なし、30、30、32) 0 conv2d_1[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_3 (MaxPooling2D) (なし、14、14、32) 0 conv2d_3[0][0]
- ____________________________________________________________________________________________________
- conv2d_2 (Conv2D) (なし、27、27、16) 8208 max_pooling2d_1[0][0]
- ____________________________________________________________________________________________________
- conv2d_4 (Conv2D) (なし、11、11、16) 8208 max_pooling2d_3[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_2 (MaxPooling2D) (なし、13、13、16) 0 conv2d_2[0][0]
- ____________________________________________________________________________________________________
- max_pooling2d_4 (MaxPooling2D) (なし、5、5、16) 0 conv2d_4[0][0]
- ____________________________________________________________________________________________________
- flatten_1 (フラット化) (なし、2704) 0 max_pooling2d_2[0][0]
- ____________________________________________________________________________________________________
- flatten_2 (フラット化) (なし、400) 0 max_pooling2d_4[0][0]
- ____________________________________________________________________________________________________
- concatenate_1 (連結) (なし、3104) 0 flatten_1[0][0]
- フラット化_2[0][0]
- ____________________________________________________________________________________________________
- 密_1 (密) (なし、10) 31050 連結_1[0][0]
- ____________________________________________________________________________________________________
- 密_2 (密) (なし, 10) 110 密_1[0][0]
- ____________________________________________________________________________________________________
- 密_3 (密) (なし, 1) 11 密_2[0][0]
- ====================================================================================================
- 合計パラメータ: 49,699
- トレーニング可能なパラメータ: 49,699
- トレーニング不可能なパラメータ: 0
- ____________________________________________________________________________________________________
ネットワーク構造図は以下のとおりです。 このセクションでは、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 =高密度(10、アクティベーション= 'relu' )(class11)
- 出力1 =密(1、活性化= 'シグモイド' )(クラス12)
- # シーケンス出力
- output2 = TimeDistributed (Dense(1, activation = 'linear' ))(抽出)
- # 出力
- model =モデル(入力=可視、出力= [出力1、出力2])
- # レイヤーを要約する
- 印刷(モデル.要約())
- # グラフをプロットする
- plot_model(モデル、 to_file = 'multiple_outputs.png' )
出力は次のようになります。 - ____________________________________________________________________________________________________
- レイヤー(タイプ)出力形状パラメータ#接続先
- ====================================================================================================
- input_1 (入力レイヤー) (なし、100、1) 0
- ____________________________________________________________________________________________________
- lstm_1 (LSTM) (なし、100、10) 480 input_1[0][0]
- ____________________________________________________________________________________________________
- lstm_2 (LSTM) (なし、10) 840 lstm_1[0][0]
- ____________________________________________________________________________________________________
- 密_1 (密) (なし、10) 110 lstm_2[0][0]
- ____________________________________________________________________________________________________
- 密_2 (密) (なし, 1) 11 密_1[0][0]
- ____________________________________________________________________________________________________
- time_distributed_1 (TimeDistribu (なし, 100, 1) 11 lstm_1[0][0]
- ====================================================================================================
- 合計パラメータ: 1,452
- トレーニング可能なパラメータ: 1,452
- トレーニング不可能なパラメータ: 0
- ____________________________________________________________________________________________________
ネットワーク構造図は以下のとおりです。 VI. ベストプラクティス このセクションでは、独自のモデルを定義するときに機能 API を最大限に活用するためのヒントをいくつか紹介します。 - 一貫した変数名。入力 (visible) レイヤーと出力 (output)、さらに隠しレイヤー (hidden1、hidden2) にも同じ変数名を使用します。物事を正しく結び付けるのに役立ちます。
- レイヤーの概要を表示します。常にモデルの概要を印刷し、レイヤーの出力を確認して、モデルが期待どおりに接続されていることを確認します。
- グラフィック図を表示します。常にモデル図の図を作成し、すべてが期待どおりに適合しているかどうかを確認してください。
- レイヤーに名前を付けます。モデル図の概要と描画を表示するときに使用するレイヤーに名前を割り当てることができます。例: Dense(1, name='hidden1')。
- サブモデルを分離します。サブモデルの開発を分離し、最後にサブモデルを組み合わせることを検討してください。
|