网站首页 > 技术文章 正文
导读:为什么神经网络能做出决策?长久以来,这个黑盒问题一直困扰着我们。不过好在一些技术能帮助我们理解神经网络的决策过程。Hive是一家利用深度学习进行数据分析的公司,他们创造的模型grad-cam能帮助我们一窥神经网络的内部机制。
我们很想知道神经网络学到了什么、它是依靠什么来判断某张图片是有用的。利用grad-cam,我们研究了模型的预测:运动类型、行动/静止、毒品(drugs)、暴力、吸引点、种族、年龄等等。
很显然,在上面两个图片中,吸引力模型关注更多的是身体,也就是图片中部而非人脸。有趣的是,在训练中并没有加入任何边框信息,但模型自己就学会了定位。该模型在20万张图片上进行训练,研究团队Hive从中将其分成三类:hot、neutral、not。然后将每组中的分数合并,生成一个打分器,分数从0到10。可以点击这里,上传自己的照片试一试。
主要思想是在全局池化之前将Logit层应用到最后一个卷积层。这会创建一个地图,展示网络决策中每个像素的重要性。
上图最左,橄榄球运动员的照片告诉模型这是一个动作。分类器同样能识别中间的裸体图片和右边代表暴力的枪支。
上图右侧的图片中有一位穿着西装的男士,分类器将其认成“电视节目”而非“商业事物”,而这是帮助我们了解grad-CAM是如何解释模型决策的重要例子。
分类器还可以识别动画片。分类器的关注点往往在人物的边缘,同时还会加上背景,非常有趣。
CAM和GradCam
类别激活地图(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)
然后我们计算了损失函数相对于最后一个卷积层的导数,并对这些梯度进行归一化。
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从酒精转换成赌博后,我们可以看到,尽管赌博的概率很低,但它仍然能清楚地定位图片中表示赌博的地方。
猜你喜欢
- 2024-09-25 果断收藏!python数据分析入门学习笔记(下)
- 2024-09-25 「机器学习」支持向量机分类 支持向量机 知乎
- 2024-09-25 数据可视化之箱线图详细介绍 箱线图绘制步骤
- 2024-09-25 简单的统计学:如何用Python计算扑克概率
- 2024-09-25 Python进行数据预处理 python如何做数据处理
- 2024-09-25 Distribution is all you need:这里有12种做ML不可不知的分布
- 2024-09-25 如何使用 Qdrant DB 创建基于向量的电影推荐系统?
- 2024-09-25 如何可视化卷积网络分类图像时关注的焦点
- 2024-09-25 感知机:教程,实现和可视示例 感知机定义
- 2024-09-25 数据处理中的“归一化”到底是什么?Talk is cheap,show me the code
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)