Friday, July 15, 2022

Grid search hyperparameters for deep learning models in Python with Keras

 ========================================

Как настроить размер пакета и количество эпох

========================================

В этом первом простом примере мы рассмотрим настройку размера пакета и количества эпох, используемых при подборе сети.Размер пакета в итеративном градиентном спуске — это количество шаблонов, показанных сети до обновления весов. Это также оптимизация обучения сети, определяющая, сколько паттернов читать за раз и хранить в памяти.Количество эпох — это количество раз, когда весь обучающий набор данных отображается в сети во время обучения. Некоторые сети чувствительны к размеру пакета, например рекуррентные нейронные сети LSTM и сверточные нейронные сети.Здесь мы оценим набор различных размеров мини-пакетов от 10 до 100 с шагом

(.env) boris@boris-All-Series:~/GRIDHYPER$ cat GridSearchHyper2.py

# Use scikit-learn to grid search the batch size and epochs

import numpy as np

import tensorflow as tf

from sklearn.model_selection import GridSearchCV

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense

from scikeras.wrappers import KerasClassifier

# Function to create model, required for KerasClassifier

def create_model():

# create model

model = Sequential()

model.add(Dense(12, input_shape=(8,), activation='relu'))

model.add(Dense(1, activation='sigmoid'))

# Compile model

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

return model

# fix random seed for reproducibility

seed = 7

tf.random.set_seed(seed)

# load dataset

dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables

X = dataset[:,0:8]

Y = dataset[:,8]

# create model

model = KerasClassifier(model=create_model, verbose=0)

# define the grid search parameters

batch_size = [10, 20, 40, 60, 80, 100]

epochs = [10, 50, 100]

param_grid = dict(batch_size=batch_size, epochs=epochs)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=4, cv=3)

grid_result = grid.fit(X, Y)

# summarize results

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

means = grid_result.cv_results_['mean_test_score']

stds = grid_result.cv_results_['std_test_score']

params = grid_result.cv_results_['params']

for mean, stdev, param in zip(means, stds, params):

    print("%f (%f) with: %r" % (mean, stdev, param))


(.env) boris@boris-All-Series:~/GRIDHYPER$ python3 GridSearchHyper2.py

Best: 0.701823 using {'batch_size': 20, 'epochs': 100}

0.608073 (0.105026) with: {'batch_size': 10, 'epochs': 10}

0.671875 (0.016573) with: {'batch_size': 10, 'epochs': 50}

0.687500 (0.014616) with: {'batch_size': 10, 'epochs': 100}

0.614583 (0.037377) with: {'batch_size': 20, 'epochs': 10}

0.679688 (0.059069) with: {'batch_size': 20, 'epochs': 50}

0.701823 (0.023073) with: {'batch_size': 20, 'epochs': 100}

0.563802 (0.082700) with: {'batch_size': 40, 'epochs': 10}

0.643229 (0.036966) with: {'batch_size': 40, 'epochs': 50}

0.684896 (0.019225) with: {'batch_size': 40, 'epochs': 100}

0.519531 (0.087753) with: {'batch_size': 60, 'epochs': 10}

0.675781 (0.026107) with: {'batch_size': 60, 'epochs': 50}

0.673177 (0.007366) with: {'batch_size': 60, 'epochs': 100}

0.479167 (0.136898) with: {'batch_size': 80, 'epochs': 10}

0.606771 (0.069974) with: {'batch_size': 80, 'epochs': 50}

0.643229 (0.028587) with: {'batch_size': 80, 'epochs': 100}

0.399740 (0.073726) with: {'batch_size': 100, 'epochs': 10}

0.608073 (0.049445) with: {'batch_size': 100, 'epochs': 50}

0.575521 (0.035564) with: {'batch_size': 100, 'epochs': 100}

===================================

Как настроить скорость обучения и импульс

===================================

Обычно алгоритм оптимизации предварительно выбирают для обучения сети и настройки ее параметров.На сегодняшний день наиболее распространенным алгоритмом оптимизации является старый добрый стохастический градиентный спуск (SGD), потому что он так хорошо изучен. В этом примере мы рассмотрим оптимизацию скорости обучения SGD и параметров импульса.Скорость обучения определяет, насколько обновлять вес в конце каждой партии, а импульс определяет, насколько предыдущее обновление влияет на текущее обновление веса.

Мы попробуем набор небольших стандартных скоростей обучения и значений импульса от 0,2 до 0,8 с шагом 0,2, а также 0,9 (поскольку на практике это может быть популярным значением). В Keras способ установки скорости обучения и импульса следующий:

optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.2)

(.env) boris@boris-All-Series:~/GRIDHYPER$ cat GridSearchHyper1.py

# Use scikit-learn to grid search the learning rate and momentum

import numpy as np

import tensorflow as tf

from sklearn.model_selection import GridSearchCV

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense

from tensorflow.keras.optimizers import SGD

from scikeras.wrappers import KerasClassifier

