【ML&DL学习】6 tf keras regression hp search sklearn

本文介绍了在机器学习和深度学习中,如何使用TensorFlow Keras进行回归模型的超参数搜索。讨论了手动调整学习率的方法,通过学习曲线分析得出0.003的学习率较为适合模型。同时指出手动搜索的局限性,如超参数众多、训练过程串行。然后展示了如何利用sklearn的KerasRegressor将Keras模型转换为sklearn模型,并运用RandomizedSearchCV进行随机搜索,以实现并行化超参数调优。最终,通过交叉验证和训练曲线评估模型性能。
摘要由CSDN通过智能技术生成

超参数搜索

在这里插入图片描述
搜索策略:

  • 网格搜索
  • 随机搜索
  • 遗传算法搜索
  • 启发式搜索
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

手动搜索 learning rate

# learning_rate: [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
# W = W + grad * learning_rate
# 定义learning rate集合
learning_rates = [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
# 保存每个模型对应的history
histories = []
# 对于每一个学习率 都需要定义一个模型 去学习
for lr in learning_rates:
    model = keras.models.Sequential([
        keras.layers.Dense(30, activation='relu',
                           input_shape=x_train.shape[1:]),
        keras.layers.Dense(1),
    ])
    # 初始化 optimizer的学习率,使用我们定义的学习率
    optimizer = keras.optimizers.SGD(lr)
    # 使用定义的 optimizer
    model.compile(loss="mean_squared_error", optimizer=optimizer)
    callbacks = [keras.callbacks.EarlyStopping(
        patience=5, min_delta=1e-2)]
    # 模型训练
    history = model.fit(x_train_scaled, y_train,
                        validation_data = (x_valid_scaled, y_valid),
                        epochs = 100,
                        callbacks = callbacks)
    # 保存每个模型对应的history
    histories.append(history)

在这里插入图片描述
学习曲线和learning rate

def plot_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(8, 5))
    plt.grid(True)
    plt.gca().set_ylim(0, 1)
    plt.show()
# 打印每个模型 
for lr, history in zip(learning_rates, histories):
    print("Learning rate: ", lr)
    plot_learning_curves(history)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现,0.003的训练效果比较好,对于最后一个0.03,对应的值爆炸了,不适应这个模型。学习率如果比较小,训练的速度会比较慢,如果学习率比较合适的话,训练可以达到比较小的值。

我们上面定义的lr是不会变化的,而随着模型的训练,这个lr可以按照一定的策略取衰减的。

综上,自己实现超参数搜索的话,有两个缺点:

  • 超参数的搜索不单单只是lr的搜索,还有很多其他超参数的搜索,随之使用的for循环会很多。
  • 使用for循环进行训练,模型只能等上一个模型训练完之后才可以开始训练,没有一个并行化的处理

我们可以使用sklearn实现超参数搜索

sklearn实现超参数搜索

# RandomizedSearchCV
# 1. tf kears转化为sklearn的model
# 2. 定义参数集合
# 3. 使用RandomizedSearchCV搜索参数

# 定义build_fn
def build_model(hidden_layers = 1,
                layer_size = 30,
                learning_rate = 3e-3):
    # 定义一个model
    model = keras.models.Sequential()
    # 添加全连接层
    model.add(keras.layers.Dense(layer_size, activation='relu',
                                 input_shape=x_train.shape[1:]))
    # 上面与下面要分开 第一层隐含层涉及输入的shape
    #其他隐含层不需要,是第一层的输出
    # 添加hidden_layers - 1个全连接层
    for _ in range(hidden_layers - 1):
        model.add(keras.layers.Dense(layer_size,
                                     activation = 'relu'))
    # 添加输出层
    model.add(keras.layers.Dense(1))
    # 定义optimizer
    optimizer = keras.optimizers.SGD(learning_rate)
    model.compile(loss = 'mse', optimizer = optimizer)
    return model
# 转成sklearn模型
sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(
    build_fn = build_model)
callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-2)]
history = sklearn_model.fit(x_train_scaled, y_train,
                            epochs = 100,
                            validation_data = (x_valid_scaled, y_valid),
                            callbacks = callbacks)

使用kerasRegressor 讲tf kears转化为sklearn的model
在这里插入图片描述
在这里插入图片描述
分类模型可以使用 KerasClassifier

在这里插入图片描述
训练到26次损失值变化比较小,就提前结束了

学习曲线
在这里插入图片描述
使用RandomizedSearchCV搜索参数

from scipy.stats import reciprocal
# f(x) = 1/(x*log(b/a)) a <= x <= b
# 定义超参数集合
param_distribution = {
	# hidden_layers 层数
    "hidden_layers":[1, 2, 3, 4],
    "layer_size": np.arange(1, 100),
    # 一个分布 最小值和最大值
    "learning_rate": reciprocal(1e-4, 1e-2),
}
#导入后可以不用写前面
from sklearn.model_selection import RandomizedSearchCV
									#sklearn模型
random_search_cv = RandomizedSearchCV(sklearn_model,
									  # 参数分布
                                      param_distribution,
                                      # 选出的参数集合数目
                                      n_iter = 10,
                                      # cross_validation参数默认是3
                                      cv = 3,
                                      # 并行处理数
                                      n_jobs = 1)
random_search_cv.fit(x_train_scaled, y_train, epochs = 100,
                     validation_data = (x_valid_scaled, y_valid),
                     callbacks = callbacks)

# cross_validation: 训练集分成n份,n-1训练,最后一份验证.

cross_validation: 训练集分成n份,n-1训练,最后一份验证.
在这里插入图片描述
在这里插入图片描述
训练结果
在这里插入图片描述

# 最好的参数
print(random_search_cv.best_params_)
# 最好的分值
print(random_search_cv.best_score_)
# 最好的模型
print(random_search_cv.best_estimator_)

在这里插入图片描述
获取最好的模型,进行测试

model = random_search_cv.best_estimator_.model
model.evaluate(x_test_scaled, y_test)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值