目录
1 过拟合:
简单来说就是模型在训练数据上的拟合能力高,但是在训练集之外的数据上拟合能力差(泛化能力差)。
2 欠拟合:
过拟合的反面,模型在训练集上的拟合能力不足 ,可能是由训练不足,模型不够强大,正则化强度过高造成的。
3 常见防止过拟合的方法
(1)添加权重正则化
由奥卡姆剃刀法则得出:最简单的往往是正确的,因此网络强制权重取小值;通过L1或L2范数实现,可以使得权重的分布更规则,因此成为正则化
L1正则化:添加的成本与权重系数的绝对值(即权重的“L1 范数”)成正比
L2正则化:添加的成本与权重系数值的平方(即权重的“L2 范数”)成正比。L2 正则化在神经网络中也被称为权重衰减。
Tensorflow中的具体应用:可添加在卷积层或者全连接层
tf.keras.regularizers.L2(l2=) L1正则化
tf.keras.regularizers.L1(l1=) L2正则化
tf.keras.regularizers.L1L2(l1=,l2=) L1和L2正则化
model=tf.keras.Sequential([
tf.keras.layers.Rescaling(1/255),
tf.keras.layers.Conv2D(64,(3,3),padding='same',activation='relu',kernel_regularizer=tf.keras.regularizers.L2(l2=0.01),input_shape=(150,150,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5,activation='softmax')
])
(2)添加Dropout层(随机失活)
在网络传递过程中对某一层随机选择一定比例的特征失活(不使用这些特征作为下一层的输入,设为0)
Tensorflow中的具体应用:可添加在卷积层或者全连接层 之后
tf.keras.layers.Dropout(
rate, #失活比例0-1一般设0.5noise_shape=None, ✡︎dropout中的noise_shape参数的作用 - 知乎
seed=None, #随机数种子
**kwargs
)
model=tf.keras.Sequential([
tf.keras.layers.Rescaling(1/255),
tf.keras.layers.Conv2D(64,(3,3),padding='same',activation='relu',kernel_regularizer=tf.keras.regularizers.L2(l2=0.01),input_shape=(150,150,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64,kernel_regularizer=tf.keras.regularizers.L2(l2=0.01),activation='relu'),
tf.keras.layers.Dropout(rate=0.5),
tf.keras.layers.Dense(5,activation='softmax')
])
(3)数据增强
数据增强是在数据有限的情况下,利用有限的数据产生等价于更多数据的价值。常见方法有几何变换(翻转,旋转,移位,裁剪,变形,缩放)和颜色变换,还有其他的如SMOTE、GAN等(可参考:http://t.csdn.cn/StQky)
(4)Batch Normallization
Batch Norm 调整激活值(激活函数输出值)的分布使其具有适当的广度,具体为向神经网络中插入数据正规化的层
①可以加快学习速度
②不那么依赖初始值
③抑制过拟合
以mnin batch(批量数据)为单位进行均值为0,方差为1的正规化
vb=1/m*np.sum(xi);方差a^2=1/m*np.sum(xi-vb)^2
xi=(xi-vb)/np.sqrt(a^2+10e-7)
正规化后进行缩放和平移变换:yi=γ*xi+B;初始γ=1,b=0
tf.keras.layers.BatchNormalization(
axis=-1,
momentum=0.99,
epsilon=0.001,
center=True,
scale=True,
beta_initializer='zeros',
gamma_initializer='ones',
moving_mean_initializer='zeros',
moving_variance_initializer='ones',
beta_regularizer=None,
gamma_regularizer=None,
beta_constraint=None,
gamma_constraint=None,
**kwargs
)
model=tf.keras.Sequential([
tf.keras.layers.Rescaling(1/255),
tf.keras.layers.Conv2D(64,(3,3),padding='same',activation='relu',kernel_regularizer=tf.keras.regularizers.L2(l2=0.01),input_shape=(150,150,3)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(64,kernel_regularizer=tf.keras.regularizers.L2(l2=0.01),activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(5,activation='softmax')
])
除了上述四种方法外就还可以增加训练数据,降低网络容量,但是一般那以实现。