在訓練深度學習網絡時,在損失函數上加上正則項是防止過擬合的一個重要方法。本文介紹兩種在TensorFlow中如何加入正則化項的方法, 但無論何種方法大的邏輯都是:創建一個正則化方法;然後將這個正則化方法應用到變量上。
第一種方法:
這種方法對應與tf.get_variable初始化變量的方法。
步驟一:創建正則化方法:
regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
scale對應Loss函數中的α, 增加正則化的目標函數如下:
其中α∈[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。當然也可以加入別的集合,只要在函數中指明要正則化的變量集合名字即可。
閱讀更多 半杯茶的小酒杯 的文章