“好啦,本次课程到此就结束了。”咖哥说。

“等等,咖哥。”小冰喊道,“这么早下课?”

“嗯?小冰,你还有什么疑问?”咖哥回答。

小冰继续说:“是这样的,卷积网络,处理图像效果很好,但是我总觉得它是一个‘黑盒子’。所以我有点好奇,想看一看特征提取过程中,这个卷积网络里面到底发生了什么。”

咖哥说:“噢,这样啊。你这种疑惑还是挺常见的。人们也开发了几种方法来查看卷积网络的内部结构。我给你介绍一种比较简单的方法吧。通过这个叫作中间激活的方法,我们可以看到卷积过程中特征图的‘特征通道’。”

中间激活的实现代码如下:

from keras.models import load_model # 导入模型保存工具

import matplotlib.pyplot as plt # 导入Matplotlib库

model = load_model('../my_dog_cnn.h5')# 载入刚才保存的模型

# 绘制特征通道

layer_outputs = [layer.output for layer in model.layers[:16]]

image = X_train[0]

image = image.reshape(1, 150, 150, 3)

activation_model = models.Model(inputs=model.input, outputs=layer_outputs)

activations = activation_model.predict(image)

first_layer_activation = activations[0]

plt.matshow(first_layer_activation[0, :, :, 2], cmap='viridis')

plt.matshow(first_layer_activation[0, :, :, 3], cmap='viridis')

特征通道的示例如下图所示。

狗面部轮廓特征通道

狗眼特征通道(抱着狗狗的人的眼睛也被激活)

通过观察这些特征通道的中间激活图就能发现,卷积网络中的各个通道并不是漫无目地进行特征提取,而是各负其责,忽略不相关的噪声信息,专门聚焦于自己所负责的那部分特征,激活各个特征点。这些特征点(也就是小模式)进行组合,就实现了高效率的图像识别。