加入收藏 | 设为首页 | 会员中心 | 我要投稿 甘孜站长网 (https://www.0836zz.com.cn/)- 运维、物联设备、数据计算、智能推荐、云管理!
当前位置: 首页 > 运营中心 > 建站资源 > 经验 > 正文

看懂这篇指南,包你掌握神经网络的“黑匣子”

发布时间:2019-06-04 23:54:13 所属栏目:经验 来源:读芯术
导读:人类的神经网络是如何运行的?这个问题让很多数据科学家感到困惑。解释某个简单神经网络的工作机制非常容易,但是当某个计算机视觉项目中的层数增加1000倍时,该怎么办呢? 终端用户想要了解模型是如何得到最终结果时,仅用纸和笔来解释深度神经网络的工作机

示例模型使用对应于印度大象类别的随机输入,输出了以下内容:

看懂这篇指南,包你掌握神经网络的“黑匣子”

从图像中可以看到,模型期望的结构为象牙、大眼睛和象鼻。这些信息可以有效帮助检查数据集的完整性。例如,假设该模型将关注的特征理解为背景中的树木或草丛等其它物体,由于印度象的栖息地中往往含有大量的树木或草丛,模型就可能产生错误。然后,通过最大激活,就会发现已有的数据集可能不足以完成任务,因此需要将生活在不同栖息地的大象图像添加到训练集中,实现大象特征的准确辨别。

遮挡图——将输入过程的重要部分可视化

激活最大化主要用于将图像中模型的期待可视化。而图像遮挡可以找出图像中对模型来说至关重要的部分。

现在,为了理解图像遮挡的工作原理,我们设立了一个模型,它能够根据丰田、奥迪等制造商对汽车进行分类。

看懂这篇指南,包你掌握神经网络的“黑匣子”

能够判断图中汽车属于哪家公司吗?一定很难吧。因为公司标识所在的部分被遮挡了。显然,图像中被遮挡部分是辨别汽车所属厂商时非常重要的线索。

同样地,为了生成遮挡图,我们遮挡了图像中的某些部分,然后计算它属于某一类的概率。如果概率降低,就意味着遮挡部分对于完成分类非常重要。否则,该部分就无足轻重了。

示例程序将概率同图像每个部分的像素值联系起来,对其进行标准化后生成热图:

  1. import numpy as np 
  2.  
  3. from keras.utils import np_utils 
  4. from keras.models import Sequential 
  5. from keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, MaxPooling2D 
  6. from keras.optimizers import Adam 
  7. from keras.callbacks import EarlyStopping, ModelCheckpoint 
  8. from keras.preprocessing.image import ImageDataGenerator 
  9. from keras.activations import relu 
  10.  
  11. %matplotlib inline 
  12. import matplotlib.pyplot as plt 
  13. def iter_occlusion(image, size=8): 
  14.  
  15.     occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32) 
  16.     occlusion_center = np.full((size, size, 1), [0.5], np.float32) 
  17.     occlusion_padding = size * 2 
  18.  
  19.     # print('padding…') 
  20.     image_padded = np.pad(image, (  
  21.                         (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0)  
  22.                         ), 'constant', constant_values = 0.0) 
  23.  
  24.     for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size): 
  25.  
  26.         for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size): 
  27.             tmp = image_padded.copy() 
  28.  
  29.             tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding,  
  30.                 x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding]  
  31.                 = occlusion 
  32.  
  33.             tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center 
  34.  
  35.             yield x - occlusion_padding, y - occlusion_padding,  
  36.                   tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding] 

上述代码定义的函数iter_occlusion能够生成具有不同遮挡部分的图像。

(编辑:甘孜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读