TensorFlow post-LSTM完全连接的层输出返回相同的值

时间:2017-08-18 09:34:23

标签: tensorflow neural-network lstm recurrent-neural-network

我正在尝试使用带有三个标签的数据集训练序列到序列的LSTM模型:[1, 0]用于检测 class 1 [0, 1]用于检测< em> class 2 和[0, 0]用于检测任何内容。在从LSTM网络获得输出后,我通过以下方式将完全连接的层应用于每个单元的输出:

outputs, state = tf.nn.dynamic_rnn(cell, input)
# Shape of outputs is [batch_size, n_time_steps, n_hidden]

# As matmul works only on matrices, reshape to get the
# time dimension into the batch dimension
outputs = tf.reshape(outputs, [-1, n_hidden])
# Shape is [batch_size * n_time_steps, n_hidden]

w = tf.Variable(tf.truncated_normal(shape=[n_hidden, 2], stddev=0.1))
b = tf.Variable(tf.constant(0.1, shape=[2]))
logit = tf.add(tf.matmul(outputs, w), b, name='logit')

# Reshape back to [batch_size, n_time_steps, 2]
logit = tf.reshape(logit, [batch_size, -1, 2])

在输出中,我应用tf.nn.sigmoid_cross_entropy_with_logits并减少平均值。该模型似乎可以很好地实现高精度和回忆,除了在几乎所有情况下它输出[0, 0][1, 1]的事实。完全连接层的两个logit输出始终具有非常相似的值(但不相同)。这有效地提高了50%的精确度,该模型收敛于(但不是上述百分之几)。

现在,我的直觉会告诉我,训练步骤中的某些内容肯定是错误的,并且两个完全连接的输出都是针对相同的数据进行训练的,但奇怪的是,当我用tf.contrib中预先打包的实现替换我自己的实现时:

outputs, state = tf.nn.dynamic_rnn(cell, input)
logit = tf.contrib.layers.fully_connected(outputs, 2, activation_fn=None)

不改变其他任何东西,模型开始正常训练。现在,显而易见的解决方案是使用该实现,但为什么第一个不起作用?

0 个答案:

没有答案