繁体   English   中英

神经网络未经训练,交叉熵保持不变

[英]Neural network is not being trained, cross-entropy stays about the same

我已经在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参数控制),它仅适用于一层,但如果是多层,则在反向传播期间会导致梯度消失。 尝试增加随机初始化的权重变量的标准偏差,例如

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

并使用非零值初始化偏差,例如

bias_n = tf.Variable(tf.constant(0.1, shape=[b]))) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM