AI 安全之对抗样本入门 (13):深度学习基础知识 1.3.9

阅读数:8 2019 年 11 月 30 日 15:00

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

(可视化 CNN)

内容简介
第 1 章介绍了深度学习的基础知识,重点介绍了与对抗样本相关的梯度、优化器、反向传递等知识点。
第 2 章介绍了如何搭建学习对抗样本的软硬件环境,虽然 GPU 不是必需的,但是使用 GPU 可以更加快速地验证你的想法。
第 3 章概括介绍了常见的深度学习框架,从 TensorFlow、Keras、PyTorch 到 MXNet。
第 4 章介绍了图像处理领域的基础知识,这部分知识对于理解对抗样本领域的一些常见图像处理技巧非常有帮助。
第 5 章介绍了常见的白盒攻击算法,从基础的 FGSM、DeepFool 到经典的 JSMA 和 CW。
第 6 章介绍了常见的黑盒攻击算法。
第 7 章介绍了对抗样本在目标识别领域的应用。
第 8 章介绍了对抗样本的常见抵御算法,与对抗样本一样,抵御对抗样本的技术也非常有趣。
第 9 章介绍了常见的对抗样本工具以及如何搭建 NIPS 2017 对抗防御环境和轻量级攻防对抗环境 robust-ml,通过这章读者可以了解如何站在巨人的肩膀上,快速生成自己的对抗样本,进行攻防对抗。

CNN 虽然接近人类识别物体的过程,但是理解 CNN 的原理却是非常艰难的过程。人们试图用可视化的方式来理解 CNN 各层对图像特征提取的方法。Keras 之父、谷歌大脑人工智能和深度学习研究员 Francois Chollet 在他的《Python 深度学习》1中给出一种可视化卷积的方法。卷积层通常由多个卷积核组成,每个卷积核都可以被视为一种特征提取方式。当使用一个卷积核处理图像数据后,卷积核会提取它关注的特征并形成新的图像,该图像也被称为特征图。输入的图像包含的特征与卷积核越接近,其特征图的值也越大。因此完全可以基于梯度,迭代调整输入图像的值,让特征图的值最大化。当特征图的值达到最大或者迭代求解趋于稳定时,可以认为这时的输入图像就是该卷积核的可视化图像。下面以 Keras 为例介绍核心代码实现。

1 图片源于 http://blog.csdn.net/numeria/article/details/73611456

复制代码
#获取输出层的 tensor
layer_output = model.get_layer(layer_name).output
#获取指定卷积核 filter_index 的输出,并作为损失函数
loss = K.mean(layer_output[:, :, :, filter_index])
#根据损失函数和输入层定义梯度
grads = K.gradients(loss, model.input)[0]
grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5)
#实例化计算梯度的函数
iterate = K.function([model.input], [loss, grads])
#定义一个随机图像,图像底色为灰色,并叠加均值为 0 标准差为 20 的高斯噪声
input_img_data = np.random.random((1, size, size, 3)) * 20 + 128.
#迭代 40 轮,使用梯度上升算法求解,学习速率(步长)为 step
step = 1.
for i in range(40):
loss_value, grads_value = iterate([input_img_data])
input_img_data += grads_value * step
img = input_img_data[0]

以 VGG16 为例,如图 1-24 所示,在 VGG16 中具有多个卷积层,其中最典型的 5 个分别为 block1_conv1、block2_conv1、block3_conv1、block4_conv1 和 block5_conv1。

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-24 Keras 下的 VGG16 结构图

Francois Chollet 使用上述方法可视化了这 5 个卷积层,block1_conv1 的可视化结果如图 1-25 所示,block3_conv1 的可视化结果如图 1-26 所示,block5_conv1 的可视化结果如图 1-27 所示,可见第 1 层卷积提取的主要是边缘和纹路特征,越往后的卷积提取的特征越高级,到了第 5 层卷积已经提取很抽象的高级特征了。

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-25 block1_conv1 可视化结果

下面我们以经典的小猪图像为例,展现在 VGG16 下各个卷积层处理的情况,相应的代码路径为:

复制代码
https://github.com/duoergun0729/adversarial_examples/code/1-case2-keras.ipynb

