Keras apprend les poids des variables, mais il existe également des paramètres fixes tels que le nombre de neurones bons, le nombre de couches nécessaires et la valeur optimale du taux d'apprentissage. Cette fois, je le passerai à GridSearch de scikit-learn pour régler ces paramètres. Dans cet exemple, il est écrit en supposant le cas de la classification avec des données telles que l'iris.
En plus des bibliothèques nécessaires à la création du modèle, chargez les éléments suivants:
python
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
Créez une fonction avec le paramètre que vous souhaitez modifier comme argument. Dans cet exemple, pour des raisons de simplicité, le nombre de neurones dans la deuxième couche et les couches suivantes est calculé comme la nième racine du nombre original de neurones.
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
Tout doit être passé dans un tableau.
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]
Ajoutez le modèle créé en tant que «mlp» à l'estimateur. La valeur initiale n'est pas utilisée, elle est donc appropriée.
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_
vous indiquera les paramètres du meilleur modèle. La précision est également affichée.
python
clf = grid_result.best_estimator_
print(clf.get_params())
accuracy = clf.score(self.X, self.Y)
print("\nAccuracy: %.2f" % (accuracy))
L'utilisation de GridSearch prend des dizaines de fois plus de temps d'apprentissage, il est donc également recommandé d'enregistrer le meilleur modèle. Veuillez noter que l'appel est spécial par rapport au cas de la construction d'un modèle normalement.
python
clf.steps[1][1].model.save('file to path')
De cette façon, vous pouvez régler d'autres variables telles que les fonctions d'activation, veuillez donc en profiter.
Comme la mémoire était terminée pendant l'entraînement, je suis passé de GridSearch à Randomized GridSearch pour réduire le nombre d'essais. Cela fonctionne simplement en remplaçant le nom de la fonction. Si vous avez un grand nombre de combinaisons de paramètres, c'est plus réaliste pour l'exécution.
python
grid = RandomizedSearchCV(estimator=pipeline, param_distributions=param_grid, n_iter=30)
Recommended Posts