神经网络没有被训练,交叉熵保持不变

时间:2018-05-07 08:27:07

标签: python tensorflow machine-learning neural-network deep-learning

我在TensorFlow中编写了以下多层感知器模型,但它不是训练。准确度保持在9%左右,这相当于随机猜测,交叉熵保持在2.56左右,变化不大。

架构如下:

0.444560185185185 

输入大小为def create_model(fingerprint_input, model_settings, is_training): if is_training: dropout_prob = tf.placeholder(tf.float32, name='dropout_prob') fingerprint_size = model_settings['fingerprint_size'] label_count = model_settings['label_count'] weights_1 = tf.Variable(tf.truncated_normal([fingerprint_size, 128], stddev=0.001)) weights_2 = tf.Variable(tf.truncated_normal([128, 128], stddev=0.001)) weights_3 = tf.Variable(tf.truncated_normal([128, 128], stddev=0.001)) weights_out = tf.Variable(tf.truncated_normal([128, label_count], stddev=0.001)) bias_1 = tf.Variable(tf.zeros([128])) bias_2 = tf.Variable(tf.zeros([128])) bias_3 = tf.Variable(tf.zeros([128])) bias_out = tf.Variable(tf.zeros([label_count])) layer_1 = tf.matmul(fingerprint_input, weights_1) + bias_1 layer_1 = tf.nn.relu(layer_1) layer_2 = tf.matmul(layer_1, weights_2) + bias_2 layer_2 = tf.nn.relu(layer_2) layer_3 = tf.matmul(layer_2, weights_3) + bias_3 layer_3 = tf.nn.relu(layer_3) logits = tf.matmul(layer_3, weights_out) + bias_out if is_training: return logits, dropout_prob else: return logits ,标签大小为fingerprint_size。它有三个隐藏层,每层有128个神经元。我正在关注语音数据集上的TensorFlow示例,该数据集为其他所有内容提供了框架。在文档中,我需要做的就是包含我自己的神经网络架构,我的方法应该定义那些参数并返回logits。

当我训练另一个具有相同输入和输出的预定义架构时,神经网络训练。但这个不是训练。这是一个预定义的架构:

label_count

前15000步的学习率为0.001,后3000步的学习率为0.0001。这些是默认值。我也试过0.01和0.001,但结果相同。我认为问题出现在上述实现中。

有什么想法吗?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

您可能遇到vanishing gradient problem,您的变量初始化为非常小的值(由stddev参数控制),它适用于一个图层,但如果是多个图层,则会导致渐变到在反向传播期间消失。 尝试增加随机初始化的权重变量的标准偏差,例如

weights_n = tf.Variable(tf.truncated_normal([a, b], stddev=0.1))

并使用非零值(如

)初始化偏差
bias_n = tf.Variable(tf.constant(0.1, shape=[b])))