Estoy tratando de usar KerasTuner para ajustar automáticamente la arquitectura de la red neuronal, es decir, la cantidad de capas ocultas y la cantidad de nodos en cada capa oculta. Actualmente, la arquitectura de la red neuronal se define mediante un parámetro NN_LAYER_SIZES . Por ejemplo,
NN_LAYER_SIZES = [128, 128, 128, 128]indica que la NN tiene 4 capas ocultas y cada capa oculta tiene 128 nodos.
KerasTuner tiene los siguientes tipos de hiperparámetros ( https://keras.io/api/keras_tuner/hyperparameters/ ):
Parece que ninguno de estos tipos de hiperparámetros se ajusta a mi caso de uso. Así que escribí el siguiente código para escanear la cantidad de capas ocultas y la cantidad de nodos. Sin embargo, no ha sido reconocido como un hiperparámetro.
number_of_hidden_layer = hp.Int("layer_number", min_value=2, max_value=5, step=1) number_of_nodes = hp.Int("node_number", min_value=4, max_value=8, step=1) NN_LAYER_SIZES = [2**number_of_nodes for _ in range(number of hidden_layer)]¿Alguna sugerencia sobre cómo hacerlo bien?
Tal vez trate la cantidad de capas como un hiperparámetro iterando a través de él al construir su modelo. De esa manera, puede experimentar con diferentes números de capas combinados con diferentes números de nodos:
import tensorflow as tf import keras_tuner as kt def model_builder(hp): model = tf.keras.Sequential() model.add(tf.keras.layers.Flatten(input_shape=(28, 28))) units = hp.Int('units', min_value=32, max_value=512, step=32) layers = hp.Int('layers', min_value=2, max_value=5, step=1) for _ in range(layers): model.add(tf.keras.layers.Dense(units=units, activation='relu')) model.add(tf.keras.layers.Dense(10)) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) return model (img_train, label_train), (_, _) = tf.keras.datasets.fashion_mnist.load_data() img_train = img_train.astype('float32') / 255.0 tuner = kt.Hyperband(model_builder, objective='val_accuracy', max_epochs=10, factor=3) tuner.search(img_train, label_train, epochs=50, validation_split=0.2) best_hps=tuner.get_best_hyperparameters(num_trials=1)[0] model = tuner.hypermodel.build(best_hps) history = model.fit(img_train, label_train, epochs=50, validation_split=0.2)