我试图理解为什么keras中的正则化语法看起来像这样。
简言之,正则化是通过在与模型权重函数成比例的损失函数中加入惩罚项来减少过度拟合的方法。因此,我希望将正则化定义为模型损失函数规范的一部分。
但是,在Keras中,正则化是以每层为基础定义的。例如,考虑这个规则化的dnn模型:
input = Input(name='the_input', shape=(None, input_shape))
x = Dense(units = 250, activation='tanh', name='dense_1', kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
x = Dense(units = 28, name='dense_2',kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
y_pred = Activation('softmax', name='softmax')(x)
mymodel= Model(inputs=input, outputs=y_pred)
mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
我本以为不需要稠密层中的正则化参数,我只需编写最后一行,如下所示:
mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'], regularization='l2')
这显然是错误的语法,但我希望有人能为我解释一下为什么正则化是这样定义的,以及当我使用层级正则化时实际发生的事情。
另一件我不明白的事情是,在什么情况下,我会使用这三个正则化选项中的每一个或全部:
(kernel_regularizer, activity_regularizer, bias_regularizer)
? 最佳答案
让我们把问题的组成部分分解一下:
您对规则化的期望可能与前馈网络一致,其中惩罚术语适用于整个网络的权重。但当RNN与CNN等混合时不一定如此,因此KERA选择提供精细的颗粒控制。也许为了方便设置,可以为所有权重在API中添加模型级别的规则化。
当你使用层正则化时,基值Layer
类实际上是对训练时相应层的权重等的损失的正则化项。
现在在Keras中,您可以经常对3种不同的事物应用正则化,如在adds层中。每一层都有不同的内核,比如经常性的内核等等,所以我们来看看您感兴趣的内核,但同样的内核大致适用于所有层:
内核:这适用于层的实际重量,在稠密的情况下,它是wx+b的w。
偏差:这是权重的偏差向量,因此可以为它应用不同的正则化器,wx+b中的b。
活动:应用于输出向量,y=f(wx+b)中的y。
关于python - 理解Keras的正规化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50649831/