# 使用贝叶斯优化进行深度神经网络超参数优化

[En]

In this paper, we will study hyperparametric optimization in depth.

[En]

Here is a brief introduction to the steps of preparing the dataset, because the main content of this article is the optimization of hyperparameters, so this part only briefly introduces the process. In general, the process is as follows:

• 加载数据。
• 分为训练集、验证集和测试集。
[En]

divided into training set, verification set and test set.*

• 将像素值从 0–255 标准化到 0–1 范围。
• One-hot 编码目标变量。
#load data(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()split into train, validation and test setstrain_x, val_x, train_y, val_y = train_test_split(train_images, train_labels, stratify=train_labels, random_state=48, test_size=0.05)(test_x, test_y)=(test_images, test_labels)normalize pixels to range 0-1train_x = train_x / 255.0val_x = val_x / 255.0test_x = test_x / 255.0#one-hot encode target variabletrain_y = to_categorical(train_y)val_y = to_categorical(val_y)test_y = to_categorical(test_y)

[En]

The shapes of all our training, verification and test sets are:

print(train_x.shape)  #(57000, 28, 28)
print(train_y.shape)  #(57000, 10)
print(val_x.shape)    #(3000, 28, 28)
print(val_y.shape)    #(3000, 10)
print(test_x.shape)   #(10000, 28, 28)
print(test_y.shape)   #(10000, 10)


pip install keras-tuner


Keras Tuner 需要 Python 3.6+ 和 TensorFlow 2.0+

[En]

Hyperparameter adjustment is the basic part of machine learning project. There are two types of hyperparameters:

• 结构超参数：定义模型的整体架构(例如，隐藏单元数、层数)
[En]

structure hyperparameters: define the overall architecture of the model (for example, the number of hidden units, the number of layers)*

• 优化器超级参数：影响训练速度和质量的参数(如学习率和优化器类型、批次大小、轮次数等)
[En]

Optimizer super parameters: parameters that affect the speed and quality of training (such as learning rate and optimizer type, batch size, number of rounds, etc.)*

[En]

Why do you need a hyperparameter tuning library? Can’t we try all the possible combinations and see what’s best on the validation set?

[En]

This certainly won’t work because deep neural networks take a lot of time to train, or even a few days. If you train large models on a cloud server, each experiment will cost a lot of money.

[En]

Therefore, a pruning strategy is needed to limit the hyperparametric search space.

keras-tuner提供了贝叶斯优化器。它搜索每个可能的组合，而是随机选择前几个。然后根据这些超参数的性能，选择下一个可能的最佳值。因此每个超参数的选择都取决于之前的尝试。根据历史记录选择下一组超参数并评估性能，直到找到最佳组合或到达最大试验次数。我们可以使用参数”max_trials”来配置它。

model_mlp = Sequential()
print(model_mlp.summary())


[En]

The tuning process requires two main approaches:

hp.Int()：设置超参数的范围，其值为整数 – 例如，密集层中隐藏单元的数量：

model.add(Dense(units = hp.Int('dense-bot', min_value=50, max_value=350, step=50))


hp_optimizer=hp.Choice('Optimizer', values=['Adam', 'SGD'])


• 隐藏层数：1-3
• 第一密集层大小：50–350
• 第二和第三密集层大小：50–350
• Dropout：0、0.1、0.2
• 学习率：0.1、0.01、0.001

model = Sequential()

model.add(Dense(units = hp.Int('dense-bot', min_value=50, max_value=350, step=50), input_shape=(784,), activation='relu'))

for i in range(hp.Int('num_dense_layers', 1, 2)):
model.add(Dense(units=hp.Int('dense_' + str(i), min_value=50, max_value=100, step=25), activation='relu'))

hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3])
elif hp_optimizer == 'SGD':
hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3])
nesterov=True
momentum=0.9


