前言一、正则化数学理解?二、三种常见的正则化类型三、正则化在图像分类中的应用Python代码实现
前言
正则化主要是确保我们训练的模型能够更好地对未经过训练的数据点进行(正确的)分类,即泛化能力
欠拟合: 训练样本被提取的特征比较少,导致训练出来的模型不能很好地匹配,表现得很差,甚至样本本身都无法高效的识别,如下图橙色的线。
过拟合: 所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳,如下图蓝色的线。
而正则化的目的就是让我们的模型表现的如绿色线(平滑、简单)。
一、正则化数学理解?
- 交叉熵损失函数:
整个训练集的损失函数:
为了提高我们的模型泛化和减少过拟合的能力,引入一个正则化惩罚函数R(W)正则化惩罚函数
该函数的代码解释:
penalty = 0 for i in np.arange(0, W.shape[0]): for j in np.arange(0, W.shape[1]): penalty += (W[i][j] ** 2)
- 加上惩罚项的损失函数:
(第一项——是训练集中所有样本的平均损失。第二项是正则化惩罚。λ变量是一个超参数,它控制着我们正在应用的正则化方法的数量或强度。在实践中,学习率α和λ都是花费最多时间进行调优的超参数)
5.权重W更新规则:
L2正则化(又称“权重衰减”)
L1正则化
- L1和L2结合的正则化方式
"""正则化:提高泛化能力或者减少过拟合影响
注:在终端运行 python regularization.py --dataset ../datasets/animals
"""
from sklearn.linear_model import SGDClassifier #SGD线性分类器
#SGDClassifier包含:损失函数、迭代次数、学习率、正则项
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from pyimagesearch.preprocessing import SimplePreprocessor
from pyimagesearch.datasets import SimpleDatasetLoader
from imutils import paths
import argparse
#参数解析
ap = argparse.ArgumentParser()
ap.add_argument('-d','--dataset',required=True,help='path to input dataset')
args = vars(ap.parse_args())
#获取图像路径
print('[INFO]loading images...')
imagePaths = list(paths.list_images(args['dataset']))
sp = SimplePreprocessor.SimplePreprocessor(32, 32)
sdl = SimpleDatasetLoader.SimpleDatasetLoader(preprocessors=[sp])
(data, labels) = sdl.load(imagePaths, verbose=500)
data = data.reshape(data.shape[0],3072)
le = LabelEncoder()
labels = le.fit_transform(labels)
(trainX, testX, trainY, testY) = train_test_split(data,labels,test_size=0.25,random_state=5)
#用无正则化、L1、L2正则化都试试
for r in (None,'l1','l2'):
#使用softmax损失函数和指定的正则化函数训练SGD分类器,迭代10次
print("[INFO] training model with '{}'penalty".format(r))
model = SGDClassifier(loss='log',penalty=r,max_iter=10,learning_rate='constant',eta0=0.01,random_state=42)
model.fit(trainX,trainY)
#评估
acc = model.score(testX,testY)
print("[INFO] ‘{}‘ penalty accuracy: {:.2f}%".format(r,acc * 100))
"""输出"""
[INFO] training model with 'None'penalty
[INFO] ‘None‘ penalty accuracy: 56.00%
[INFO] training model with 'l1'penalty
[INFO] ‘l1‘ penalty accuracy: 52.53%
[INFO] training model with 'l2'penalty
[INFO] ‘l2‘ penalty accuracy: 51.33%



