Мне нужно создать MLPClassifier
с hidden_layer_sizes
, то есть кортеж, определяющий количество нейронов в скрытых слоях.
Например: (10,)
означает, что есть только 1 скрытый слой с 10 нейронами. (10, 50,)
означает, что есть 2 скрытых слоя, первый с 10 нейронами, второй с 50 нейронами и так далее. Я хочу протестировать каждый из них последовательно.
Я прошел этот словарь:
hl_parameters = {'hidden_layer_sizes': [(10,), (50,), (10,10,), (50,50,)]}
И определил MLPClassifier
следующим образом:
mlp_cv = MLPClassifier(hidden_layer_sizes=hl_parameters['hidden_layer_sizes'], max_iter=300, alpha=1e-4, solver='sgd', tol=1e-4, learning_rate_init=.1, verbose=True, random_state=ID)
mlp_cv.fit(X_train, y_train)
Но когда я подогнал модель, я получил эту ошибку:
TypeError
Traceback (most recent call last)
Input In [65], in <cell line: 9>()
8 mlp_cv = MLPClassifier(hidden_layer_sizes=hl_parameters['hidden_layer_sizes'], max_iter=300, alpha=1e-4, solver='sgd', tol=1e-4, learning_rate_init=.1, verbose=True, random_state=ID)
----> 9 mlp_cv.fit(X_train, y_train)
File ~/opt/anaconda3/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:752, in BaseMultilayerPerceptron.fit(self, X, y)
735 def fit(self, X, y):
736 """Fit the model to data matrix X and target(s) y.
737
738 Parameters
(...)
750 Returns a trained MLP model.
751 """
--> 752 return self._fit(X, y, incremental=False)
File ~/opt/anaconda3/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:385, in BaseMultilayerPerceptron._fit(self, X, y, incremental)
383 # Validate input parameters.
384 self._validate_hyperparameters()
--> 385 if np.any(np.array(hidden_layer_sizes) <= 0):
386 raise ValueError(
387 "hidden_layer_sizes must be > 0, got %s." % hidden_layer_sizes
388 )
389 first_pass = not hasattr(self, "coefs_") or (
390 not self.warm_start and not incremental
391 )
TypeError: '<=' not supported between instances of 'tuple' and 'int'
Я не могу найти решение. Как мне это решить?
MLPClassifier (hidden_layer_sizes = hl_parameters ['hidden_layer_sizes'], max_iter = 300, alpha = 1e-4, Solver = 'sgd', tol = 1e-4, learning_rate_init = .1, verbose = True, random_state = ID)
это поле является проблемой... вы предоставляете список кортежей в качестве входных данных для hidden_layer_sizes. MLPClassifier может принимать кортеж только для hidden_layer_sizes.
если вам нужно 3 скрытых слоя с 10, 50 и 50 нейронами, просто введите (10,50,50) для размеров скрытого слоя. Если вы тестируете разные конфигурации, вы можете составить список кортежей и последовательно перебирать различные комбинации вместо того, чтобы вводить полный список.
Спасибо, значит, я не могу передать четыре разные архитектуры одновременно, верно? В этом случае, прежде всего, я хочу протестировать НС со скрытым слоем, состоящим из 10 нейронов. Затем НС со скрытым слоем из 50 нейронов. Кроме того, НС состоит из двух скрытых слоев по 10 нейронов в каждом и, наконец, НС из двух скрытых слоев по 50 нейронов в каждом.
Вы можете построить 4 разных NN и сравнить результат каждого NN. MLP может принимать на вход только один кортеж.
Тестирование нескольких архитектур/гиперпараметров для поиска лучшей модели — задача для GridSearchCV.
Вот пример тестирования четырех архитектур в вопросе:
from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV
from sklearn.neural_network import MLPClassifier
X, y = make_classification(n_samples=10_000)
# Initialize MLPClassifier with some parameters
clf = MLPClassifier(max_iter=300, alpha=1e-4, solver = "sgd", tol=1e-4, learning_rate_init=.1)
# Search over `hidden_layer_sizes`
search = GridSearchCV(clf, param_grid = {'hidden_layer_sizes': [(10,), (50,), (10,10,), (50,50,)]}, n_jobs=-1, verbose=3)
search.fit(X, y)
print(search.best_params_)
Что показывает нам, что лучшая производительность перекрестной проверки hidden_layer_sizes=(10, 10,)
{'hidden_layer_sizes': (10, 10)}
Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.