機械学習 - のシーケンス生成LSTMアプリ

  • アウトライン

上記の機械学習アプリケーションでLSTMが株式分析、意味解析から、非常に広いですので、それのすべての側面に機械翻訳に分析LSTMための構造の前を通ってくる、このセクションでは、LSTMのいくつかを説明します小さなアプリケーションそのシーケンス生成。実際には、シーケンス生成能力は、以下のようなアプリケーションの数の総称である:機械と機械が自分自身の学習(すぐに仕事のプロデューサー....)のモデルに基づいて音楽を作成するために音楽を学んだ後、マシンは言語を学ぶせ、その後の学習をしましょうしましょう話をすると、上のように、自分自身のモデルを生成する単語。実際には、これは1対多ののLSTMネットワーク構造の本質です。このセクションでは、ネットワーク構造のこの種のアプリケーションを説明するために主にあります。

  • シーケンス世代ネットワークアーキテクチャ分析

私たちは実際にコードを書いて、実装する前に、私たちの主なタスクは、シーケンス生成のネットワーク構造を構築する方法です。、復号化プロセスの第二部と網目構造のシーケンスの生成は実際には二つの部分に分割され、最初の部分はである、我々はネットワーク構造が多対多のネットワークをモデル化し、(モデリング)をコードされていますそれは、1対多の構造です。したがって、この特定のネットワークアーキテクチャは似ているのですか?以下の写真で見てみましょう

 

上の写真に示す全体のプロセスは、復号化コードからシーケンス生成及び構造です。私たちのこのアプリケーションでは、私たちのエンコーディング入力が各時間ステップが文字で、出力は入力データに対応する単語は、私たちのトレーニングデータから来ている、待機我々は訓練し、訓練を受けたまであるデコードネットワークを構築するためにLSTM細胞を来る、私たちは言葉を入力し、それは自動的に私たちが何かを言う予測することを学ぶ前に、我々のモデルに基づいており、それはクールではないでしょうか?もちろん、エンコードの段階で、形状の私達の入力データに基づいて時間ステップの当社LSTMの具体的な数は、決定され、デコード段階で時間ステップの特定の番号が決定する私たち自身のことであり、我々は使用する必要がありますループのデコード段階で私たちの時間ステップを決定します。図から、我々は明らかに復号時にも見ることができ、我々は一つだけ入力Xを持って、ステップ入力の背後にある時間は、前の時間ステップの出力です。上記のシーケンスは、構造体のどの世代全体です。その後ダウン、我々は上記のネットワーク構造を実装するためのコードを使用方法を確認するために、そのコードの一部を分析します。

  • シーケンス生成コード解析

 上記の分析から、我々はそのシーケンスの生成は、我々がある最初のステップを見て、取るの隣ので、当然、我々は確かに、どのようにして、上図のネットワーク構造を実装するために2つの部分にコードを獲得し、2つの部分で構成され見ることができますPythonは、以下に示すように、コードの構造を符号化することによって達成され、私たちはゆっくりと分析にコードを見て:

