2017-04-18 97 views
1

我有一些培訓數據x_trainx_train的一些相應標籤,名爲y_train。下面是如何x_trainy_train構造:LSTM with keras

train_x = np.array([np.random.rand(1, 1000)[0] for i in range(10000)]) 
train_y = (np.random.randint(1,150,10000)) 

train_x有10000行和1000列的每一行。 train_y對於train_x中的每個樣本具有介於1和150之間的標籤並且代表每個train_x樣本的代碼。

我也有一個樣本,稱爲樣本,這是1行1000列,我想用這個LSTM模型預測。這個變量被定義爲

sample = np.random.rand(1,1000)[0] 

我想訓練和預測使用Keras的這個數據的LSTM。我想採用這個特徵向量,並使用這個LSTM來預測範圍從1到150的代碼之一。我知道這些是隨機數組,但是我不能發佈我擁有的數據。我嘗試了以下方法,我認爲應該可以工作,但是我面臨一些問題

model = Sequential() 
    model.add(LSTM(output_dim = 32, input_length = 10000, input_dim = 1000,return_sequences=True)) 
    model.add(Dense(150, activation='relu')) 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    history = model.fit(train_x, train_y, 
       batch_size=128, nb_epoch=1, 
       verbose = 1) 
    model.predict(sample) 

任何對此管道的幫助或調整都會很好。我不確定output_dim是否正確。我想在1000維數據的每個樣本上傳遞LSTM,然後再生成1到150範圍內的特定代碼。謝謝。

回答

1

我看到至少有三件事情你需要改變:

  1. 改變這一行:

    model.add(Dense(150, activation='relu')) 
    

    到:

    model.add(Dense(150, activation='softmax')) 
    

    的離開'relu'的激活使你的輸出無界的,而它需要有一個概率解釋(如你使用categorical_crossentropy)。

  2. 變動損失或目標:

    當您使用categorical_crossentropy你需要改變你的目標是一個獨熱編碼向量長度150的另一種方式是讓你的目標,但改變虧損到sparse_categorical_crossentropy

  3. 更改目標範圍:

    Keras具有基於0的數組索引(如在PythonCC++所以你的值應在範圍[0, 150)代替[1, 150]

+0

所以當我。改變爲一個長度爲150的熱點編碼向量我在每個地方都會得到一串小數點作爲預測,這些小數點代表什麼?它們是1,2,3級,...,150級的概率嗎? –

+0

是的 - 但記住ab取出這個基於0的數組索引。第1類的概率是指數0, - 第2類 - 指數1等 –

+0

好的非常感謝你!你可以用k熱點編碼矢量做這個嗎?假設對於樣本1,我們有[5,8,9],而樣本2我們有[130,11,12,5,9],其中有不同數量的標籤? –