Как я могу передать комбинацию архитектур в MLPClassifier?

Мне нужно создать 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'

Я не могу найти решение. Как мне это решить?

Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.

Community 02.01.2023 18:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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 нейронов в каждом.

cipos 02.01.2023 20:07

Вы можете построить 4 разных NN и сравнить результат каждого NN. MLP может принимать на вход только один кортеж.

Jisong Xiao 02.01.2023 22:34
Ответ принят как подходящий

Тестирование нескольких архитектур/гиперпараметров для поиска лучшей модели — задача для 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)}

Другие вопросы по теме