在创建优化器对象时设置参数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 没有类似的问题,因为所有的梯度都将被适当地缩放,方向将被保留,同时确保对梯度大小的约束。
编辑:问题询问权重裁剪而不是渐变裁剪:
权重的梯度裁剪不是 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 参数和 b_constraint 到 b(偏差) 参数