[PYTHON] Optimieren von Hyperparametern mit Grid Search mithilfe einer Pipeline mit Keras

Keras lernt die Gewichte von Variablen, aber es gibt auch feste Parameter wie die Anzahl der Neuronen, die Anzahl der benötigten Schichten und den optimalen Wert der Lernrate. Dieses Mal werde ich es an GridSearch von scikit-learn übergeben, um diese Parameter zu optimieren. In diesem Beispiel wird unter der Annahme geschrieben, dass mit Daten wie Iris klassifiziert wird.

Vorbereitung

Laden Sie zusätzlich zu den zum Erstellen des Modells erforderlichen Bibliotheken Folgendes:

python


from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline

Modellbildung funktionalisieren

Erstellen Sie eine Funktion mit dem Parameter, den Sie als Argument ändern möchten. In diesem Beispiel wird der Einfachheit halber die Anzahl der Neuronen in der zweiten und den folgenden Schichten als n-te Wurzel der ursprünglichen Anzahl von Neuronen berechnet.

python


def create_model(self, evMethod, neurons, layers, learn_rate):
	# Criate model
	model = Sequential()
	model.add(Dense(neurons, input_dim=self.column_length, kernel_initializer='normal', activation='relu'))
	for i in range(1, layers):
		model.add(Dense(int(numpy.ceil(numpy.power(neurons,1/i))), kernel_initializer='normal', activation='relu'))
	model.add(Dense(3, kernel_initializer='normal', activation='softmax'))
	# Compile model
	adam = optimizers.Adam(lr=learn_rate)
	model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
	return model

Bereiten Sie ein Array vor, das an das Modell übergeben werden soll

Alle müssen in einem Array übergeben werden.

python


batch_size = [1000,300,100]
epochs = [10, 50, 100]
neurons = [20, 30, 45]
learn_rate = [0.001, 0.005, 0.01, 0.07]
layers = [1,3,5]

Lernen

Übergeben Sie das Modell an die Pipeline

Fügen Sie dem Schätzer das erstellte Modell als "mlp" hinzu. Der Anfangswert wird nicht verwendet, daher ist er angemessen.

python


estimators = []
estimators.append(('mlp', KerasClassifier(build_fn=self.create_model, epochs=10, batch_size=200, verbose=1)))
pipeline = Pipeline(estimators)

Übergeben Sie die Parameter an die Pipeline

python


param_grid = dict(mlp__neurons = neurons, mlp__batch_size = batch_size, mlp__epochs=epochs, mlp__learn_rate=learn_rate, mlp__layers=layers)

Die Rastersuche entspricht der normalen Verwendung

python


grid = GridSearchCV(estimator=pipeline, param_grid=param_grid)
grid_result = grid.fit(self.X, self.Y)

Zeigen Sie die beste Kombination

best_estimator_ zeigt Ihnen die Parameter des besten Modells. Die Genauigkeit wird ebenfalls angezeigt.

python


clf = grid_result.best_estimator_
print(clf.get_params())
accuracy = clf.score(self.X, self.Y)
print("\nAccuracy: %.2f" % (accuracy))

Speichern Sie das beste Modell

Die Verwendung von GridSearch dauert dutzende Male länger. Daher wird empfohlen, das beste Modell zu speichern. Bitte beachten Sie, dass der Aufruf im Vergleich zum normalen Erstellen eines Modells etwas Besonderes ist.

python


clf.steps[1][1].model.save('file to path')

Auf diese Weise können Sie andere Variablen wie Aktivierungsfunktionen optimieren. Nutzen Sie diese also bitte.

Nachtrag: Randomized Grid Search-Version

Da der Speicher während des Trainings abgelaufen war, wechselte ich von GridSearch zu Randomized GridSearch, um die Anzahl der Versuche zu verringern. Fast alles, was Sie tun müssen, ist den Funktionsnamen zu ersetzen. Wenn Sie eine große Anzahl von Parameterkombinationen haben, ist dies für die Ausführung realistischer.

python


grid = RandomizedSearchCV(estimator=pipeline, param_distributions=param_grid, n_iter=30)

Recommended Posts

Optimieren von Hyperparametern mit Grid Search mithilfe einer Pipeline mit Keras
Hyperparameter-Tuning mit LightGBM-Tuner
Optimieren von Keras-Parametern mit Keras Tuner
Automatisierung der Parameteroptimierung mit Keras mit GridSearch CV
Parameteroptimierung mit GridSearchCV / RandomizedSearchCV unter Verwendung des Voting Classifier
Parametereinstellung mit luigi
CIFAR-10-Tutorial mit Keras
Multivariates LSTM mit Keras
Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen