【发布时间】:2017-01-08 11:02:39
【问题描述】:
我目前正在尝试进入 Tensorflow 和循环神经网络。我修改了“ptb_word_lm”示例,为 imdb 任务提供了一个模型。我将修改后的源代码推送到
https://github.com/MathiasKraus/LSTM_imdb
我使用的参数是:
num_layers = 2
num_steps = 50
hidden_size = 128
keep_prob = 0.5
batch_size = 32
vocab_size = 10000
网络定义是
self._input_data = tf.placeholder(tf.int32, [batch_size, num_steps])
self._target = tf.placeholder(tf.float32, [batch_size, n_classes])
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(size, forget_bias=0.0, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * config.num_layers, state_is_tuple=True)
self._initial_state = cell.zero_state(batch_size, tf.float32)
with tf.device("/cpu:0"):
embedding = tf.get_variable("embedding", [vocab_size, size], dtype=tf.float32)
inputs = tf.nn.embedding_lookup(embedding, self._input_data)
output, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=self._initial_state)
output = tf.transpose(output, [1, 0, 2])
last = tf.gather(output, int(output.get_shape()[0]) - 1)
softmax_w = tf.get_variable("softmax_w", [size, n_classes], dtype=tf.float32)
softmax_b = tf.get_variable("softmax_b", [n_classes], dtype=tf.float32)
logits = tf.matmul(last, softmax_w) + softmax_b
self._cost = cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, self._target))
self._train_op = tf.train.AdamOptimizer().minimize(cost)
训练部分看起来不错,但是模型在几个 epoch 后过度拟合。在过滤掉非常短和非常长的样本(我还没有使用填充)之后,我有大约 11k 样本用于训练。
你有什么想法,为什么这个模型过拟合这么快?或者您对参数设置有什么建议吗?
我将不胜感激。
编辑:要加载序列,我使用http://deeplearning.net/tutorial/code/imdb.py。加载数据后,我过滤掉比我想在 LSTM 中处理的步骤数短的序列。出于这个原因,我不需要填充零。我还将较长的序列剪切到指定的大小。
【问题讨论】:
-
至少将图表添加到问题中并更好地解释您构建序列的方式将提高您获得答案的机会
-
感谢您的评论。我编辑了我的帖子来描述我构建序列的方式。在弄清楚 TensorBoard 之后,我还将尝试添加图表。
-
通过添加图表,我的意思是将代码部分放在您专门定义模型的地方
标签: tensorflow recurrent-neural-network lstm imdb