Python可视化卷积神经网络方法汇总
介绍深入学习中最具争议的话题之一是如何解释和理解一个经过训练的模型——特别是在医疗等高风险行业的背景下。“黑匣子”一词经常与深度学习算法联系在一起,如果我们不能解释模型是如何工作的,我们怎么能相信模型的结果呢?
介绍深入学习中最具争议的话题之一是如何解释和理解一个经过训练的模型——特别是在医疗等高风险行业的背景下。“黑匣子”一词经常与深度学习算法联系在一起,如果我们不能解释模型是如何工作的,我们怎么能相信模型的结果呢?这是个合理的问题。以一个为检测癌症而训练的深度学习模型为例,这个模型告诉你,它99%确定它已经检测到癌症,但它并没有告诉你为什么或者如何做出这个决定。是在核磁共振扫描中找到了重要线索的呢?还是只是扫描上的污点被错误地检测为肿瘤?这是病人生死攸关的问题,医生犯了错后果是很严重。
在本文中,我们将探讨如何可视化卷积神经网络(CNN),这是一种深入学习的体系结构,被用于最先进的基于图像的应用程序;我们将了解可视化CNN模型的重要性,以及可视化它们的方法;我们还将看一个用例,它将帮助你更好地理解这个概念。目录CNN模型可视化的重要性可视化方法显著图基于梯度的类激活图最大激活图像遮挡绘制模型架构可视化滤波器基本方法基于激活的方法基于梯度的方法CNN模型可视化的重要性正如我们在上面的癌症肿瘤例子中所看到的,我们知道我们的模型在做什么,以及它如何对预测做出决定,这是绝对重要的。通常,下面列出的原因是一个深度学习实践者要记住的最重要的知识点:了解模型的工作原理超参数调整找出模型的失败之处并能够解决失败向消费者/最终用户或业务主管解释决策让我们看一个例子,在这个例子中,可视化一个神经网络模型有助于理解模型一些不好的行为和提高性能(下面的例子来自:http://intelligence.org/files/AIPosNegFactor.pdf)。曾几何时,美国陆军想使用神经网络来自动检测伪装的敌方坦克。研究人员用50张树木伪装的坦克照片和50张没有坦克的树木照片训练了神经网络,使用标准技术来进行监督学习,研究人员对神经网络进行了训练,使其权重能够正确加载训练集:对50张伪装坦克的照片输出“是”,对50张树木照片的输出“否”。这并不能确保新的例子也可以被正确分类。神经网络可能已经“学习”了100个不会泛化到任何新问题的特殊情况,聪明的是,研究人员最初拍摄了200张照片,100张坦克照片和100张树木照片,他们在训练场只使用了50个。研究人员在剩下的100张照片上运行了神经网络,在没有进一步训练的情况下,神经网络对剩下的所有照片进行了正确的分类。不错!研究人员把完成的工作结果交给五角大楼,五角大楼很快就把工作交还给了他们,他们抱怨说,在他们自己的测试中,神经网络在辨别照片方面跟随机差不多。
结果发现,在研究人员的数据集中,伪装坦克的照片是在阴天拍摄的,而没有伪装的照片是在晴天拍摄的。神经网络学会了区分阴天和晴天,而不是区分伪装坦克和空旷的森林。CNN模型的可视化方法大体上,CNN模型的可视化方法可以根据其内部工作方式分为三个部分基本方法-向我们展示训练模型总体架构的简单方法基于激活的方法-在这些方法中,我们破译单个神经元或一组神经元的激活函数,以理解它们正在做什么基于梯度的方法-这些方法倾向于在训练模型时操纵由向前和反向传播形成的梯度我们将在下面的章节中详细介绍它们。在这里,我们将使用keras作为我们的库来构建深度学习模型,并使用keras-vis来可视化它们。在继续之前,请确保你已经在系统中安装了这些程序。注:本文使用“Identify the Digits”竞赛中给出的数据集,要运行下面提到的代码,你必须在系统中下载它。另外,在开始下面的实现之前,请执行要求的步骤。数据集:https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/准备步骤:https://www.analyticsvidhya.com/keras_script-py/1.基本方法1.1 绘制模型架构最简单的方法就是打印模型。在这里,你还可以打印神经网络中各个层的形状和每个层的参数。在keras中,可以按如下方式实现:model.summary()_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv2d_1 (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________conv2d_2 (Conv2D) (None, 24, 24, 64) 18496 _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0 _________________________________________________________________dropout_1 (Dropout) (None, 12, 12, 64) 0 _________________________________________________________________flatten_1 (Flatten) (None, 9216) 0 _________________________________________________________________dense_1 (Dense) (None, 128) 1179776 _________________________________________________________________dropout_2 (Dropout) (None, 128) 0 _________________________________________________________________preds (Dense) (None, 10) 1290 =================================================================Total params: 1,199,882Trainable params: 1,199,882Non-trainable params: 0为了更具创造性和表现力,你可以绘制一个架构图(keras.utils.vis_utils函数)。
1.2 可视化滤波器另一种方法是绘制训练模型的滤波器,以便我们可以了解这些滤波器的行为。例如,上述模型第一层的第一个滤波器如下所示:top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')
一般来说,我们看到低层的滤波器起到边缘探测器的作用,当我们走得更高时,它们倾向于捕捉像物体和人脸这样的高层概念。