2017-08-02 31 views
1

私はニューラルネットワークにはかなり新しく、それほどの経験はありません。私の問題は以下の通りです: 私はアレイがあり、877の異なるデータポイント、200のデータポイントがあります。これは、PCAのTfIdfで縮小された行列です。各行は、自分のデータセットの1ブロックのテキスト(段落自体)に対応しています。私はこのデータ(クラス1または0)のバイナリクラシファイアを作成しようとしています。次のように私は正常に簡単な高密度NNと半ば線形SVMと80%の正確さ、および約80%の精度で低持っている:Keras LSTM入力次元

model = Sequential() 
    len = np.shape(X_train)[0] 
    dim = np.shape(X_train)[1] 
    model.add(Dense(100, input_dim=dim, activation='relu')) 
    model.add(Dense(25, activation='relu')) 
    model.add(Dense(1, activation='sigmoid')) 
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy']) 
    #set up stopping 
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto') 
    #fit the model to the data 
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping]) 

は、だから私はRNNのは、自然言語処理のために非常に人気があることが分かりました。私は同じ様式で1つを設定しようとしました。しかし、自分のデータに3次元があるはずです。私はこれがどのように機能するかについて非常に混乱しています。私はこの質問に基づいてコードを書いた:LSTM with kerasこの質問者は彼のデータに3次元を持たない。彼の仕事はどのくらい正確に2次元だけですか?次のように私のコードは次のとおりです。ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (877, 200)

は私が実際に第3次元が必要です:

model = Sequential() 
    len = np.shape(X_train)[0] 
    dim = np.shape(X_train)[1] 
    model.add(LSTM(output_dim = 100, input_length=len, input_dim = dim, return_sequences=True)) 
    model.add(Dense(25, activation='relu')) 
    model.add(Dense(1, activation='sigmoid')) 
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy']) 
    #set up stopping 
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto') 
    #fit the model to the data 
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping]) 

誰かが、これは何が違うのと、なぜ私はこのエラーを取得しておく方法を説明していただけますか?もしそうなら、2D(データポイント、フィーチャ)アレイを3Dに変換する方法についてはどうすればよいですか?御時間ありがとうございます。

----------------------------編集----------------

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1]) 
    t_steps = np.shape(X_train)[1] 
    dim = np.shape(X_train)[2] 
    print(length,',',dim) 
    model.add(LSTM(output_dim = 100, input_shape = (t_steps,dim), return_sequences=True)) 

と(t_steps =次のエラーを取得しています:------------------

は、だから今、私はこれに私のコードを変更しました= 1、dim == 200)

ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (877, 1) 

ここからどこに行くのかわかりません。

---------------------------- EDIT#2 -------------- --------------------

return_sequences = Falseと設定すると分かります。今私の正確さは恐ろしい47%です。

+0

'X_train = X_train.reshape(X_train.shape [0]、1、X_train.shape [1])'を試しましたか? –

+0

@MaximilianPetersそれは私が優先価値になると信じている形に変わった(877,1,200)が、私はそれが釣果を発することを期待している(None、877,200)。何か案は? – spencerktm30

+0

ここで、「なし」はバッチサイズを表します。 –

答えて

0

RNNの3つの次元は、通常、[num_samples, max_timesteps, num_features]または[max_timesteps, num_samples, num_features]です(たとえば、tf.nn.dynamic_rnnを参照)。

コードにX[num_data_points, num_features]が含まれている可能性があります。これは時間軸がないため、LSTM層が期待するものではありません。

LSTM on the IMDB sentiment classification task with Kerasをチェックして、LSTMで文章を処理する方法を確認することをお勧めします。

関連する問題