我正在研究与cifar10示例类似的架构的CNN。我的CNN包含两个卷积层,每个卷积层之后是一个最大合并层,以及三个完全连接的层。除最后一层外,所有层均使用relu
激活功能。最终层产生的logit阶数为10^5
,因此运行softmax函数会导致一键编码。我试图以两种不同的方式解决这个问题。
首先,我只是将logit缩放为[-1, 1]
,即对其进行规范化。这似乎解决了问题,训练进行得很好,CNN产生了合理的结果。但是我不确定这是否是正确的方法,感觉标准化logit是无法解决最初问题的解决方法。
其次,我应用了体重衰减法。如果没有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))
那么,如何解决大型对数问题呢?最佳做法是什么?为什么施加重量衰减会导致更差的结果呢?
最佳答案
我认为tf.nn.l2_loss(var)
未被标准化,换句话说,您的wd
太大,或者不适合。
关于machine-learning - Tensorflow:重量衰减与Logits归一化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39279791/