當前位置:編程學習大全網 - 源碼下載 - 如何給某壹層添加L2正則化

如何給某壹層添加L2正則化

tf.nn.l2_loss()和tf.contrib.layers.l2_regularizer(),使用示例如下:

import tensorflow as tf

weights = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32)

sess = tf.InteractiveSession()

# 計算的是所有元素的平方和再除以2

print(tf.nn.l2_loss(weights).eval()())

# 等價於

print(tf.contrib.layers.l2_regularizer(1.)(weights).eval())

# output: 45.5

接下來將介紹兩種方法將l2正則化項添加到損失函數後:

壹、遍歷trainable variables添加L2正則化項:

1.遍歷可訓練參數,將每個參數傳入tf.nn.l2_loss()進行計算並相加起來;

2.乘以weight_decay並與base_loss相加。

weight_decay = 0.001

base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))

l2_loss = weight_decay * tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])

loss = base_loss + l2_loss

註意:該過程對每個trainable variable都進行了l2正則化,包括權值w和偏置b。有種說法是如果對偏執b進行l2正則化將會導致欠擬合,壹般只需要對權值w進行正則化,所以來看第二種方法。

二、在構造網絡層時傳入l2正則化函數:

如下所示,在構造網絡層時,將'kernel_initializer'參數設為l2正則化函數,則tensorflow會將該權重變量(卷積核)的l2正則化項加入到集合 tf.GraphKeys.REGULARIZATOIN_LOSSES裏。

x = tf.layers.conv2d(x, 512, (3, 3),

padding='same',

activation=tf.nn.relu,

kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),

kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001)

在計算loss時使用tf.get_collection()來獲取tf.GraphKeys.REGULARIZATOIN_LOSSES集合,然後相加即可:

base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))

l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

loss = tf.add_n([base_loss] + l2_loss, name="loss")

歡迎補充指正。

  • 上一篇:順德源代碼網站
  • 下一篇:抄底攻擊指數源碼沒有前途。
  • copyright 2024編程學習大全網