Я прошел через некоторые глубокие методы обучения и наткнулся на метод, который не использует обратное распространение (https://arxiv.org/abs/1706.02480). Основная идея этого метода состоит в том, чтобы обучить неглубокий скрытый слой, отбросить выходной слой и добавить еще один скрытый слой между обученным (первым) скрытым слоем и новым уровнем вывода. Процесс повторяется (добавление и обучение) до тех пор, пока не будет выполнен некоторый критерий. Я пытаюсь реализовать этот метод, используя классификатор MLP, предоставленный в sklearn. Проблема, с которой я сталкиваюсь, заключается в том, как получить вывод скрытых слоев. Например, если я использую
mlp = MLPClassifier()
mlp.predict(data)
он даст мне выход всей сети. Однако то, что мне нужно, - это суб-выход скрытого уровня сети. Проиллюстрировать:
вход → connection1 (вес) → скрытый слой → connection2 (вес) → вывод (-> предсказание)
То, что я сейчас требую, - это не выходное предсказание, а результат, который выходит из скрытого слоя (между скрытым слоем и соединением 2). Я знаю, что вход для скрытого слоя (между соединением1 и скрытым слоем) можно вычислить
np.matmul(data, mlp.coefs_[0]) + mlp.intercepts_[0]
Есть ли способ получить результаты скрытого слоя?
Вы неправильно поняли, что к чему.
Вход - это то, что вы проходите.
Первый скрытый слой состоит из параметров модели W 1 и b 1.
Результатом скрытого слоя является f (W 1T x + b 1), где f
- ваша функция активации.
Затем это вход ко второму скрытому слою, который состоит из параметров модели W 2 и b 2. И так оно и есть....
Итак, если быть точным
from sklearn.neural_network._base import ACTIVATIONS
ACTIVATIONS['relu'](np.matmul(data, mlp.coefs_[0]) + mlp.intercepts_[0]))
это то, что вы ищете.