从 sklearn 的 MLPClassifier 中检索最终的隐藏激活层输出
Posted
技术标签:
【中文标题】从 sklearn 的 MLPClassifier 中检索最终的隐藏激活层输出【英文标题】:Retrieve final hidden activation layer output from sklearn's MLPClassifier 【发布时间】:2018-03-25 12:46:27 【问题描述】:我想在 fit
ting 数据之后使用 sklearn 的 MLPClassifier
对神经网络最终隐藏激活层输出进行一些测试。
例如,如果我创建一个分类器,假设数据 X_train
带有标签 y_train
和两个大小为 (300,100)
的隐藏层
clf = MLPClassifier(hidden_layer_sizes=(300,100))
clf.fit(X_train,y_train)
我希望能够以某种方式调用一个函数来检索长度为100
的最终隐藏激活层向量,以用于其他测试。
假设一个测试集X_test, y_test
,正常预测是:
preds = clf.predict(X_test)
但是,我想做类似的事情:
activation_layers_for_all_X_test = clf.get_final_activation_output(X_test)
存在诸如get_weights
之类的函数,但这只会对我每层有所帮助。除了自己进行转换之外,是否有另一种方法可以为最终隐藏层检索这些最终隐藏层激活的输出?
以这张图为例:
我想要的输出是Out Layer
,即来自最终隐藏层的最终激活输出。
【问题讨论】:
您在寻找predict_proba
吗?这就是我理解的最后一层激活。
@ncfirth predict_proba
是softmax
的输出,而不是实际的隐藏激活层输出。最终隐藏层输出提供给softmax
最终层输出。基本上我想要在那之前的隐藏层输出。我才意识到我可能没有很好地解释这一点。我会尝试解决这个问题。
啊,好的,sklearn 中好像没有函数。看我的回答,刚来
【参考方案1】:
正如我在上面的评论中所说,sklearn
中似乎没有一个函数可以完全按照您的要求执行操作,但是您可以非常轻松地破解 _predict
函数以使其执行您想要的操作。以下代码将返回所有激活,您可以将其编辑为 return activations[-2]
以获取所需的部分。
def get_activations(clf, X):
hidden_layer_sizes = clf.hidden_layer_sizes
if not hasattr(hidden_layer_sizes, "__iter__"):
hidden_layer_sizes = [hidden_layer_sizes]
hidden_layer_sizes = list(hidden_layer_sizes)
layer_units = [X.shape[1]] + hidden_layer_sizes + \
[clf.n_outputs_]
activations = [X]
for i in range(clf.n_layers_ - 1):
activations.append(np.empty((X.shape[0],
layer_units[i + 1])))
clf._forward_pass(activations)
return activations
【讨论】:
这似乎是在创建一个随机的 np.arraynp.empty
或 size = (X.shape[0], layer_units[i+1])
,这只是基于激活层的大小。值的总和和求和输入的激活在哪里?在对我的数据进行测试后,这似乎不像一个神经元。我是不是误会了什么?
哦,废话。我删除了最重要的一行。更新答案!
我正在阅读sklearn
中的BaseMultilayerPerceptron
代码,而这段代码几乎就是_predict
函数所做的。笑得很开心,这很有帮助,谢谢@ncfirth以上是关于从 sklearn 的 MLPClassifier 中检索最终的隐藏激活层输出的主要内容,如果未能解决你的问题,请参考以下文章
在keras中复制sklearn的MLPClassifier()
partial_fit Sklearn 的 MLPClassifier
Sklearn 中 MLPClassifier 中最重要的功能