為防止網路過擬合,在損失函式上增加乙個網路引數的正則化項是乙個常用方法,下面介紹如何在tensorflow中新增正則化項。
tensorflow中對引數使用正則項分為兩步:
下面詳細介紹:
step1: 建立乙個正則化方法
regularizer_l1 = tf.contrib.layers.l1_regularizer(scale, scope=none)
引數:
返回:可選擇的其他正則化方法:
regularizer_l2 = tf.contrib.layers.l2_regularizer(scale, scope=none)
regularizer__sum = tf.contrib.layers.sum_regularizer(regularizer_list, scope=none)
其中,regularizer_l2中引數的定義與regularizer_l1 相同。
regularizer_sum 是乙個可以執行多種(個)正則化的函式.意思是,建立乙個正則化方法,這個方法是多個正則化方法的混合體.,regularizer_list是乙個regularizer的列表,如
regularizer_list = [regularizer_l1,regularizer_l2]
step2: 將定義的正則方法(函式/物件),應用到引數上
方法1:
引數:函式返回乙個標量tensor,同時,這個標量tensor也會儲存到graphkeys.regularization_losses中.這個tensor儲存了計算正則項損失的方法.
tensorflow中的tensor是儲存了計算這個值的路徑(方法),當我們run的時候,tensorflow後端就通過路徑計算出tensor對應的值。
現在,我們只需將這個正則項損失加到我們的損失函式上就可以了.
如果是自己手動定義weight的話,需要手動將weight儲存到graphkeys.weights中,但是如果使用layer的話,就不用這麼麻煩了,別人已經幫你考慮好了.(最好自己驗證一下tf.graphkeys.weights中是否包含了所有的weights,防止被坑)
方法2(更常用)
在使用tf.get_variable()和tf.variable_scope()的時候,你會發現,它倆中有regularizer形參.如果傳入這個引數的話,那麼variable_scope內的weights的正則化損失,或者weights的正則化損失就會被新增到graphkeys.regularization_losses中
import tensorflow as tf
from tensorflow.contrib import layers
# 在tf.variable_scope()中加入regulizer
regularizer_l1 = layers.l1_regularizer(0.1)
with tf.variable_scope('var1', regularizer=regularizer_l1):
weight1= tf.get_variable('weight1', shape=[8])
with tf.variable_scope('var2',regularizer=regularizer_l1):
weight2 = tf.get_variable('weight2', shape=[8])
regularization_loss = tf.reduce_sum(tf.get_collection(tf.graphkeys.regularization_losses))
# 列印正則項包含的變數
print(tf.get_collection(tf.graphkeys.regularization_losses))
備註:正則化項常用於weights,而不用於bias,具體分析見:tensorflow之四—正則化
參考:
tensorflow中的正則化
import tensorflow as tf import tensorflow.contrib as contrib weight tf.constant 1,2 3,4 dtype tf.float32 with tf.session as sess init tf.global variab...
keras中新增正則化
正則項在優化過程中層的引數或層的啟用值新增懲罰項,這些懲罰項將與損失函式一起作為網路的最終優化目標 懲罰項基於層進行懲罰,目前懲罰項的介面與層有關,但dense,conv1d,conv2d,conv3d具有共同的介面。這些層有三個關鍵字引數以施加正則項 from keras import regul...
TensorFlow正則化小結
在設計深度學習模型的時候,我們經常需要使用正則化 regularization 技巧來減少模型的過擬合效果,例如 l1 正則化 l2 正則化等。在keras中,我們可以方便地使用三種正則化技巧 那麼,我們應該如何使用這三種正則化技巧呢?以keras中的dense層為例,我們發現有以下三個引數 這三個...