获取中间层的输出可视化
在全连接神经网络训练好后,为了更好地理解全连接神经网络的计算过程,以获取网络在计算过程中中间隐藏层的输出,可以使用两种方法:
- 如果在网络的前向过程想要输出隐藏层,可以使用独特的变量进行命名,然后再输出时输出该变量,例如:
def forward(self,x):
fc1 = self.hidden1(x)
fc2 = self.hidden2(fc1)
output = self.classifica(fc2)
## 输出为两个隐藏层和输出层的输出
return fc1,fc2,output
在上面的forward()函数中,fc1和fc2分别是第一隐藏层和第二隐藏层的输出,ouput则为分类层的输出,最后使用return fc1, fc2, output同时将三个变量输出,便于在调用模型时,轻松获得隐藏层的输出。
- 如果在网络的前向过程只输出了最后一层的输出,并没有输出中间变量,这时想要获取中间层的输出,则使用钩子(hook)技术。钩子技术可以理解为对一个完整的业务流程,使用钩子可以在不修改原始网络代码的情况下,将额外的功能依附于业务流程,并获取想要的输出。
接下来针对上述已经训练好的网络,分别利用两种方法介绍如何从网络中获取中间隐藏层的输出,并对相关输出进行可视化。
- 使用中间层的输出
在上述定义的全连接网络类中,已经输出了隐藏层的输出,可以直接使用mlpc()作用于测试集时,输出相关内容,程序如下:
## 计算最终模型在测试集上的第二个隐藏层的输出
_,test_fc2,_=mlpc(X_test_t)
print("test_fc2.shape:",test_fc2.shape)
在上述程序和输出中,可以通过获取mlpc网络,让测试集在第二个隐藏层输出test_fc2。test_fc2的尺寸为[1151,10],表明有1151个样本,每个样本包含10个特征输出。
下面对10个特征进行降维,然后使用散点图进行可视化,程序如下:
## 对输出进行降维并可视化
test_fc2_tsne=