Настройка гиперпараметров — Keras Tuner (реализация Python Tensorflow)

Привет, ребята. Это Арвин. Не теряйте времени, так что я начну немедленно. Настройка гиперпараметров — довольно важный вопрос. Так что же, во имя всего этого нечестивого, такое «настройка гиперпараметров»?

Настройка гиперпараметров заключается в нахождении набора оптимальных значений гиперпараметров для алгоритма обучения при одновременном применении этого оптимизированного алгоритма к любому набору данных. Эта комбинация гиперпараметров максимизирует производительность модели, сводя к минимуму предопределенную функцию потерь для получения лучших результатов с меньшим количеством ошибок. ("Источник")

Так что же все это означает? Это довольно легко. Поговорим об этом на примере. Предположим, у нас есть некоторая модель нейронной сети, для этой модели требуется некоторая скорость обучения альфа. Теперь, как мы определяем альфу? выбрав несколько случайных альфа-каналов, чтобы увидеть, какой из них работает лучше. Вот и все. По сути, это настройка гиперпараметров, случайный/систематический поиск лучших параметров. Так что теории не так много.

Приступим непосредственно к реализации. Если вы хотите получить доступ к полному коду, посетите мой GitHub по ссылке ниже:



ВЫПОЛНЕНИЕ

Здесь мы реализуем использование «keras_tuner» в Google Colab для некоторой модели CNN. Просто предупреждаю, keras_tuner не установлен на Colab, поэтому вам нужно сделать:

!pip install keras_tuner

И это будет все. Далее мы пройдем наши обычные 6 шагов с дополнительным шагом настройки гиперпараметров:

  1. Импорт
  2. Загрузить данные
  3. Данные предварительной обработки
  4. Построить архитектуру модели
  5. Настройка гиперпараметров
  6. Модель поезда
  7. Оцените производительность модели

Импорт

сначала мы импортируем numpy, так как он нам понадобится для управления массивами numpy:

import numpy as np

Затем мы импортируем tensorflow, keras и keras_tuner (которые мы только что установили).

import tensorflow as tf 
from tensorflow import keras 
import keras_tuner
from kerastuner import RandomSearch
from kerastuner.engine.hyperparameters import HyperParameters

Загрузить данные

Мы используем набор данных «Fashion Mnist» для этого скрипта. Что такое набор данных Fashion Mnist? как следует из названия, набор данных состоит из 60 000 обучающих изображений и 10 000 тестовых изображений различных классов одежды, например:

Каждое изображение представляет собой шкалу серого 28*28 пикселей. Мы загружаем набор данных с помощью команды ниже:

fashion_mnist = keras.datasets.fashion_mnist

Данные предварительной обработки

Мы хотим разделить данные на тестовые и обучающие наборы, поэтому мы делаем это с помощью команды:

(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

На выходе получаем следующее содержимое:

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 2s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 0s 0us/step

Теперь мы нормализуем загруженные изображения, разделив их на 255,0:

X_train = X_train/255.0
X_test  = X_test/255.0

А затем измените массив изображений, чтобы он стал допустимой формой для ввода.

X_train = X_train.reshape(-1, 28, 28, 1)
X_test = X_test.reshape(-1, 28, 28, 1)

Построить архитектуру модели

Мы определяем нашу модель внутри функции (позже мы вызываем эту функцию внутри нашей функции RandomSearch для построения модели). Структура этой CNN состоит из двух сверточных слоев, плоского слоя, полностью связанного слоя ReLU и, наконец, слоя SoftMax. Мы компилируем нашу модель в той же функции, задавая ей несколько значений на выбор, например, значение скорости обучения [0,01, 0,001].

def build_model(hp):  

  # model structure
  model = keras.Sequential([
    keras.layers.Conv2D(
        filters=hp.Int('conv_1_filter', min_value=32, max_value=90, step=14),
        kernel_size=hp.Choice('conv_1_kernel', values = [3,5]),
        activation='relu',
        input_shape=(28,28,1)
    ),
    keras.layers.Conv2D(
        filters=hp.Int('conv_2_filter', min_value=32, max_value=50, step=15),
        kernel_size=hp.Choice('conv_2_kernel', values = [3,5]),
        activation='relu'
    ),
    keras.layers.Flatten(),
    keras.layers.Dense(
        units=hp.Int('dense_1_units', min_value=32, max_value=120, step=17),
        activation='relu'
    ),
    keras.layers.Dense(10, activation='softmax')
  ])
  
  # compile our model
  model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3])),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
  
  return model

Настройка гиперпараметров

после построения архитектуры модели мы используем RandomSearch, чтобы найти наилучшие значения для параметров нашей модели. мы делаем это, используя наши обучающие данные, чтобы увидеть, какие параметры дадут нам большую точность:

tuner_search = RandomSearch(build_model,
                          objective='val_accuracy',
                          max_trials=4,directory='output3',
                          project_name="Mnist Fashion")

tuner_search.search(X_train,y_train,epochs=3,validation_split=0.1)

И получаем результаты:

Trial 4 Complete [00h 00m 42s]
val_accuracy: 0.8755000233650208

Best val_accuracy So Far: 0.906000018119812
Total elapsed time: 00h 02m 34s

Сохранив лучшую модель в качестве нашей модели, мы взглянем на ее структуру:

model=tuner_search.get_best_models(num_models=1)[0]

model.summary()

Структура модели будет выглядеть примерно так:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 24, 24, 74)        1924      
                                                                 
 conv2d_1 (Conv2D)           (None, 22, 22, 32)        21344     
                                                                 
 flatten (Flatten)           (None, 15488)             0         
                                                                 
 dense (Dense)               (None, 117)               1812213   
                                                                 
 dense_1 (Dense)             (None, 10)                1180      
                                                                 
=================================================================
Total params: 1,836,661
Trainable params: 1,836,661
Non-trainable params: 0
_________________________________________________________________

И, конечно, мы можем переобучить модель

Модель поезда

model.fit(X_train, y_train, epochs=11, validation_split=0.1, initial_epoch=4)

Оцените производительность

Мы используем тестовые данные для оценки нашей окончательной модели.

model.evaluate(X_test, y_test )

Это приводит к точности выше 90%, что достаточно, чтобы продемонстрировать, как работает настройка гиперпараметров:

313/313 [==============================] - 1s 4ms/step - loss: 0.2760 - accuracy: 0.9038
[0.27604591846466064, 0.9038000106811523]

Спасибо, что прочитали эту статью. Не забывайте хлопать 😠😆 . Вы также можете задать свои вопросы в разделе комментариев; Я с удовольствием на них отвечу.