2016-06-21 30 views
1

我是keras的新手,儘管閱讀了文檔和keras中的examples文件夾,但我仍在爲如何將所有東西放在一起而苦苦掙扎。如何將輸入按入Keras框架?

特別是,我想從一個簡單的任務開始:我有一個令牌序列,每個令牌只有一個標籤。我有很多像這樣的訓練數據 - 實際上是無限的,因爲我可以根據需要生成更多的訓練對。

我想建立一個網絡來預測標記給定的標記。令牌數量必須始終與標籤數量相同(一個令牌=一個標籤)。

我想這是基於所有周圍的令牌的,說在同一行或句子或窗口 - 不只是在前面的令牌。

我多遠得到了我自己:

現在掙扎:

  1. 所有input_diminput_shape參數......因爲每個句子都有不同長度(不同數量的令牌,並在它的標籤),我應該把作爲input_dim爲輸入層?
  2. 如何告知網絡使用整個令牌句子進行預測,而不僅僅是一個令牌?如何根據標記序列預測標籤的整個序列,而不僅僅是基於先前標記的標籤?
  3. 是否將文本拆分爲句子或窗口有意義?或者我可以將整個文本的矢量作爲單個序列傳遞給它?什麼是「序列」?
  4. 什麼是「時間片」和「時間步」?文件不斷提及,我不知道這是如何與我的問題。什麼是keras的「時間」?

基本上我無法連接像「時間」或「序列」文檔的概念到我的問題。像Keras#40這樣的問題並沒有讓我更聰明。

指向Web或代碼示例上的相關示例將非常感謝。不尋找學術文章。

謝謝!

回答

2
  1. 如果你有不同的長度,你既可以墊,或用狀態RNN實施方式,其中激活保存批次之間的序列。前者是最簡單和最常用的。

  2. 如果您希望在使用RNN時使用未來的信息,您希望使用雙向模型,在這種模式下連接兩個相反方向的RNN。例如,RNN將使用所有先前信息的表示。預測。

  3. 如果你有很長的句子,那麼抽樣一個隨機的子序列並訓練它可能是有用的。 Fx 100個字符。這也有助於過度配合。

  4. 時間步是你的代幣。句子是一系列字符/標記。

我寫了一個我如何理解你的問題的例子,但它沒有測試,所以它可能無法運行。如果可能,建議使用熱門編碼,而不是使用整數來表示數據,然後使用binary_crossentropy而不是mse

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)