Tensorflow:权重衰减与 logits 归一化
Posted
技术标签:
【中文标题】Tensorflow:权重衰减与 logits 归一化【英文标题】:Tensorflow: weight decay vs logits normalization 【发布时间】:2017-01-09 19:49:02 【问题描述】:我正在研究与 cifar10 示例中类似架构的 CNN。我的 CNN 由两个卷积层组成,每个卷积层后面跟着一个最大池化层和三个全连接层。除最后一层外,所有层都使用relu
激活函数。最后一层产生10^5
的logits,因此运行softmax 函数会导致one-hot 编码。我试图以两种不同的方式解决这个问题。
首先,我只是将 logits 重新调整为 [-1, 1]
,即将它们标准化。这似乎解决了问题,训练进行得很好,CNN 产生了合理的结果。但是我不确定这是否是正确的方法,感觉就像规范化 logits 是一种解决方法,并不能解决最初的问题。
其次,我应用了重量衰减。如果没有 logits 归一化,交叉熵从大值开始,但随着总重量损失的下降而稳步下降。然而,准确性会产生一种奇怪的模式。此外,使用权重衰减训练的网络产生的结果比使用 logits 归一化的网络要差得多。
重量衰减如下:
def weight_decay(var, wd):
weight_decay = tf.mul(tf.nn.l2_loss(var), wd, name='weight_loss')
tf.add_to_collection('weight_losses', weight_decay)
准确度
predictions = tf.nn.softmax(logits)
one_hot_pred = tf.argmax(predictions, 1)
correct_pred = tf.equal(one_hot_pred, tf.argmax(y, 1))
accuracy_batch = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
那么应该如何解决大数量级 logits 的问题呢?最佳做法是什么?应用重量衰减产生更差结果的原因可能是什么?
【问题讨论】:
【参考方案1】:在我看来,tf.nn.l2_loss(var)
没有被规范化,换句话说,可能你的wd
太大了,或者不合适。
【讨论】:
以上是关于Tensorflow:权重衰减与 logits 归一化的主要内容,如果未能解决你的问题,请参考以下文章
Hulu机器学习问题与解答系列 | 二十三:神经网络训练中的批量归一化
tf.nn.sigmoid_cross_entropy_with_logits 它是不是共享权重?
[tensorflow] tf.nn.sparse_softmax_cross_entropy_with_logits的使用