2017-02-19 5 views
3

私は2人の人の間で様々な会話を持つデータを持っています。各センテンスには、ある種の分類があります。私は会話の各文章を分類するためにNLPネットを使用しようとしています。私は畳み込みネットを試み、まともな結果を得ました。これまでの会話やLSTMネットがより良い結果を生み出すかもしれないと思ったのは、以前に言われたことがそれに続く大きな影響を与えるかもしれないからです。分類のためのLSTMニューラルネットワークの構成方法

Type of RNN nets

私は上記の構造に従っている場合、私は、多対多のをやっていることを前提としています。私のデータは似ています。

X_train = [[sentence 1], 
      [sentence 2], 
      [sentence 3]] 
Y_train = [[0], 
      [1], 
      [0]] 

データはword2vecを使用して処理されています。

この設定では、一度に1つのセンテンスのバッチをフィードすることになります。しかし、model.fitでshuffleがfalseに等しくない場合、LSTMネットはこの場合でも便利なのですか?対象の研究からは、1があまりにも

model.add(LSTM(88,return_sequence=True)) 

と出力層をLSTM層を変更する必要があり、多対多の構造を達成するためにするとする必要があるだろう...

model.add(TimeDistributed(Dense(1,activation='sigmoid'))) 

この構造に切り替えると、入力サイズにエラーが発生します。この要件を満たすためにデータを再フォーマットする方法や、新しいデータ形式を受け取るために埋め込みレイヤーを編集する方法がわかりません。

すべての入力をいただければ幸いです。または、より良い方法に関する提案があれば、私はそれらを聞いて嬉しいです!

答えて

3

あなたの最初の試みはよかったです。シャッフルは文章の間に行われ、訓練サンプルをシャッフルするだけで、常に同じ順序で来るとは限りません。文章内の単語はシャッフルされていません。

質問が正しく分からなかったのでしょうか?

EDIT

問題をよりよく理解した後、ここに私の命題があります。

データの準備:あなたが(彼らが重なることができます)n文章のブロックであなたのコーパスをスライス。 (number_blocks_of_sentences, n, number_of_words_per_sentence)のような形状なので、基本的にn文のブロックを含む2D配列のリストです。 nはあまりにも大きくすべきではありません。なぜなら、LSTMはトレーニング(勾配消滅)時には、シーケンス内の膨大な数の要素を処理できないからです。 あなたのターゲットは、形状の配列(number_blocks_of_sentences, n, 1)でなければなりません。そのため、あなたの文章の各文のクラスを含む2D配列のリストもあります。

モデル:

n_sentences = X_train.shape[1] # number of sentences in a sample (n) 
n_words = X_train.shape[2]  # number of words in a sentence 

model = Sequential() 
# Reshape the input because Embedding only accepts shape (batch_size, input_length) so we just transform list of sentences in huge list of words 
model.add(Reshape((n_sentences * n_words,),input_shape = (n_sentences, n_words))) 
# Embedding layer - output shape will be (batch_size, n_sentences * n_words, embedding_dim) so each sample in the batch is a big 2D array of words embedded 
model.add(Embedding(len(vocabaulary), embedding_dim, input_length = n_sentences * n_words)) 
# Recreate the sentence shaped array 
model.add(Reshape((n_sentences, n_words, embedding_dim))) 
# Encode each sentence - output shape is (batch_size, n_sentences, 88) 
model.add(TimeDistributed(LSTM(88))) 
# Go over lines and output hidden layer which contains info about previous sentences - output shape is (batch_size, n_sentences, hidden_dim) 
model.add(LSTM(hidden_dim, return_sequence=True)) 
# Predict output binary class - output shape is (batch_size, n_sentences, 1) 
model.add(TimeDistributed(Dense(1,activation='sigmoid'))) 
... 

これは良いスタートでなければなりません。

これは役に立ちます。

+0

LSTMレイヤーに一度に1単語ずつ供給されるとお考えですか?したがって、文がシャッフルされているにもかかわらず、文中の各単語はLSTMに別々に渡され、文全体の全体的なコンテキストを学習します。 – DJK

+0

私はフレーズを正しく質問しなかったのですが、申し訳ありません。データは会話であるため、前の文で言われたことは次の文に重さがあります。だから私は会話の流れを学び、各文章を分類するようにネットワークを設定しようとしています。それで私はreturn_sequenceを使用しようとしていたので、ネットワークは現在の文を分類しながら前の文についての情報を保持します。 – DJK

+0

LSTMに一連のベクトルが入力されます。あなたの場合は、単語埋め込みのシーケンスです。それは、あなたのケースの各センテンスに対して長さ88のベクトルを返します。これは密なレイヤーで1出力に減らされます。だから一度に1つの文しか気にしない。それがあなたが現在していることです。それはあなたがしたいことですか? –

関連する問題