Настройка гиперпараметров — Keras Tuner (реализация Python Tensorflow)
Привет, ребята. Это Арвин. Не теряйте времени, так что я начну немедленно. Настройка гиперпараметров — довольно важный вопрос. Так что же, во имя всего этого нечестивого, такое «настройка гиперпараметров»?
Настройка гиперпараметров заключается в нахождении набора оптимальных значений гиперпараметров для алгоритма обучения при одновременном применении этого оптимизированного алгоритма к любому набору данных. Эта комбинация гиперпараметров максимизирует производительность модели, сводя к минимуму предопределенную функцию потерь для получения лучших результатов с меньшим количеством ошибок. ("Источник")
Так что же все это означает? Это довольно легко. Поговорим об этом на примере. Предположим, у нас есть некоторая модель нейронной сети, для этой модели требуется некоторая скорость обучения альфа. Теперь, как мы определяем альфу? выбрав несколько случайных альфа-каналов, чтобы увидеть, какой из них работает лучше. Вот и все. По сути, это настройка гиперпараметров, случайный/систематический поиск лучших параметров. Так что теории не так много.
Приступим непосредственно к реализации. Если вы хотите получить доступ к полному коду, посетите мой GitHub по ссылке ниже:
ВЫПОЛНЕНИЕ
Здесь мы реализуем использование «keras_tuner» в Google Colab для некоторой модели CNN. Просто предупреждаю, keras_tuner не установлен на Colab, поэтому вам нужно сделать:
!pip install keras_tuner
И это будет все. Далее мы пройдем наши обычные 6 шагов с дополнительным шагом настройки гиперпараметров:
- Импорт
- Загрузить данные
- Данные предварительной обработки
- Построить архитектуру модели
- Настройка гиперпараметров
- Модель поезда
- Оцените производительность модели
Импорт
сначала мы импортируем 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]
Спасибо, что прочитали эту статью. Не забывайте хлопать 😠😆 . Вы также можете задать свои вопросы в разделе комментариев; Я с удовольствием на них отвечу.