2016-02-08 120 views
1

我試圖解決實驗3a,進行原始LSTM紙這裏描述:http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf與tensorflow LSTM和失敗Tensorflow LSTM嘈雜序列

從紙:該任務是觀察,然後進行分類的輸入序列。有兩類,每類以概率0.5出現。只有一條輸入線。只有前N個實值序列元素傳達關於類的相關信息。位置t> N處的序列元素由均值爲零且方差爲0.2的高斯生成。

他在論文中描述的網絡體系結構: 「我們使用一個3輸入單元,1個輸出單元和3個大小爲1的單元塊的網絡。輸出層僅接收來自存儲單元的連接。存儲單元和門單元接收來自輸入單元,存儲單元和門單元的輸入,並且具有偏置權重。門單元和輸出單元在[0; 1],h in [-1; 1]中爲logistic sigmoid, -2; 2]「

我嘗試用TST = 100和N = 3的3個隱藏單元的LSTM重現它,但失敗了。

我使用的在線培訓(即更新每個序列後的權重)作爲原稿紙張

描述我的代碼的核心是如下:

self.batch_size = batch_size = config.batch_size 
hidden_size = 3 
self._input_data = tf.placeholder(tf.float32, (1, T)) 
self._targets = tf.placeholder(tf.float32, [1, 1]) 
lstm_cell = rnn_cell.BasicLSTMCell(hidden_size , forget_bias=1.0) 
cell = rnn_cell.MultiRNNCell([lstm_cell] * 1) 
self._initial_state = cell.zero_state(1, tf.float32) 
weights_hidden = tf.constant(1.0, shape= [config.num_features, config.n_hidden]) 

準備輸入

inputs = [] 
for k in range(num_steps): 
    nextitem = tf.matmul(tf.reshape(self._input_data[:, k], [1, 1]) , weights_hidden) 
    inputs.append(nextitem) 

outputs, states = rnn.rnn(cell, inputs, initial_state=self._initial_state) 

使用最後一個輸出

pred = tf.sigmoid(tf.matmul(outputs[-1], tf.get_variable("weights_out", [config.n_hidden,1])) + tf.get_variable("bias_out", [1])) 

self._final_state = states[-1] 
self._cost = cost = tf.reduce_mean(tf.square((pred - self.targets))) 
self._result = tf.abs(pred[0, 0] - self.targets[0,0]) 

optimizer = tf.train.GradientDescentOptimizer(learning_rate = config.learning_rate).minimize(cost) 

任何想法爲什麼它不能學習?

我的第一個直覺是爲每個班級創建2個輸出,但在論文中他特別提到了只有一個輸出單元。

謝謝

回答

0

看來我需要忘記_>> 1.0。對於較長的序列,網絡無法使用默認的forget_bias,例如,我需要使用forget_bias = 2.1