深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码

       在深度学习中,批量归一化(batch normalization)以及对损失函数加一些正则项这两类方法,一般可以提升模型的性能。这两类方法基本上都属于权重约束,用于减少深度学习神经网络模型对训练数据的过拟合,并改善模型对新数据的性能。
       目前,存在多种类型的权重约束方法,例如最大化或单位向量归一化,有些方法也必须需要配置超参数。
       在本教程中,使用Keras API,用于向深度学习神经网络模型添加权重约束以减少过拟合。
       完成本教程后,您将了解:

如何使用Keras API创建向量范数约束;

如何使用Keras API为MLP、CNN和RNN层添加权重约束;

如何通过向现有模型添加权重约束来减少过度拟合;

下面,让我们开始吧。

1


本教程分为三个部分:

Keras中的权重约束;

图层上的权重约束;

权重约束案例研究;

Keras中权重约束

       Keras API支持权重约束,且约束可以按每层指定。
       使用约束通常涉及在图层上为输入权重设置kernel_constraint参数,偏差权重设置为bias_constraint。通常,权重约束方法不涉及偏差权重。
       一组不同的向量规范在keras.constraints模块可以用作约束:

最大范数(max_norm):强制权重等于或低于给定限制;

非负规范(non_neg):强制权重为正数;

单位范数(unit_norm):强制权重为1.0;

Min-Max范数(min_max_norm):强制权重在一个范围之间;

例如,可以导入和实例化约束:

# import norm from keras.constraints import max_norm # instantiate norm norm = max_norm(3.0) 图层上的权重约束

       权重规范可用于Keras的大多数层,下面介绍一些常见的例子:

MLP权重约束

       下面的示例是在全连接层上设置最大范数权重约束:

# example of max norm on a dense layer from keras.layers import Dense from keras.constraints import max_norm ... model.add(Dense(32, kernel_constraint=max_norm(3), bias_constraint==max_norm(3))) ... CNN权重约束

下面的示例是在卷积层上设置最大范数权重约束:

# example of max norm on a cnn layer from keras.layers import Conv2D from keras.constraints import max_norm ... model.add(Conv2D(32, (3,3), kernel_constraint=max_norm(3), bias_constraint==max_norm(3))) ... RNN权重约束

       与其他图层类型不同,递归神经网络允许我们对输入权重和偏差以及循环输入权重设置权重约束。通过图层的recurrent_constraint参数设置递归权重的约束。
       下面的示例是在LSTM图层上设置最大范数权重约束:

# example of max norm on an lstm layer from keras.layers import LSTM from keras.constraints import max_norm ... model.add(LSTM(32, kernel_constraint=max_norm(3), recurrent_constraint=max_norm(3), bias_constraint==max_norm(3))) ...

       基于以上的基本知识,下面进行实例实践。

权重约束案例研究

       在本节中,将演示如何使用权重约束来减少MLP对简单二元分类问题的过拟合问题。
       此示例只是提供了一个模板,读者可以举一反三,将权重约束应用于自己的神经网络以进行分类和回归问题。

二分类问题

       使用标准二进制分类问题来定义两个半圆观察,每个类一个半圆。其中,每个观测值都有两个输入变量,它们具有相同的比例,输出值分别为0或1,该数据集也被称为“ 月亮”数据集,这是由于绘制时,每个类中出现组成的形状类似于月亮。
       可以使用make_moons()函数生成观察结果,设置参数为添加噪声、随机关闭,以便每次运行代码时生成相同的样本。

# generate 2d classification dataset X, y = make_moons(n_samples=100, noise=0.2, random_state=1)

       可以在图表上绘制两个变量x和y坐标,并将数据点所属的类别的颜色作为观察的颜色。
       下面列出生成数据集并绘制数据集的完整示例:

# generate two moons dataset from sklearn.datasets import make_moons from matplotlib import pyplot from pandas import DataFrame # generate 2d classification dataset X, y = make_moons(n_samples=100, noise=0.2, random_state=1) # scatter plot, dots colored by class value df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y)) colors = {0:'red', 1:'blue'} fig, ax = pyplot.subplots() grouped = df.groupby('label') for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key]) pyplot.show()

       运行该示例会创建一个散点图,可以从图中看到,对应类别显示的图像类似于半圆形或月亮形状。

2

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzyxd.html