tensorflow正則化新增方法整理
一、基礎正則化函式
tf.contrib.layers.l1_regularizer(scale, scope=None)
返回一個用來執行L1
正則化的函式,函式的簽名是func(weights)
.
引數:
tf.contrib.layers.l2_regularizer(scale, scope=None)
先看看tf.contrib.layers.l2_regularizer(weight_decay)都執行了什麼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"I_am_a" ,initializer = tmp)
|
我們很容易可以模擬出tf.contrib.layers.l2_regularizer都做了什麼,不過會讓程式碼變醜。
以下比較完整實現L2 正則化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
二、新增正則化方法
a、原始辦法
正則化常用到集合,下面是最原始的新增正則辦法(直接在變數聲明後將之新增進'losses'集合或tf.GraphKeys.LOESSES也行):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
b、tf.contrib.layers.apply_regularization(regularizer, weights_list=None)
先看引數
- regularizer:就是我們上一步建立的正則化方法
- weights_list: 想要執行正則化方法的引數列表,如果為
None
的話,就取GraphKeys.WEIGHTS
中的weights
.
函式返回一個標量Tensor
,同時,這個標量Tensor
也會儲存到GraphKeys.REGULARIZATION_LOSSES
中.這個Tensor
儲存了計算正則項損失的方法.
tensorflow
中的Tensor
是儲存了計算這個值的路徑(方法),當我們run的時候,tensorflow
後端就通過路徑計算出Tensor
對應的值
現在,我們只需將這個正則項損失加到我們的損失函式上就可以了.
如果是自己手動定義
weight
的話,需要手動將weight
儲存到GraphKeys.WEIGHTS
中,但是如果使用layer
的話,就不用這麼麻煩了,別人已經幫你考慮好了.(最好自己驗證一下tf.GraphKeys.WEIGHTS
中是否包含了所有的weights
,防止被坑)
c、使用slim
使用slim會簡單很多:
1 2 3 4 |
|
此時新增集合為tf.GraphKeys.REGULARIZATION_LOSSES。