Tensorflow實戰-TensorFlow的正則化實現

在訓練深度學習網絡時,在損失函數上加上正則項是防止過擬合的一個重要方法。本文介紹兩種在TensorFlow中如何加入正則化項的方法, 但無論何種方法大的邏輯都是:創建一個正則化方法;然後將這個正則化方法應用到變量上。

第一種方法:

這種方法對應與tf.get_variable初始化變量的方法。

步驟一:創建正則化方法:

regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)

scale對應Loss函數中的α, 增加正則化的目標函數如下:

Tensorflow實戰-TensorFlow的正則化實現

其中α∈[0,∞)是權衡範數懲罰項Ω和標準目標函數J(θ;X,y)相對貢獻的超參數。α=0表示沒有正則化,α越大,對應的正則化懲罰越大。

步驟二: 將正則化的方法應用到變量上

weights = tf.get_variable(

name="weights",

regularizer=l2_reg,

...

)

步驟三: 定義加入了正則化懲罰項的目標函數

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

loss += tf.add_n(reg_variables)

第二種方法

這種方法對應與tf.Variable初始化變量的方法。

步驟一: 創建一個變量

W = tf.Variable(tf.random_normal([128, 100, 100, 3]))

步驟二: 將該變量加入tf.GraphKeys.WEIGHTS集合

tf.add_to_collection(tf.GraphKeys.WEIGHTS, W)

步驟三: 對tf.GraphKeys.WEIGHTS集合中所有變量進行正則化並求和,加入loss

regularizer = tf.contrib.layers.l2_regularizer(scale)

reg_term = tf.contrib.layers.apply_regularization(regularizer)

loss = loss + reg_term

tf.contrib.layers.apply_regularization(regularizer, weights_list=None)函數其實有兩個參數,第一個是正則化方法,第二個是想要執行正則化方法的變量列表,如果為None,則默認取tf.GraphKeys.WEIGHTS中的weight。當然也可以加入別的集合,只要在函數中指明要正則化的變量集合名字即可。


分享到:


相關文章: