bugfix> keras > 投稿

可変長の一連のシーケンスがあり、過去の多くのトークンが与えられたときに次のトークンを予測するモデルを構築したいと思います。

問題は、可変長シーケンスでモデルをトレーニングするにはどうすればよいですか?

パディングは知っていますが、ウィンドウの長さを事前に指定しない方法はありますか?

batch_size = 1 の使用についても読みました 。この場合、train_Xとtrain_Yはどうあるべきですか?非常に長いシーケンスの最後のトークンのみをターゲットとして使用すると、その中のすべてのサブシーケンスを破棄するようなものです(つまり、0->1、0->2 .... 0->N-1)。 LSTMに供給する前に、これらすべてのサブシーケンスを手動で作成する必要がありますか?

回答 2 件
  • はい、Kerasで可変長の入力を指定できます。つまり、 input_shape=(None, features) を指定します。  ここで、 None  示すわからない タイムステップの数。モデルの例を次に示します。

    in = Input(shape=(None, num_words)) # let's assume it is one-hot encoded words
    latent = Masking()(in) # sentences in same batch need to same length, padded
    latent = LSTM(latent_size)(latent) # skips masked timesteps
    out = Dense(num_words, activation='softmax')
    model = Model(in, out)
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
    
    

    重要な点は、テンソル操作のためにバッチ内のセンテンスをパディングする必要があるが、実際には、異なるバッチが異なるタイムステップ数を持ち、モデルがさまざまな長さのセンテンスを処理できるようにすることです。

  • ケラスでは、入力図形を5つ必要としますが、同じサイズになるようにシーケンス(たとえば0で埋める)をパディングできます。

    LSTMは3D入力を取ります:(batch_size、timesteps、features)。タイムステップは単語を表し、1つの単語の表現を特徴としています。 20語の文があり、文の各語が1000要素のOneHotベクトルとして表されているとします。単一の文の場合、入力形状は(1、20、1000)でなければなりません。これらの条件に合うようにデータを手動で前処理することも、kerasで事前に構築された関数を使用して作業を行うこともできます。これらの機能はすべてここで見つけることができます:https://keras.io/preprocessing/text/

あなたの答え