如何在Tensorflow中提高LSTM的准确度

时间:2018-05-22 13:55:21

标签: tensorflow machine-learning lstm 3d-reconstruction

我正在试图弄清楚如何减少LSTM中的错误。这是一个奇怪的用例,因为我们不是分类,而是采用短列表(最多32个元素)并输出一系列实数,范围从-1到1 - 表示角度。基本上,我们想从氨基酸输入重建短蛋白质环。

过去我们的数据集中有冗余数据,因此报告的准确性不正确。由于删除了冗余数据,我们的验证准确性变得更糟,这表明我们的网络已经学会记住最常见的例子。

我们的数据集是10,000项,在火车,验证和测试之间分成70/20/10。我们使用双向LSTM如下:

x = tf.cast(tf_train_dataset, dtype=tf.float32)
output_size = FLAGS.max_cdr_length * 4
dmask = tf.placeholder(tf.float32, [None, output_size], name="dmask")
keep_prob = tf.placeholder(tf.float32, name="keepprob")
sizes = [FLAGS.lstm_size,int(math.floor(FLAGS.lstm_size/2)),int(math.floor(FLAGS.lstm_size/     4))]
single_rnn_cell_fw = tf.contrib.rnn.MultiRNNCell( [lstm_cell(sizes[i], keep_prob, "cell_fw" + str(i)) for i in range(len(sizes))])
single_rnn_cell_bw = tf.contrib.rnn.MultiRNNCell( [lstm_cell(sizes[i], keep_prob, "cell_bw" + str(i)) for i in range(len(sizes))])

length = create_length(x)
initial_state = single_rnn_cell_fw.zero_state(FLAGS.batch_size, dtype=tf.float32)
initial_state = single_rnn_cell_bw.zero_state(FLAGS.batch_size, dtype=tf.float32)

outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_fw=single_rnn_cell_fw, cell_bw=single_rnn_cell_bw, inputs=x, dtype=tf.float32, sequence_length = length)
output_fw, output_bw = outputs
states_fw, states_bw = states
output_fw = last_relevant(FLAGS, output_fw, length, "last_fw")
output_bw = last_relevant(FLAGS, output_bw, length, "last_bw")
output = tf.concat((output_fw, output_bw), axis=1, name='bidirectional_concat_outputs')

test = tf.placeholder(tf.float32, [None, output_size], name="train_test")
W_o = weight_variable([sizes[-1]*2, output_size], "weight_output")
b_o = bias_variable([output_size],"bias_output")
y_conv = tf.tanh( ( tf.matmul(output, W_o)) * dmask, name="output")

基本上,我们使用3层LSTM,每层25,128和64个单元。我们采用前向和后向传递的最后一步并将它们连接在一起。它们进入最终的完全连接层,以我们需要的方式呈现数据。我们使用掩码设置这些步骤,我们不需要为零。

我们的成本函数再次使用掩码,并取平方差的均值。我们从测试数据构建掩码。要忽略的值设置为-3.0。

def cost(goutput, gtest, gweights, FLAGS):
    mask = tf.sign(tf.add(gtest,3.0))
    basic_error = tf.square(gtest-goutput) * mask
    basic_error = tf.reduce_sum(basic_error)
    basic_error /= tf.reduce_sum(mask)
    return basic_error

为了训练网,我使用了各种优化器。使用AdamOptimizer获得的分数最低。其他的,如Adagrad,Adadelta,RMSProp倾向于平缓0.3 / 0.4误差,这不是特别好。

我们的学习率为0.004,批量大小为200.我们使用0.5概率辍学层。

我尝试添加更多图层,更改学习率,批量大小,甚至数据的表示。我尝试了批量正则化,L1和L2权重正则化(尽管可能不正确),我甚至考虑改用转换网络方法。

似乎没有任何区别。似乎有效的是改变优化器。亚当看起来更吵,但它确实比其他优化者更接近。

enter image description here

我们需要降低到接近0.05或0.01的值。有时,训练错误接触0.09,但验证不符合。到目前为止,我已经运行了大约500个时代的网络(大约8个小时),并且它往往会在0.2左右的验证错误。

我不太确定下一步该尝试什么。衰弱的学习率可能有所帮助,但我怀疑我需要做一些更基本的事情。它可能像代码中的错误一样简单 - 我需要仔细检查屏蔽,

0 个答案:

没有答案