如何使用 KerasTuner 调整神经网络架构?

Cat*_*ian 6 python neural-network keras tensorflow keras-tuner

我正在尝试使用 KerasTuner 自动调整神经网络架构,即隐藏层的数量和每个隐藏层中的节点数量。目前,神经网络架构是使用一个参数 来定义的NN_LAYER_SIZES。例如,

NN_LAYER_SIZES = [128, 128, 128, 128]
Run Code Online (Sandbox Code Playgroud)

表示神经网络有 4 个隐藏层,每个隐藏层有 128 个节点。

KerasTuner 具有以下超参数类型(https://keras.io/api/keras_tuner/hyperparameters/):

  • INT
  • 漂浮
  • 布尔值
  • 选择

似乎这些超参数类型都不适合我的用例。所以我写了下面的代码来扫描隐藏层数和节点数。然而,它并没有被认为是一个超参数。

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)]
Run Code Online (Sandbox Code Playgroud)

关于如何使其正确的任何建议?

Alo*_*her 3

也许在构建模型时通过迭代来将层数视为超参数。这样您就可以尝试不同数量的层与不同数量的节点相结合:

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)
Run Code Online (Sandbox Code Playgroud)