示例模型使用对应于印度大象类别的随机输入,输出了以下内容:
从图像中可以看到,模型期望的结构为象牙、大眼睛和象鼻。这些信息可以有效帮助检查数据集的完整性。例如,假设该模型将关注的特征理解为背景中的树木或草丛等其它物体,由于印度象的栖息地中往往含有大量的树木或草丛,模型就可能产生错误。然后,通过最大激活,就会发现已有的数据集可能不足以完成任务,因此需要将生活在不同栖息地的大象图像添加到训练集中,实现大象特征的准确辨别。
遮挡图——将输入过程的重要部分可视化
激活最大化主要用于将图像中模型的期待可视化。而图像遮挡可以找出图像中对模型来说至关重要的部分。
现在,为了理解图像遮挡的工作原理,我们设立了一个模型,它能够根据丰田、奥迪等制造商对汽车进行分类。
能够判断图中汽车属于哪家公司吗?一定很难吧。因为公司标识所在的部分被遮挡了。显然,图像中被遮挡部分是辨别汽车所属厂商时非常重要的线索。
同样地,为了生成遮挡图,我们遮挡了图像中的某些部分,然后计算它属于某一类的概率。如果概率降低,就意味着遮挡部分对于完成分类非常重要。否则,该部分就无足轻重了。
示例程序将概率同图像每个部分的像素值联系起来,对其进行标准化后生成热图:
- import numpy as np
-
- from keras.utils import np_utils
- from keras.models import Sequential
- from keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, MaxPooling2D
- from keras.optimizers import Adam
- from keras.callbacks import EarlyStopping, ModelCheckpoint
- from keras.preprocessing.image import ImageDataGenerator
- from keras.activations import relu
-
- %matplotlib inline
- import matplotlib.pyplot as plt
- def iter_occlusion(image, size=8):
-
- occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32)
- occlusion_center = np.full((size, size, 1), [0.5], np.float32)
- occlusion_padding = size * 2
-
- # print('padding…')
- image_padded = np.pad(image, ( \
- (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0) \
- ), 'constant', constant_values = 0.0)
-
- for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size):
-
- for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size):
- tmp = image_padded.copy()
-
- tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding, \
- x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding] \
- = occlusion
-
- tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center
-
- yield x - occlusion_padding, y - occlusion_padding, \
- tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding]
上述代码定义的函数iter_occlusion能够生成具有不同遮挡部分的图像。
(编辑:ASP站长网)
|