使用 Keras Tuner
对 CNN 模型进行参数优化的过程包括以下几个步骤:
- 安装 Keras Tuner:确保你已经安装了 Keras Tuner。
- 定义模型构建函数:定义一个函数来构建模型,并在其中设置你希望调整的超参数。
-
设置超参数搜索:选择搜索算法(如
RandomSearch
、Hyperband
、BayesianOptimization
)并配置搜索参数。 - 执行超参数搜索:运行超参数搜索以找到最佳模型配置。
以下是一个完整的示例代码,用于使用 Keras Tuner
对 CNN 模型进行超参数优化:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import keras_tuner as kt
# 定义模型构建函数
def build_model(hp):
model = keras.Sequential()
# 输入层
model.add(layers.InputLayer(input_shape=(28, 28, 1)))
# 调整卷积层数量
for i in range(hp.Int('conv_layers', 1, 3)):
model.add(layers.Conv2D(
filters=hp.Int(f'filters_{i}', 32, 128, step=32),
kernel_size=hp.Choice(f'kernel_size_{i}', [3, 5]),
activation='relu'
))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())
# 调整全连接层的神经元数量
model.add(layers.Dense(
units=hp.Int('units', 32, 128, step=32),
activation='relu'
))
model.add(layers.Dropout(rate=hp.Choice('dropout', [0.2, 0.3, 0.4, 0.5])))
model.add(layers.Dense(10, activation='softmax'))
# 编译模型
model.compile(
optimizer=keras.optimizers.Adam(
hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])
),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
return model
# 使用 Hyperband 进行超参数搜索
tuner = kt.Hyperband(
build_model,
objective='val_accuracy',
max_epochs=10,
factor=3,
directory='my_dir',
project_name='cnn_tuning'
)
# 加载数据集
(x_train, y_train), (x_val, y_val) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255
x_val = x_val.reshape(-1, 28, 28, 1).astype('float32') / 255
# 早停回调函数
stop_early = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
# 运行超参数搜索
tuner.search(x_train, y_train, epochs=50, validation_data=(x_val, y_val), callbacks=[stop_early])
# 获取最佳超参数
best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"""
最佳的超参数:
- 卷积层数: {best_hps.get('conv_layers')}
- 卷积层过滤器数: {[best_hps.get(f'filters_{i}') for i in range(best_hps.get('conv_layers'))]}
- 卷积核大小: {[best_hps.get(f'kernel_size_{i}') for i in range(best_hps.get('conv_layers'))]}
- 全连接层神经元数: {best_hps.get('units')}
- Dropout 率: {best_hps.get('dropout')}
- 学习率: {best_hps.get('learning_rate')}
""")
# 使用最佳超参数重新训练模型
model = tuner.hypermodel.build(best_hps)
history = model.fit(x_train, y_train, epochs=50, validation_data=(x_val, y_val))
这个示例展示了如何使用 Keras Tuner
进行超参数优化,包括调整卷积层数、卷积核数、全连接层的神经元数量、Dropout 率和学习率。通过超参数搜索,可以找到性能最优的模型配置。