2017-08-02 186 views
1

我對神經網絡相當陌生,並沒有太多的經驗。我的問題如下: 我有一個數組,每個數據點有877個不同的數據點,200個特徵。它是一個PCA簡化的TfIdf矩陣,其中每行對應於我的數據集中的一段文本(如段落本身)。我正在嘗試爲此數據(類1或0)創建二進制分類器。我已經成功地得到了從低到80%的準確率中旬線性SVM,並且約80%的準確度有一個簡單的密集NN如下: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的是自然語言處理很受歡迎。我試着以同樣的方式設置一個。但是,我知道這應該是我的數據的第三維。我很困惑這是如何工作的。我根據這個問題編寫代碼:LSTM with keras這個提問者在他的數據中沒有3維。他的工作究竟只有2個維度?我的代碼如下:

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]) 

有人能解釋一下這是什麼不同,爲什麼我不斷收到此錯誤:ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (877, 200)

我是不是真的需要第三維?如果是這樣,我應該如何將我的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) 

不知道該從哪裏出發。

----------------------------編輯#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),我認爲這將是首選值,但它期望(無,877,200),我發現它很腥。有任何想法嗎? – spencerktm30

+0

這裏「無」代表批量大小。 –

回答

0

RNN的三維通常是[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句子。