哈喽,大家好。
你有没有想过,我们编写的神经网络,内部究竟是什么样子的?
加拿大蒙特利尔一家公司开发一个3D可视化工具 —— Zetane Engine,帮助我们解决了这个问题。
只要在Zetane Engine打开一个深度学习模型,便可以看到网络中任何一层,并显示特征图。
为了演示Zetane Engine的用户,我搭建了AlexNet网络,在Fashion-MNIST数据集上训练了一个 10 个类别的分类器。
网络架构如下:
tf.keras.layers.Conv2D(filters=96, kernel_size=11, strides=4, input_shape=(224,224,3), activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Conv2D(filters=256, kernel_size=5, padding='same', activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same',activation='relu'),
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same',activation='relu'),
tf.keras.layers.Conv2D(filters=256, kernel_size=3, padding='same',activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4096, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(4096, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10)
网络使用Keras搭建,AlexNet模型非常简单,包含5个卷积层和3个全连接层。
训练样本如下:
样本对应的 10 类别如下:
训练 50 个 epoch,模型的准确度是 92%,将模型保存为alexnet.h5,用Zetane Engine打开
可以看到AlexNet的网络结构。
我们输入一张裤子图片,查看第一个卷积层输出的特征图
第一个卷积层
图片经过第一个卷积层后,输出的特征图肉眼能明显辨识出是裤子。
我们再看下经过更深层的卷积网络之后,会是什么样子
深度卷积
中间第2、3层明显可以看出是在提取边缘特征,不用类别的物体的边缘特征是不同的,并且边缘特征相比原图表达能力更强,相当于是原图更抽象一级的特征,不过这里还是可以看出来是裤子。
但到了第4、5层,特征更抽象了,肉眼已经看不出是裤子了,当然也说明模型学习能力更强了。
简单总结下,神经网络从浅层到深层,学习的特征越来越抽象,学习能力也越来越强。
AlexNet网络除了有卷积层,还有池化层,我们也可以看下特征经过池化层的效果
颜色越明亮,代表权重越高。从上图可以看到最大池化层能强化重要特征,发挥去噪、降维的作用。
另外,你可能会主要到网络上每个节点的前后都有一些白色圆点组成的方块。
左边代表该节点输入特征和权重,右边代表输出的特征。点击它们可以看到不同视角的特征图
三维视角
二维视角
标注卷积结果的平面图
卷积结果的平面图
尤其对于网络的最后一个节点,它的输出是预测结果
它输出了长度为 10 的特征向量,即:预测图片属于哪个类别的权重。可以看到权重最大的是类别1,类别1对应的是裤子,所以模型的预测结果是正确的。