2017-02-16 37 views
1

我正在嘗試使用Keras來實現需要重量裁剪的算法的一部分,即限制梯度更新後的重量值。到目前爲止,我還沒有通過網絡搜索找到任何解決方案Keras ML庫:如何在漸變更新後進行重量裁剪? TensorFlow後端

爲背景,這與該WGANs算法做:

https://arxiv.org/pdf/1701.07875.pdf

如果你看一下算法1第8頁上,你會看到以下內容:

enter image description here

我已經強調了我試圖在Keras中實現的幾行:在計算用於更新網絡權重的梯度後,我想確保所有權重都在一些值之間剪切[-c, c]我可以設置。

我怎麼能在Keras做這件事?

僅供參考我正在使用TensorFlow後端。我不介意現在挖掘事物並添加混亂的快速修復。

謝謝!

回答

2

在創建優化器對象集參數clipvalue時。 它會做你想要的。

# all parameter gradients will be clipped to 
# a maximum value of 0.5 and 
# a minimum value of -0.5. 
rsmprop = RMSprop(clipvalue=0.5) 

,然後使用這個對象來進行模型編譯

model.compile(loss='mse', optimizer=rsmprop) 

更多參考檢查:here

此外,我更喜歡使用clipnorm而不是clipvalue,因爲使用clipnorm時,優化保持穩定。例如,假設你有2個參數,梯度爲[0.1, 3]。通過使用clipvalue,梯度將變爲[0.1,0.5],即有可能急劇下降最陡下降的方向。雖然clipnorm沒有類似的問題,因爲所有的梯度將被適當地縮放並且方向將被保留,並且一直確保對梯度幅度的約束。

編輯:問題問權限幅梯度不削波:上權重

Gradiant削波並不是keras代碼部分。但maxnorm上的權重約束是。檢查here

說了起來,它可以很容易地實現。這裏是一個非常小的例子:

from keras.constraints import Constraint 
from keras import backend as K 

class WeightClip(Constraint): 
    '''Clips the weights incident to each hidden unit to be inside a range 
    ''' 
    def __init__(self, c=2): 
     self.c = c 

    def __call__(self, p): 
     return K.clip(p, -self.c, self.c) 

    def get_config(self): 
     return {'name': self.__class__.__name__, 
       'c': self.c} 

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense 

model = Sequential() 
model.add(Dense(30, input_dim=100, W_constraint = WeightClip(2))) 
model.add(Dense(1)) 

model.compile(loss='mse', optimizer='rmsprop') 

X = np.random.random((1000,100)) 
Y = np.random.random((1000,1)) 

model.fit(X,Y) 

我測試了上述代碼的運行,但沒有測試約束的有效性。您可以通過使用model.get_weights()model.layers[idx].get_weights()獲得訓練後的模型權重並檢查其是否遵守約束來實現。

注意:約束不會添加到所有模型權重中。只是特定層的權重,利用其也W_constraint增加了約束至W PARAM和b_constraintb(偏置)參數

+0

謝謝,但此說 - #所有參數梯度將被剪輯到 #最大值0.5和 #最小值-0.5。 - 這是否意味着它是漸變,而不是權重值本身,正在被剪裁? – JDS

+0

對不起,我太快回復,沒有檢查剪輯是在權重。將相應地更新答案。 – indraforyou

+0

好的沒問題,你的更新答案看起來太棒了!謝謝你的好友 – JDS

相關問題