model.compile(optimizer = hp_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

tuner_mlp = kt.tuners.BayesianOptimization(
model,
seed=random_seed,
objective='val_loss',
max_trials=30,
directory='.',
project_name='tuning-mlp')
tuner_mlp.search(train_x, train_y, epochs=50, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)


[En]

This process used up the number of iterations and took about an hour to complete. We can also print the best superparameters of the model using the following command:

best_mlp_hyperparameters = tuner_mlp.get_best_hyperparameters(1)[0]
print("Best Hyper-parameters")
best_mlp_hyperparameters.values


[En]

Now we can retrain our model with optimal parameters:

model_mlp = Sequential()

for i in range(best_mlp_hyperparameters['num_dense_layers']):

model_mlp.compile(optimizer=best_mlp_hyperparameters['Optimizer'], loss='categorical_crossentropy',metrics=['accuracy'])
history_mlp= model_mlp.fit(train_x, train_y, epochs=100, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)


[En]

Or, we can retrain our model with these parameters:

model_mlp=tuner_mlp.hypermodel.build(best_mlp_hyperparameters)

history_mlp=model_mlp.fit(train_x, train_y, epochs=100, batch_size=32,
validation_data=(dev_x, dev_y), callbacks=callback)


mlp_test_loss, mlp_test_acc = model_mlp.evaluate(test_x,  test_y, verbose=2)
print('\nTest accuracy:', mlp_test_acc)

Test accuracy: 0.8823


[En]

Compared with the model test accuracy of the baseline:

[En]

First, this is our baseline model:

model_cnn = Sequential()
model_cnn.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))


1. 卷积、MaxPooling 和 Dropout 层的”块”数
2. 每个块中 Conv 层的过滤器大小：32、64
3. 转换层上的有效或相同填充
4. 最后一个额外层的隐藏层大小：25-150，乘以 25
6. 学习率：0.01、0.001
model = Sequential()

model = Sequential()

for i in range(hp.Int('num_blocks', 1, 2)):
hp_filters=hp.Choice('filters_'+ str(i), values=[32, 64])

hp_units = hp.Int('units', min_value=25, max_value=150, step=25)

hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])

hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])
elif hp_optimizer == 'SGD':
hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])
nesterov=True
momentum=0.9


[En]

As before, we let the network determine its depth. Set the maximum number of iterations to 100:

model.compile( optimizer=hp_optimizer,loss='categorical_crossentropy', metrics=['accuracy'])

tuner_cnn = kt.tuners.BayesianOptimization(
model,
objective='val_loss',
max_trials=100,
directory='.',
project_name='tuning-cnn')


model_cnn = Sequential()

for i in range(best_cnn_hyperparameters['num_blocks']):
hp_filters=best_cnn_hyperparameters['filters_'+ str(i)]

model_cnn.compile(optimizer=best_cnn_hyperparameters['Optimizer'],
loss='categorical_crossentropy',
metrics=['accuracy'])
print(model_cnn.summary())

history_cnn= model_cnn.fit(train_x, train_y, epochs=50, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)


cnn_test_loss, cnn_test_acc = model_cnn.evaluate(test_x,  test_y, verbose=2)
print('\nTest accuracy:', cnn_test_acc)

Test accuracy: 0.92


1. 基线 CNN 模型：90.8 %
2. 最佳 CNN 模型：92%

[En]

We see the performance improvement of the optimization model!

[En]

In addition to accuracy, we can also see that the optimization effect is very good, because:

[En]

RandomSearch：随机选择其中的一些来避免探索超参数的整个搜索空间。但是，它不能保证会找到最佳超参数

Hyperband：选择一些超参数的随机组合，并仅使用它们来训练模型几个 epoch。然后使用这些超参数来训练模型，直到用尽所有 epoch 并从中选择最好的。

https://avoid.overfit.cn/post/c3f904fab4f84914b8a1935f8670582f

Original: https://blog.csdn.net/m0_46510245/article/details/125236556
Author: deephub
Title: 使用贝叶斯优化进行深度神经网络超参数优化

(0)

### 大家都在看

• #### Multigranulation Relative Entropy-Based Mixed Attribute Outlier Detection in Neighborhood Systems论文精

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

