import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1.0/255)
val_datagen = ImageDataGenerator(rescale=1.0/255)
train_generator = train_datagen.flow_from_directory(r"/jupyter/horse-or-human/",target_size=(300,300),
batch_size=32,class_mode='binary')
validation_generator = val_datagen.flow_from_directory(r"/jupyter/validation-horse-or-human/",target_size=(300,300),
batch_size=32,class_mode='binary')
from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters
hp=HyperParameters()
def build_model(hp):
model = keras.Sequential()
model.add(keras.layers.Conv2D(hp.Choice("num_filters_layer0",values=[16,64],default=16),kernel_size=(3,3),
activation='relu'),input_shape=(300,300,3))
model.add(keras.layers.MaxPool2D(2,2))
for i in range(hp.Int("num_Cov_layer",1,3)):
model.add(keras.layers.Conv2D(hp.Int(f"num_filters_layer{i}",16,64,48),
kernel_size=(3,3),activation='relu'))
model.add(keras.layers.MaxPool2D(2,2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(hp.Int("num_Dense",128,256,128),activation='relu'))
model.add(keras.layers.Dense(1,activation='sigmoid'))
model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=hp.Float("lr",0.001,0.01,0.005)),
loss='binary_crossentropy',metrics=['acc'])
return model
tuner = Hyperband(hypermodel=build_model,objective='val_acc',
max_epochs=10,directory='horse-or-human_parameters',
project_name='my_project_para')
tuner.search(train_generator,epochs=5,validation_data=validation_generator)
best_hp = tuner.get_best_hyperparameters()[0]
print(best_hp.values)
model = tuner.hypermodel.build(best_hp)
model.summary()
主要是使用hp.Int(),Choice,float来代替需要调整的超参数,最后使用search函数进行搜索。