我正在研究一些深度学习技术,并且遇到了一种不使用反向传播(https://arxiv.org/abs/1706.02480)的方法。此方法的基本思想是训练较浅的单个隐藏层,丢弃输出层,并在经过训练的(第一个)隐藏层和新的输出层之间添加另一个隐藏层。重复该过程(添加和训练),直到满足某些条件为止。
我正在尝试使用sklearn中提供的MLP分类器来实现此方法。我面临的问题是如何获取隐藏层的输出。例如,如果我使用
mlp = MLPClassifier()
mlp.predict(data)
,它将为我提供整个网络的输出。但是,我需要的是网络隐藏层的子输出。为了显示:
输入-> connection1(权重)->隐藏层-> connection2(权重)->输出(->预测)
我当前需要的不是输出预测,而是来自隐藏层(在隐藏层和连接2之间)的结果。
我知道隐藏层(在connection1和隐藏层之间)的输入可以通过以下方式计算:
np.matmul(data, mlp.coefs_[0]) + mlp.intercepts_[0]
有没有办法获取隐藏层的结果?
最佳答案
您误解了什么是什么。
输入是您传递的内容。
第一隐藏层由模型参数W1和b1组成。
隐藏层的输出为f(W1Tx + b1),其中f
是您的激活函数。
然后,这是第二隐层的输入,该第二隐层由模型参数W2和b2组成。等等...
所以,确切地说
from sklearn.neural_network._base import ACTIVATIONS
ACTIVATIONS['relu'](np.matmul(data, mlp.coefs_[0]) + mlp.intercepts_[0]))
是您要寻找的。
关于python - Python-sklearn.MLPClassifier:如何获取第一个隐藏层的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50869405/