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.
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
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
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]
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)
python
param_grid = dict(mlp__neurons = neurons, mlp__batch_size = batch_size, mlp__epochs=epochs, mlp__learn_rate=learn_rate, mlp__layers=layers)
python
grid = GridSearchCV(estimator=pipeline, param_grid=param_grid)
grid_result = grid.fit(self.X, self.Y)
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))
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.
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