========================================
Как настроить размер пакета и количество эпох
========================================
В этом первом простом примере мы рассмотрим настройку размера пакета и количества эпох, используемых при подборе сети.Размер пакета в итеративном градиентном спуске — это количество шаблонов, показанных сети до обновления весов. Это также оптимизация обучения сети, определяющая, сколько паттернов читать за раз и хранить в памяти.Количество эпох — это количество раз, когда весь обучающий набор данных отображается в сети во время обучения. Некоторые сети чувствительны к размеру пакета, например рекуррентные нейронные сети 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