Tensorflow horse-or-human识别 --(1)kerastuner 调整模型参数

注: 本篇内容基于tensorflow2.9.1(python3.10),数据生成器中的batch_size可根据自己计算机的性能设置,防止后续模型运行过程出现显存不足而失败

“from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters”
HyperParameters() 用于超参数空间和当前值的容器。可作为参数传递用于构造模型
Hyperband(
hypermodel=None,#HyperModel class 的实例或者接受参数并返回一个 model的可调用的函数
objective=None,#优化的目标,常为验证集精度’val_acc’
max_epochs=100, #训练一个模型最大迭代次数,可调整为比预期更新次数稍大的值
factor=3,#模型迭代训练的次数epochs的缩减系数默认为3
hyperband_iterations=1,#遍历整个Hyperband的次数默认为1,
seed=None,#随机数种子
hyperparameters=None,#HyperParameters() 的实例
tune_new_entries=True,#是否将为指定的模型超参数添加到搜索空间
allow_new_entries=True,#是否允许超模型请求超参数中没有列出的超参数项
**kwargs:其他相关关键字参数(如directory=“路径”,#存放调整后的参数的目录
project_name=“路径” #存放调整后的参数的子目录)
1.添加数据:下载数据(下载),下载完成后可将其解压到任意目录或者你建立的horse-or-human 项目的同级目录下,之后利用ImageDataGenerator创建数据生成器,代码如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

#创建两个图片数据生成器,将图片数据的值归一化到0-1
train_datagen=ImageDataGenerator(rescale=1/255)
validation_datagen=ImageDataGenerator(rescale=1/255)

#训练数据生成器
train_generator=train_datagen.flow_from_directory(
    "horse-or-human",#训练数据文件路径
    target_size=(150,150),#指定输出尺寸
    batch_size=16,        #训练更新时,每一批取32张图片
    class_mode="binary") #指定二分类
#测试数据生成器
validation_generator=validation_datagen.flow_from_directory(
     "validation-horse-or-human",#测试数据文件路径
    target_size=(150,150),
    batch_size=16,
    class_mode="binary")`

2.利用Hyperband()寻找模型参数
1)方法HyperParameters.Choice(
name, values, ordered=None, default=None, parent_name=None, parent_values=None
) —返回超参数的值
name:给当前层起一个名称,字符串类型;values:参数范围,为列表,如[16,64],范围16-64。
ordered:可选布尔值,传递的值是否应该被认为有顺序。float/int值默认为True。对于任何其他值必须为假。
default:默认当前参数取值,
parent_name:可选string,指定父HyperParameter的名称,用作激活当前HyperParameter的条件。
parent_values:可选父HyperParameter的值列表,用作激活当前HyperParameter的条件
2)方法HyperParameters.Int(
name,
min_value,
max_value,
step=1,
sampling=None,
default=None,
parent_name=None,
parent_values=None,
)—从一组预定义的可能值中选择一个值。返回超参数的值
name:字符串,参数的名称,每个HyperParameter实例在搜索空间中必须是唯一的。
min_value, max_value:参数最小和最大取值范围为闭区间
step:步长可自行设置
sampling:“linear”, “log”, "reverse_log"中的一个。作为初始先验概率分布的提示,该值应该如何采样,例如。“log”将为每个数量级范围分配相等的概率。
default:默认当前参数取值,
parent_name:可选string,指定父HyperParameter的名称,用作激活当前HyperParameter的条件。
parent_values:可选父HyperParameter的值列表,用作激活当前HyperParameter的条件

from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters
hp=HyperParameters()  #变量hp
def build_model(hp):
    model=keras.Sequential()
    model.add(keras.layers.Conv2D(hp.Choice("num_filters_layer_0",values=[16,64],default=16),
                                            (3,3),activation=tf.nn.relu,input_shape=(150,150,3)))
    model.add(keras.layers.MaxPool2D(2,2))
    for i in range(hp.Int("conv_layer_nums",1,3)):#寻找最佳卷积和池化层数,这里默认步长为1
        model.add(keras.layers.Conv2D(hp.Choice(f"num_filters_layer{i}",values=[16,64],default=16),
                                      (3,3),activation=tf.nn.relu))
        model.add(keras.layers.MaxPool2D(2,2))
    model.add(keras.layers.Conv2D(64,(3,3),activation=tf.nn.relu))
    model.add(keras.layers.MaxPool2D(2,2))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(hp.Int("hidden_units",128,512,step=32),activation=tf.nn.relu))#寻找最优隐层神经元个数
    model.add(keras.layers.Dense(1,activation=tf.nn.sigmoid))#二分类用sigmoid,多分类用softmax
    model.compile(loss=tf.keras.losses.binary_crossentropy,optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.001),metrics=["acc"])
    return model
tuner=Hyperband(
    build_model,#生成模型的函数名
    objective="val_acc",#以测试集精度为优化目标
    max_epochs=15,#估计最大更新次数
    directory="horse_human_params",#存放调整后的参数的目录
    hyperparameters=hp,#出入实例hp
    project_name="my_horse_human_project"#存放调整后的参数的子目录
)
tuner.search(train_generator,epochs=10,validation_data=validation_generator)#搜索最佳超参数

3.查看搜索到的最佳模型超参数
1)Tuner.get_best_hyperparameters(num_trials=1):返回目标最佳超参数,返回值为HyperParameter对象的列表,从最好到最坏排序。
num_trials:可选返回HyperParameters对象个数。
2)利用搜索到的最佳超参数构建模型

best_hp = tuner.get_best_hyperparameters()[0] #返回最佳超参数
model = tuner.hypermodel.build(best_hp) #利用最佳超参数构建模型
model.summary() #查看模型结构

这是作者的学习笔记,在此分享,仅供参考。因为作者水平有限,如有疏漏之处,还望批评指正。

你可能感兴趣的:(笔记,tensorflow,深度学习,python)