如何在keras范围内限制重量

时间:2019-06-29 22:59:06

标签: python keras

我正在将keras用于简单的三层MLP。我想将学习的MLP的权重限制在一个范围内。例如,在拟合模型后,所有权重和偏差都在(-1,1)范围内。 我怎样才能做到这一点? 谢谢。

3 个答案:

答案 0 :(得分:2)

constraints模块可用于实现此目的。像这样将其应用于权重(kernel_constraint):

model.add(Dense(500, kernel_constraint=unit_norm()))

https://keras.io/constraints/#unitnorm

答案 1 :(得分:1)

为此使用Constraint

对此没有标准约束,因此我们需要创建一个自定义约束。 unit_norm与“张量范数”有关,而不与“单个权重值”有关。

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

class Between(Constraint):
    def __init__(self, min_value, max_value):
        self.min_value = min_value
        self.max_value = max_value

    def __call__(self, w):        
        return K.clip(w, self.min_value, self.max_value)

    def get_config(self):
        return {'min_value': self.min_value,
                'max_value': self.max_value}

在接受约束的任何层中,应有一个kernel_constraint和一个bias_constraint参数。或一些非常相似的名称。

Dense(units, kernel_constraint=Between(), bias_constraint=Between())

加载模型:

custom = {'Between':Between}
model = load_model(path, custom_objects = custom)

答案 2 :(得分:0)

简短答案:Ioffe & Szegedy 2015的基础上,您需要在完全连接(FC)层之后实现批量标准化(BN)层+激活功能层(在您的情况下,Tanh将输出限制在[-1,+ 1]范围内)并在非线性之前如下:

img 为此,我们需要从Keras导入BatchNormilization,如下所示。

from keras.models import Sequential
from keras.layers import Dense, Activation, BatchNormalization

model = Sequential([
    Dense(16, input_shape=(1,5), activation='tanh'),
    BatchNormalization(axis=1),
    Dense(32, activation='tanh'),
    BatchNormalization(axis=1),
    Dense(2, activation='tanh')
])

完整答案

激活功能Tanh: tanh激活用于帮助调节流经网络的值。 tanh函数将值压缩为始终在-1和1之间。

img

批处理规范化: 为了增加神经网络的稳定性,批处理归一化通过减去批平均值并除以批标准偏差来归一化先前激活层的输出。但是,在通过一些随机初始化的参数进行激活输出的这种移位/缩放之后,下一层的权重不再是最佳的。如果SGD(随机梯度下降法)是一种使损失函数最小化的方法,则它将取消此标准化。

因此,批量归一化将两个可训练的参数添加到每一层,因此将归一化的输出乘以“标准差”参数gamma_initializer并添加“均值”参数beta_initializer。换句话说,批处理归一化允许SGD通过为每次激活仅更改这两个权重来进行非归一化,而不是通过更改所有权重来失去网络的稳定性。 Keras默认将它们设置为01,但是我们可以选择更改它们,以及其他几个可选指定的参数。 img