我已经看到了一些关于卷积神经网络代码的学习。我不理解这段代码的下一部分。
loss = tf.reduce_sum(tf.nn.l2_loss(tf.subtract(train_output, train_gt)))
for w in weights:
loss += tf.nn.l2_loss(w)*1e-4
第一行是可以理解的。它将学习的结果与标签进行比较,然后表示差异的平方。这就是损失的定义。但是我不理解后面的代码:for w in weights:
!!
这里w
是10个权重和偏差的列表。因此len(w)
是20(w10 + b10)
。但是为什么这段代码为什么要计算w
的平方并乘以1e-4
来增加损失呢?
学习过程是否必要?
答案 0 :(得分:2)
这是您拥有的公式:
tf.subtract(train_output, train_gt)
在两个张量train_output
和train_gt
之间进行逐元素减法。tf.nn.l2_loss(tf.subtract(train_output, train_gt))
从(1)计算所得张量的l2-范数。tf.reduce_sum(tf.nn.l2_loss(tf.subtract(train_output, train_gt)))
对所有维度执行归约求和(例如,批次中有多个样品-公式中有N
个样品)。for w in weights: loss += tf.nn.l2_loss(w)*1e-4
添加l2正则项(模型中所有l2归一化权重的平方和)。但是为什么此代码计算w的平方并乘以1e-4来增加损失呢?这是学习的必要课程吗?
它惩罚您权重的较大值,并将您的解决方案(按权重)限制在某些边界区域。 有必要吗?有时是,有时不是。没有简短的答案。首先阅读以下内容: