【问题标题】:Neural network is not being trained, cross-entropy stays about the same神经网络没有被训练,交叉熵保持不变
【发布时间】:2018-05-07 17:21:31
【问题描述】:

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

架构如下:

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,标签大小为label_count。它有三个隐藏层,每个隐藏层有 128 个神经元。我正在关注语音数据集上的 TensorFlow 示例,该示例为其他所有内容提供了框架。在文档中,我需要做的就是包含我自己的神经网络架构,并且我的方法应该定义这些参数并返回 logits。

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

def create_single_fc_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 = tf.Variable(
      tf.truncated_normal([fingerprint_size, label_count], stddev=0.001))
  bias = tf.Variable(tf.zeros([label_count]))
  logits = tf.matmul(fingerprint_input, weights) + bias
  if is_training:
    return logits, dropout_prob
  else:
return logits

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

有什么想法吗?

提前谢谢你!

【问题讨论】:

  • 尝试增加随机初始化权重变量的标准差,例如stddev=0.1,并使用非零值初始化偏差,例如:tf.Variable(tf.constant(0.1, shape=[128])))
  • @openmark 谢谢!问题就在那里!

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


【解决方案1】:

您可能遇到了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]))) 

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 2014-04-20
    • 2019-09-15
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多