2016-02-08 123 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