编者按:为什么神经网络能做出决策?长久以来,这个黑盒问题一直困扰着我们。不过好在一些技术能帮助我们理解神经网络的决策过程。Hive是一家利用深度学习进行数据分析的公司,他们创造的模型grad-cam能帮助我们一窥神经网络的内部机制。以下是论智对该公司博文的编译。
我们很想知道神经网络学到了什么、它是依靠什么来判断某张图片是有用的。利用grad-cam,我们研究了模型的预测:运动类型、行动/静止、毒品(drugs)、暴力、吸引点、种族、年龄等等。
GitHub地址:github.com/hiveml/tensorflow-grad-cam
很显然,在上面两个图片中,吸引力模型关注更多的是身体,也就是图片中部而非人脸。有趣的是,在训练中并没有加入任何边框信息,但模型自己就学会了定位。该模型在20万张图片上进行训练,研究团队Hive从中将其分成三类:hot、neutral、not。然后将每组中的分数合并,生成一个打分器,分数从0到10。
主要思想是在全局池化之前将Logit层应用到最后一个卷积层。这会创建一个地图,展示网络决策中每个像素的重要性。
上图最左,橄榄球运动员的照片告诉模型这是一个动作。分类器同样能识别中间的裸体图片和右边代表暴力的枪支。
上图右侧的图片中有一位穿着西装的男士,分类器将其认成“电视节目”而非“商业事物”,而这是帮助我们了解grad-CAM是如何解释模型决策的重要例子。
分类器还可以识别动画片。分类器的关注点往往在人物的边缘,同时还会加上背景,非常有趣。
类别激活地图(CAM)最初是由Zhou创建的,它可以显示网络正在查看什么。对于每个类别,CAM可以标明图像中最重要的部分。
接着,Ramprasaath扩大了CAM的应用范围。具体来说,CAM可以处理全连接层和更加复杂的场景,例如问答。幸运的是,我们不需要修改网络就能计算grad-CAM。
最近,Chattopadhyay进一步改进了模型,提高了输出热图的准确度,改进后的模型成为Grad-CAM++,它能够更高效地处理多个类别中的对象,同时能识别出对象的整个轮廓,而非只对明显部位有反应。这样的结果是通过正偏导数的加权组合得到的。
以下是在TensorFlow上的安装方法
one_hot = tf.sparse_to_dense(predicted_class, [num_classes], 1.0)
signal = tf.multiply(end_points[‘Logits’], one_hot)
loss = tf.reduce_mean(signal)
这里生成一个num_classes元素的数组,其中只有非零的预测类别的logit,这定义了损失函数。
grads = tf.gradients(loss, conv_layer)[0]
norm_grads = tf.divide(grads, tf.sqrt(tf.reduce_mean(tf.square(grads)))
+ tf.constant(1e-5))
然后我们计算了损失函数相对于最后一个卷积层的导数,并对这些梯度进行归一化。
output, grads_val = sess.run([conv_layer, norm_grads],
feed_dict={imgs0: img})
之后运行图形来计算最后一个卷积层的输出和归一化的梯度。
weights = np.mean(grads_val, axis = (0, 1)) # [2048]
cam = np.ones(output.shape[0 : 2], dtype = np.float32) # [10,10]
计算每个10×10网格的梯度均值作为权重(假设输入的是299×299的图片)。由于在最终的10×10的卷积层上有2048个输出通道,因此有2048个权重。
cam = np.ones(output.shape[0 : 2], dtype = np.float32) # [10,10]
for i, w in enumerate(weights):
cam += w * output[:, :, i]
生成10×10的粗略输出作为平均梯度值和最终卷积层的加权总和。
将cam通过RELU,只取积极的分类结果。然后我们将地图的粗略输出调整为适合输入的大小并显示出来。
最后,主要功能为TensorFlow的slim模型和预处理功能。通过它们计算出grad-CAM的输出,并将其与输入照片混合。在下面的代码中,我们使用softmax概率最大的类别作为grad_cam的输入。除此之外,我们还可以选择任意一个类别,例如:
该模型以99%的概率将图片预测为“酒精”,0.4%的概率是“赌博”。但是当把predicted_class从酒精转换成赌博后,我们可以看到,尽管赌博的概率很低,但它仍然能清楚地定位图片中表示赌博的地方。
原文地址:thehive.ai/blog/inside-a-neural-networks-mind