#define共有変数
N_A = 64 n_values = 78の単一の入力アウト寸法の reshapor = keras.layers.Reshape((1、n_values)) 以下djmodel(のステップ2.Bで使用される)、 LSTM_cell = keras.layers.LSTM (N_A、return_state = TRUE) ステップ2.Cで使用される、return_stateを設定するmuset densor = keras.layers.Dense(n_values、活性化= ' ソフトマックス'ステップ2.Dのに使用さ
#multiple入力(X、 C)、我々はシーケンシャルなAPI以外の機能Keras、使用する必要が デフCREATE_MODEL送信(Tx、N_A、n_valuesを ):""」 モデルを実装します 引数: 送信-コーパス内のシーケンスの長さは 私たちのモデルで使用されるアクティベーションの数- N_A n_values -音楽データ内の一意の値の数 戻り値: モデル- N_Aアクティベーションとkerasインスタンスモデル 「」」 入力層を定義し、形状指定 X = keras.Input(形状=(送信、n_values))入力がBATCH_SIZE寸法を省略し、Xは、依然として(BATCH_SIZE寸法を有する)3 dimensionesある。 初期隠れ状態A0および初期セルを定義します状態C0 A0 = keras.Input(形状=(N_A)、NAME = ' A0 ' C0 = keras.Input(形状=(N_A)、名前=' C0 ' 、A = A 0 、C = C0 ステップ1:反復しながら出力を追加する空のリストを作成して 出力= [] ループ:ステップ2 のための T における範囲(TX): ステップ2.A:」を選択T」X.から番目のタイムステップベクトル X = keras.layers.Lambda(ラムダX:X [:、T:])(X) #1 ステップ2.B:変形に使用reshaporがあるとX(1、n_values) (≈1ライン) デフォルトの寸法としてLSTM層がBATCH_SIZEが省略されている入力(BATCH_SIZE、テキサス州、n_values)、である、送信(Tx、n_values)です。もし送信(Tx、n_values)、そして、LSTM()のTxデフォルトのサイクルタイム、したがって、我々は(1、n_values)にそれを再構築し、それがサイクルではありません。 = X reshapor(X) ステップ2.C:LSTM_cellステップのいずれかを実行 A、_、C = LSTM_cell(X、INITIAL_STATE = [A、C]) ステップ2.Dを:のdensor出力状態を適用するために隠さLSTM_Cell OUT = densor(A)シェイプ#のAPOS OUT(M ,. 1、n_values)IS ステップ2.E:追加"出力"への出力 outputs.append(OUT) # ステップ3:モデルのインスタンスを作成 モデルkeras.Model =( =入力[X-、A0、CO] =出力出力) リターン・モデル

上記のコードから、我々は、最初に我々は我々のモデルでは、これらの変数のいずれかのエンコードやデコードが共通しているので、例えばA、次元のC、LSTM_cellのために、共有変数を定義する必要があり、すべてのではなく、見ることができます彼は、これは間違っては理解しているLSTM_cellの数を、含まれているためにLSTM層(我々は上記の絵を描いたが、そうであるが、これは理解が実際には同じLSTM_cell、より多くのLSTM_cell多くを描くことができ容易にするために、私は誤解しないで期待している)と述べました。N_A =寸法A、ベクトルのCを;そして我々=各入力次元のベクトルをn_valuesまず、パラメータは、送信= time_stepsがされている。このネットワークを構築する必要があります。私たちのネットワークは、3つの入力を持っているので、すなわち、X、Cは、私たちは最初にこれらの3つの入力を定義する必要があり、BATCH_SIZEは要求されないとき形状を設定することで、彼らの注意をその形状を設定します。その後、我々は、forループの各入力値を、上記のコードからなる、すなわちものラムダ層を抽出する第一の時間ステップを行って、我々は、各時間ステップ、各時間ステップのために抽出された値であるためLSTM我々は、次にLSTM_cell入力値、および戻り隠された状態A、及びメモリセルCに送信処理送信し、最終的に緻密層を介して、我々は、出力を算出し、意志サイクル我々はまだ(1、n_values)を再構築しなければならないので、一度各ステップの出力は、出力にこのリストを置きます。これは、我々はエンコーディングのネットワーク全体を構築するステップです。私たちは分析したので、まあ、舞台をコードする上で、トレーニングプロセスを完了し、私たちは私たちが望むきLSTMをLSTM、その後、我々は次のデコード処理を見てみましょう、すなわち、どのように生成する(LSTMもらうトレーニングを予測します)私たちのシーケンスの友人は、次のコードで見てみましょう、その後、ゆっくりと分析

DEF sequence_inference_model(LSTM_cell、n_values = 78、N_A = 64、Tyの= 100 ):
     "" " 
    LSTM_cell "および"densor訓練された使用""値のシーケンスを生成するためにモデルからの()。
    
    引数:
    LSTM_cell -訓練されました" LSTM_cell」モデル()、Keras層オブジェクトから
    densor -訓練された『モデル()、Keras層オブジェクトからdensor』
    n_values -整数、一意の値の数
    N_A - LSTM_cellにおける単位数
    のTy -整数、数生成するための時間ステップの
    
    :戻り
    Kerasモデルのインスタンス- inference_model 
    「」」
    
    形状のモデルの入力を定義します(これは1対多の構造があり、入力形状がある(1、n_values))
    X0 = keras.Input(形状=(1 、n_values)) 
    
    A0定義し、C0、デコーダLSTMの初期隠れ状態 
    A0 = keras.Input(形状=(N_A)、NAME = ' A0 ' 
    C0 = keras。入力(形状=(N_A、)、名前= ' C0 ' 
    、A = A0 
    C = C0 
    X = X0の

    #1 ステップ1:後で予測値(≈1ライン)を格納するために、 "出力"の空のリストを作成して 
    出力= [ ] 
    
    #のステップ2:のTyをループ毎時間ステップで値を生成
    するための T における範囲(のTy):
        
        ステップ2.A:LSTM_cellの一の工程を実行し 
        、_、C = LSTM_cell(X、INITIAL_STATE = [C])
        
        #1 LSTM_cellの隠れ状態出力に緻密層を適用する:ステップ2.B 
        =うちdensor( A)

        #1 ステップ2.C:追加「出力」を「アウト」予測。out.shape =(なし、78)
        outputs.append(OUT)
        
        #1 ステップ2.D:のワンホット表現される「アウト」に応じて次の値を選択し、セット「X」
                   選択した値、その次のステップでLSTM_cellへの入力として渡されます。我々は提供している
        位に           、あなたがこれを行うために必要なコードの行を。
        X = keras.layers。
        
    ステップ3:正しい"入力"及び"出力"でモデルインスタンスを作成 
    inference_model = keras.Model(入力= [X0、A0、C0]、出力= 出力)
   
    戻り inference_model

inference_model = sequence_inference_model(LSTM_cell、densor、n_values = 78、N_A = 64、Tyの= 50)
inference_model.summary()

x_initializer = np.zeros((1、1、78))
a_initializer = np.zeros((1、N_A))
c_initializer = np.zeros((1、N_A))

PRED = inference_model.predict([x_initializer、a_initializer、c_initializer])

推論モデルは、一つのワードを出力するX0の入力に応じて、具体的に出力番号をバックを予測するためにどの値、トレーニング上記共有パラメータの重みとBIAS LSTMが入って来た、予測するために訓練された上記LSTM基づいています値は、ユーザ設定のTyに応じて決定される、もちろん、また、より多くのEOSが満たされた場合、たとえば、私たちが直接出力を停止し、私たちの出力管理を精緻化することができます。でも、私たちの前のLSTMではなく、構造の違い、我々はまだ再ビルドデコード構造に、新しい推論モデルを構築するために行かなければなりません。私たちが見ることができる構造からデコードを、我々はまだ三つの入力、すなわちX0、A0、C0を持っています。そこ私たちはリシェイプ入力に行く必要はありませんので、私たちの入力、すなわち(BATCH_SIZE、テキサス州、n_values)は、(BATCH_SIZE、N_A)は、標準形状でいる場所をコードするよりも簡単です、(BATCH_SIZE、N_A)次の時間ステップであるとして、それはここにコードポイントに続くLSTMのdensorへの入力に直接入力して配置形状の側面の数を実行するために必要なことはできませんが、同じではない、必要たびにステップが出力されます入力、すなわち、上記のコードX = tf.keras.Lambda(one_hot)(OUT)。これは推論モデルですので、我々はそれを再フィッティングする必要はありませんので、それが直接の方法は、それを予測する予測することができます呼び出すことができます。

  • 概要

その一連の生成に関連したアプリケーションでは、我々は最初のそれは2部構成であることを、このパターンの心の中で見つけなければならない、符号化、復号化には、モデルのトレーニングにして、予測するモデルを用いて復号化をコードします。入力層の入力のために、必ず注意を払うにすることで、形状のその入力データを理解し、一貫していなければならない。変数共有のために一緒に例えばLSTM_cell、densorなど、理解することが重要である、彼らは最も基本的なモデルうまくいけば、このLSTMで構成されています、すべての共有は、タイムステップごとに独立したエンティティを持っていません。上記コンテンツのためのステップとシーケンス生成に関連するアプリケーションのための言葉を理解し、次に達成するために、同じパターンを適用することができた場合は、必要な唯一の変更は、値の次元を見ることです。

 

おすすめ

転載: www.cnblogs.com/tangxiaobo199181/p/12458913.html