在創建優化器對象集參數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_constraint
到b
(偏置)參數
謝謝,但此說 - #所有參數梯度將被剪輯到 #最大值0.5和 #最小值-0.5。 - 這是否意味着它是漸變,而不是權重值本身,正在被剪裁? – JDS
對不起,我太快回復,沒有檢查剪輯是在權重。將相應地更新答案。 – indraforyou
好的沒問題,你的更新答案看起來太棒了!謝謝你的好友 – JDS