# Function to create model, required for KerasClassifier

def create_model():

# create model

model = Sequential()

model.add(Dense(12, input_shape=(8,), activation='relu'))

model.add(Dense(1, activation='sigmoid'))

return model

# fix random seed for reproducibility

seed = 7

tf.random.set_seed(seed)

# load dataset

dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables

X = dataset[:,0:8]

Y = dataset[:,8]

# create model

model = KerasClassifier(model=create_model, loss="binary_crossentropy", optimizer="SGD", epochs=100, batch_size=10, verbose=0)

# define the grid search parameters

learn_rate = [0.001, 0.01, 0.1, 0.2, 0.3]

momentum = [0.0, 0.2, 0.4, 0.6, 0.8, 0.9]

param_grid = dict(optimizer__learning_rate=learn_rate, optimizer__momentum=momentum)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=4, cv=3)

grid_result = grid.fit(X, Y)

# summarize results

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

means = grid_result.cv_results_['mean_test_score']

stds = grid_result.cv_results_['std_test_score']

params = grid_result.cv_results_['params']

for mean, stdev, param in zip(means, stds, params):

    print("%f (%f) with: %r" % (mean, stdev, param))

===========

RUNTIME

===========

(.env) boris@boris-All-Series:~/GRIDHYPER$ python3 GridSearchHyper1.py

Best: 0.684896 using {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.2}

0.671875 (0.008438) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.0}

0.684896 (0.004872) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.2}

0.679688 (0.009568) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.4}

0.675781 (0.011049) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.6}

0.664062 (0.027621) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.8}

0.670573 (0.039879) with: {'optimizer__learning_rate': 0.001, 'optimizer__momentum': 0.9}

0.677083 (0.024150) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.0}

0.638021 (0.025976) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.2}

0.653646 (0.010253) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.4}

0.656250 (0.008438) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.6}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.8}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.01, 'optimizer__momentum': 0.9}

0.649740 (0.003683) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.0}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.2}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.4}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.6}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.8}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.1, 'optimizer__momentum': 0.9}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.0}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.2}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.4}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.6}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.8}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.2, 'optimizer__momentum': 0.9}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.0}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.2}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.4}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.6}

0.649740 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.8}

0.651042 (0.001841) with: {'optimizer__learning_rate': 0.3, 'optimizer__momentum': 0.9}

======================================

Как настроить алгоритм оптимизации обучения

======================================

Keras предлагает набор различных современных алгоритмов оптимизации.

В этом примере мы настраиваем алгоритм оптимизации, используемый для обучения сети, каждый с параметрами по умолчанию. Это нестандартный пример, потому что часто вы выбираете один подход априори и вместо этого сосредотачиваетесь на настройке его параметров для вашей проблемы.Здесь мы оценим набор алгоритмов оптимизации, поддерживаемых Keras API.

(.env) boris@boris-All-Series:~/GRIDHYPER$ cat GridSearchHyper3.py

# Use scikit-learn to grid search the batch size and epochs

import numpy as np

import tensorflow as tf

from sklearn.model_selection import GridSearchCV

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense

from scikeras.wrappers import KerasClassifier

# Function to create model, required for KerasClassifier

def create_model():

# create model

model = Sequential()

model.add(Dense(12, input_shape=(8,), activation='relu'))

model.add(Dense(1, activation='sigmoid'))

# return model without compile

return model

# fix random seed for reproducibility

seed = 7

tf.random.set_seed(seed)

# load dataset

dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables

X = dataset[:,0:8]

Y = dataset[:,8]

# create model

model = KerasClassifier(model=create_model, loss="binary_crossentropy", epochs=100, batch_size=10, verbose=0)

# define the grid search parameters

optimizer = ['SGD', 'RMSprop', 'Adagrad', 'Adadelta', 'Adam', 'Adamax', 'Nadam']

param_grid = dict(optimizer=optimizer)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=4, cv=3)

grid_result = grid.fit(X, Y)

# summarize results

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

means = grid_result.cv_results_['mean_test_score']

stds = grid_result.cv_results_['std_test_score']

params = grid_result.cv_results_['params']

for mean, stdev, param in zip(means, stds, params):

    print("%f (%f) with: %r" % (mean, stdev, param))

(.env) boris@boris-All-Series:~/GRIDHYPER$ python3 GridSearchHyper3.py

Best: 0.701823 using {'optimizer': 'Nadam'}

0.654948 (0.027498) with: {'optimizer': 'SGD'}

0.630208 (0.089437) with: {'optimizer': 'RMSprop'}

0.523438 (0.036782) with: {'optimizer': 'Adagrad'}

0.494792 (0.101329) with: {'optimizer': 'Adadelta'}

0.678385 (0.042112) with: {'optimizer': 'Adam'}

0.691406 (0.034499) with: {'optimizer': 'Adamax'}

0.701823 (0.012075) with: {'optimizer': 'Nadam'}


No comments:

Post a Comment