人工智能 2023年6月2日
0133
• #### python pandas处理数据的优点_Python pandas之数据处理

数据写入 我们可以将数据写入到文件中进行永久性的保存，支持的文件格式有HTML、CSV、JSON、Excel。 csv是最为常见的以纯文本文件存储数据文件的格式，它的优点是通用性很…

人工智能 2023年7月7日
0126
• #### 几种主要的分类预测模型的python代码实现-感知机，支持向量机，决策树和随机森林，人工神经网络

机器学习定义：假设用 P 来评估计算机程序在某任务类 T 上的性能，若一个程序利用经验 E 在任务 T 上获得了性能改善，则我们就说关于 T 和 P, 该程序对 E 进行了学习。经…

人工智能 2023年6月30日
0138
• #### 【以例为引】gtsam简单入门（上）–理论和认识

如有错漏，请评论或者私信指出，感谢！！ GTSAM简介 GTSAM（Georgia Tech Smoothing and Mapping）是基于因子图的C++库，它由佐治亚理工学院…

人工智能 2023年7月28日
0132
• #### 常见聚类算法总结

目录 一.关于聚类 什么是聚类： 什么不是聚类： 聚类的种类： 数据间的相似度度量： 簇间相似度度量： 评估不同聚类方案的优劣： 聚类方法的分类： 聚类算法之外的处理方法： 二.划…

人工智能 2023年5月31日
0164
• #### 机器学习（二）多元线性回归算法预测房价

啊哦~你想找的内容离你而去了哦 内容不存在，可能为如下原因导致： ① 内容还在审核中 ② 内容以前存在，但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

人工智能 2023年6月18日
0181
• #### DDIM代码详细解读(1)：数据集加载、类别条件信息读取、关键超参数解析

Diffusion models代码解读：入门与实战 _前言：_之前写过三篇详细解读DDPM代码的博客，随着时间已经来到2022年7月，单纯使用DDPM已经逐渐被淘汰，最新的论文更…

人工智能 2023年7月26日
0181

人工智能 2023年6月4日
0171
• #### 状态空间_1

状态空间概述 问题记录： 为什么状态空间方程中输出，状态倒数等于输入和状态之和而不是乘或者别的符号？ 控制器,观测器形式的状态空间方程咋来的?,形式如何理解?为什么两者的关系是转置…

人工智能 2023年6月4日
0183
• #### windows下编译opencv 3.4.0

为了方便后期的调试，自己动手编译opencv3.4.0，这样有需要的时候还可以自己修改修改源代码。 通常来说，编译32位比较简单，直接用cmake生成编译的工程就行了，但64位就比…

人工智能 2023年7月20日
0171
• #### Excel如何不四舍五入，彻底删除小数。

Excel如何不四舍五入，彻底删除小数。 目录 Excel如何不四舍五入，彻底删除小数。 1、例如去掉第一列数字后小数点，首先选中需要调整的数字， 2、在 “开始&#8…

人工智能 2023年7月17日
0331
• #### NLP-文本处理：指代消解（Coreference Resolution）【回指消解（名词＜–＞代词）、共指消解（名词1＜–＞名词2）】【识别指向同一实体的不同表述】【难度较大，准确率不会太高】

共指消解（coreference resolution）技术同NER、RE。作为自然语言历届基础技术被广泛的应用于：文本摘要、机器翻译、自动问答和知识图谱等领域。 共指消解的提出是…

人工智能 2023年6月10日
0149
• #### 【深度学习】 自编码器（AutoEncoder）

目录 * – + RDAE稳健深度自编码 + * 自编码器（Auto-Encoder） * DAE 深度自编码器 RDAE稳健深度自编码 自编码器（Auto-Encod…

人工智能 2023年6月23日
0185
• #### python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)

python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图) 文章目录 1.plt.pie() 2. 饼图基本 3. 饼状图进阶 4. 环形图 5. 内嵌环形图 …

人工智能 2023年7月5日
0145