首先实例化 Keras 下的 VGG16 模型,加载基于 ImageNet 2012 数据集预训练的参数。

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-26 block3_conv1 可视化结果
复制代码
#使用 VGG16
from keras.applications.vgg16 import VGG16
import matplotlib.pyplot as plt
%matplotlib inline
model = VGG16(weights='imagenet')

之后加载经典的小猪图片(见图 1-28),并进行预处理。

复制代码
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np
#小猪的路径
img_path = "../picture/pig.jpg"
#缩放到指定大小 224×224
img = image.load_img(img_path, target_size=(224, 224))
#展示图片
plt.imshow(img)
plt.show()
x = image.img_to_array(img)
# 扩展维度,适配模型输入大小 (1, 224, 224, 3)
x = np.expand_dims(x, axis=0)
# 图像预处理
x = preprocess_input(x)

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-27 block5_conv1 可视化结果**1**

1 图 1-25 至图 1-27 源于 https://github.com/fchollet/deep-learning-with-python-noteboos/blob/master/5.4-visualizing-what-convnets-learn.ipynb

对该图片进行预测,预测结果为小猪,满足预期。

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-28 经典的小猪图片
复制代码
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
Predicted: [('n03935335', 'piggy_bank', 0.6222573), ('n02395406', 'hog',
0.3228228), ('n02108915', 'French_bulldog', 0.013370045)]

获取 block1_conv1、block3_conv1 和 block5_conv1 对应的输出 tensor,并基于 VGG16 定义新的模型,该模型的输入为图像,输出为以上三层的输出 tensor。

复制代码
from keras import models
layer_names=['block1_conv1', 'block3_conv1','block5_conv1']
# 获取指定层的输出:
layer_outputs = [model.get_layer(layer_name).output for layer_name in
layer_names]
# 创建新的模型,该模型的输出为指定的层的输出
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)

针对小猪图像进行预测,获得指定层的输出结果。

复制代码
#获得小猪的输出
activations = activation_model.predict(x)

遍历 block1_conv1、block3_conv1 和 block5_conv1 的各个卷积核的输出并可视化。这里需要指出的是,卷积核的输出结果的范围并不是固定的,为了可以展示成图片,需要根据对应的均值 channel_image.mean() 和标准差 channel_image.std() 进行归一化,然后再转换到图片对应的像素范围 [0, 255]。为了便于显示,每层以 8×8 的格式展示前 64 个卷积核对应的图像。block1_conv1 层可视化的结果如图 1-29 所示,block3_conv1 层可视化的结果如图 1-30 所示,block5_conv1 层可视化的结果如图 1-31 所示。可见第 1 层卷积层提取特征时尽可能保留了原图的细节,越往后的卷积层提取的特征越高级,保留原始图片的细节越来越少。到了最后几层,出现的空白越来越多,这意味着部分卷积核无法在图像中匹配特定的特征了,这也意味着越高级别的特征对应的矩阵越稀疏。

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-29 小猪图片在 block1_conv1 层的可视化结果

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-30 小猪图片在 block3_conv1 层的可视化结果
复制代码
images_per_row = 8
for layer_name, layer_activation in zip(layer_names, activations):
# 获取卷积核的个数
n_features = layer_activation.shape[-1]
# 特征图的形状 (1, size, size, n_features)
size = layer_activation.shape[1]
#最多展现 8 行
n_cols=8
display_grid = np.zeros((size * n_cols, images_per_row * size))
for col in range(n_cols):
for row in range(images_per_row):
channel_image = layer_activation[0,:, :,
col * images_per_row + row]
# 归一化处理
channel_image -= channel_image.mean()
channel_image /= channel_image.std()
# 数据扩展到 [0,255] 范围
channel_image *= 128
channel_image += 128
channel_image = np.clip(channel_image, 0, 255).astype('uint8')
display_grid[col * size : (col + 1) * size,
row * size : (row + 1) * size] = channel_image
# 展示图片
scale = 1. / size
plt.figure(figsize=(scale * display_grid.shape[1],
scale * display_grid.shape[0]))
plt.title(layer_name)
plt.grid(False)
plt.imshow(display_grid, aspect='auto', cmap='viridis')
plt.show()

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

图 1-31 小猪图片在 block5_conv1 层的可视化结果

AI安全之对抗样本入门(13):深度学习基础知识 1.3.9

购书地址 https://item.jd.com/12532163.html?dist=jd

评论

发布