オプティマイザオブジェクトを作成するときに、パラメータclipvalue
を設定します。 それはあなたが望むものを正確に行います。 here:
# 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)
をコンパイルモデルのこのオブジェクトを使用します。
clipnorm
をclipvalue
よりも使用することをお勧めします。clipnorm
では最適化が安定しているためです。たとえば、2つのパラメータがあり、グラデーションが[0.1, 3]
になったとします。 clipvalue
を使用することによって、勾配は[0.1,0.5]になります。つまり、最も急な傾斜の方向が大幅に変化する可能性があります。 clipnorm
はすべての勾配が適切に尺度変更され、勾配の大きさに対する制約を確実にしながら方向が保持されるので、同様の問題はありません。
編集:
グラジエント型の重みにクリッピング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
からb_constraint
(バイアス)のparam
おかげに制約追加しますが、これは言う - #は、すべてのパラメータの勾配が #最大値にクリップされます0.5と #最小値は-0.5です。 - これは、それが勾配であり、重み値自体ではなく、切り取られていることを意味するのではありませんか? – JDS
申し訳ありませんが、私は返信するのが速すぎて、重量がクリッピングであることを確認していませんでした。それに応じて回答が更新されます。 – indraforyou
問題ありませんあなたの更新された答えは素晴らしいようです!ありがとうございました – JDS