在这篇文章中,将探讨如何调整神经网络的超参数以获得最佳的训练和测试精度,避免过拟合。建议先阅读关于在MNIST数据集上实现人工神经网络(ANN)的博客文章,以便更好地理解本文内容。
超参数是模型的配置参数,用于提升模型性能。它们不是在训练阶段自动学习得到的,而是需要明确提供的。超参数对模型性能起着重要作用,应该被选择和设置为能够提高模型准确度的值。在神经网络中,一些超参数包括隐藏层的数量、每个隐藏层中的神经元数量、激活函数、学习率、dropout比例、迭代次数等。
本文将使用Keras Tuner,这是最简单的超参数调优方法之一。将以Fashion MNIST服装分类问题为例,这是学习神经网络最常用的数据集之一。但在深入实现之前,需要满足一些前提条件。
以下是使用Keras Tuner所需的环境:
Python3.6+
Tensorflow 2.0+
(系统中安装的是Tensorflow 2.1.0,但无法工作,因此升级到了2.6.0)
1. 如何检查Tensorflow版本:
# 使用此命令
print(tensorflow.__version__)
2. 如何升级Tensorflow?
# 使用以下命令
pip install --upgrade tensorflow --user
3. 如果仍然无法工作怎么办?
- 使用Google Colab
在Fashion MNIST数据集中,有T恤、裤子、套头衫、连衣裙、外套、凉鞋等服装的图片,总共有10个标签。
以下是加载数据和可视化数据集的代码。
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.datasets import fashion_mnist
# 加载数据
(X_train,y_train),(X_test,y_test)=fashion_mnist.load_data()
# 可视化数据集
for i in range(25):
# 定义子图
plt.subplot(5, 5, i+1)
# 绘制原始像素数据
plt.imshow(X_train[i], cmap=plt.get_cmap('gray'))
# 显示图形
plt.show()
# 归一化图像
X_train=X_train/255
X_test=X_test/255
model=Sequential([
# 扁平化图像
Flatten(input_shape=(28,28)),
# 添加第一个隐藏层
Dense(256,activation='relu'),
# 添加第二个隐藏层
Dense(128,activation='relu'),
# 添加第三个隐藏层
Dense(64,activation='relu'),
# 添加输出层
Dense(10,activation='softmax')
])
# 编译模型
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
# 拟合模型
model.fit(X_train,y_train,epochs=10)
# 评估模型
model.evaluate(X_test,y_test)
已经构建了基本的ANN模型,并得到了训练和测试精度,如上所示。可以看到训练和测试集的精度和损失的差异。训练数据的损失较小,但测试数据的损失增加,这可能导致对未见数据的错误预测。
现在让调整超参数以获得可以帮助改进模型的值。将优化模型中的以下超参数:隐藏层的数量、每个隐藏层中的神经元数量、学习率、激活函数。但首先,需要安装Keras Tuner。
# 使用此命令安装Keras Tuner
pip install keras-tuner
# 安装所需的库
from tensorflow import keras
from keras_tuner import RandomSearch
定义一个函数来构建ANN模型,其中超参数将是隐藏层中的神经元数量和学习率。
def build_model(hp): #hp意味着超参数
model=Sequential()
model.add(Flatten(input_shape=(28,28)))
#为隐藏层中的神经元数量提供范围
model.add(Dense(units=hp.Int('num_of_neurons',min_value=32,max_value=512,step=32),
activation='relu'))
#输出层
model.add(Dense(10,activation='softmax'))
#编译模型
model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate',values=[1e-2, 1e-3, 1e-4])),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
return model
上述代码使用了随机搜索超参数优化器。提供了以下变量给随机搜索。第一个是模型即build_model,接下来是目标即val_accuracy,意味着模型的目标是获得好的验证精度。接下来,提供了trails和每trail的执行次数,分别是5和3,意味着模型将执行15次(5*3)迭代以找到最佳参数。提供了目录和项目名称以保存每次试验的值。
tuner=RandomSearch(build_model,
objective='val_accuracy',
max_trials=5,
executions_per_trial=3,
directory='tuner1',
project_name='Clothing')
tuner.results_summary()