2016-06-21 6 views
1

私はケラスを初めて使いました。ドキュメントやケラスのexamplesフォルダを読んでいたにもかかわらず、私はまだすべてを合わせる方法に苦労しています。Kerasフレームワークに入力をマッサージする方法は?

特に、私は簡単なタスクから始めたいと思います。トークンのシーケンスがあり、トークンごとにラベルが1つだけあります。私は必要に応じてより多くの(token, label)トレーニングペアを生成することができるので、このような多くのトレーニングデータを持っています - 事実上無限です。

トークンを与えられたラベルを予測するネットワークを構築したいと考えています。トークンの数は、常にラベルの数と同じでなければなりません(1つのトークン= 1つのラベル)。

そして、これは、すべての周囲のトークンに基づいて、としたいと思います。先行するトークンだけでなく、同じ行または文章またはウィンドウ内にあります。

  • は私がtoken-を使用して、(同じ長さの)トークンのベクトル、ラベル、ベクターにそれぞれの文章を変換訓練numpyのベクトルを、作成した:私は自分で持ってどこまで

    to-intマッピングとlabel-to-intマッピング

  • は、とhttps://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.pyに基づく1つのLSTMレイヤーを使用してモデルを作成しました。各文は、異なる長さ(トークンとその中のラベルの数が異なる)、持っているので、私はのように何を置くべき...

    1. すべてinput_diminput_shapeパラメータ:

は今すぐに苦しんで入力層にはinput_dim

  • のトークン全体をのトークンだけでなく予測するためにネットワークに通知する方法を教えてください。以前のトークンに基づいてラベル付けするのではなく、一連のトークンを与えられたラベル全体を予測する方法は?
  • テキストを文章やウィンドウに分割することは意味がありますか?または、テキスト全体のベクトルを単一のシーケンスとして渡すことはできますか? 「シーケンス」とは何ですか?
  • 「タイムスライス」と「タイムステップ」とは何ですか?ドキュメンテーションにはそのことが言及されていますが、私はその問題とどう関係するか分かりません。ケラスの "時間"とは何ですか?
  • 「時間」や「シーケンス」のようなドキュメントの概念を私の問題に結びつけるのに問題があります。 Keras#40のような問題は私をもっと賢くしませんでした。

    ウェブまたはコードサンプルの関連する例を指摘すると、非常に感謝します。学術論文を探していない。

    ありがとうございます!

    答えて

    2
    1. あなたは異なる長さの配列を有する場合は、いずれかのパッドそれらまたはアクティベーションは、バッチ間で保存されているステートフルRNNの実装を使用することができます。前者が最も簡単で最も使用されています。

    2. RNNを使用する際に将来の情報を使用する場合は、逆方向に移動する2つのRNNを連結する双方向モデルを使用します。RNNは、例えば次のような場合にすべての以前の情報の表現を使用する。予測する。

    3. 非常に長い文章がある場合は、ランダムなサブシーケンスをサンプリングして訓練すると便利です。 Fx 100文字。また、これは過大適合に役立ちます。

    4. タイムステップはトークンです。文は一連の文字/トークンです。

    問題の理解方法の例を書いていますが、テストされていないため実行できません。整数を使用してデータを表現する代わりに、可能であればワンホットエンコーディングを提案し、mseの代わりにbinary_crossentropyを使用します。

    from keras.models import Model 
    from keras.layers import Input, LSTM, TimeDistributed 
    from keras.preprocessing import sequence 
    
    # Make sure all sequences are of same length 
    X_train = sequence.pad_sequences(X_train, maxlen=maxlen) 
    
    # The input shape is your sequence length and your token embedding size (which is 1) 
    inputs = Input(shape=(maxlen, 1)) 
    
    # Build a bidirectional RNN 
    lstm_forward = LSTM(128)(inputs) 
    lstm_backward = LSTM(128, go_backwards=True)(inputs) 
    bidirectional_lstm = merge([lstm_forward, lstm_backward], mode='concat', concat_axis=2) 
    
    # Output each timestep into a fully connected layer with linear 
    # output to map to an integer 
    sequence_output = TimeDistributed(Dense(1, activation='linear'))(bidirectional_lstm) 
    # Dense(n_classes, activation='sigmoid') if you want to classify 
    
    model = Model(inputs, sequence_output) 
    model.compile('adam', 'mse') 
    model.fit(X_train, y_train) 
    
    関連する問題