AI可视化及对抗样本演示
模型结构动画
我们应用开源的神经网络的结构和参数可视化代码,运行python start_tool.py
命令,载入一个处理过的模型(storage/data/default/*.pro.npz),可清晰的看到网络的层次化结构:
如果我们选择generate_network
,
便能得到一个未经训练的原始模型:
可见训练的过程,就是将所有的线设置成合适的值的过程。
训练过程可视化
这里我们借助于stefsietz大佬的Unity3D开源项目,配置好Unity环境后,打开案例里面的场景,便能看到下面这个工作区:
运行Game,载入训练好的转换后的模型文件夹jsons,可以动态的拖拽模型:
CNN原理演示
这里使用佐治亚理工中国博士出品的CNN解释器,动态的感受一下CNN中几个基本组件原理:
- 卷积:自动提取局部特征
- 激活:对特征进行非线性映射
- 池化:特征采样,信息抽象
- 全连接,计算分类概率
对抗样本产生
这里使用一个简单的FGSM方法产生一个对抗样本。
我们首先读取一张小熊猫图片,载入已训练好的tiny_vgg
模型,得到梯度后,使用梯度符号*扰动,叠加到原始图像上,便得到对对抗样本。
loss_object = tf.keras.losses.CategoricalCrossentropy()
with tf.GradientTape(persistent=True) as tape:
tape.watch(image_batch)
predictions = tiny_vgg(image_batch)
loss = loss_object(label_batch, predictions)
gradients = tape.gradient(loss, image_batch)
signed_grad = tf.sign(gradients)
epsilon, prediction = 0.01, True
label_true = predictions[0].numpy().argmax()
while prediction:
adv_img = tf.add(image_batch, epsilon * signed_grad)
adv_img = tf.clip_by_value(adv_img, 0, 1)
label_pred = tiny_vgg(adv_img)[0].numpy().argmax()
if label_pred == label_true:
epsilon += 0.0007
对抗样本可视化
首先看看原始的小熊猫图片在神经网络中的一个特征分布情况:
再看看小熊猫图片被加入对抗样本后的特征分布情况:
可以清楚看到,两者的预测结果截然不同,我们仔细放大下最后一个max_pooling层第三个filter提取的特征差异(颜色深浅):
参考资料
神经网络的结构和参数可视化
- 仓库地址: https://github.com/julrog/nn_vis
- 运行环境:Python、Tensorflow2
- 使用效果:可视化展示网络结构
基于Unity的神经网络训练过程可视化
- 仓库地址: https://github.com/stefsietz/nn-visualizer
- 运行环境:Python、Tensorflow1、Unity、C#
- 使用效果:构建3D版神经网络,使用鼠标和神经网络动态交互,动态查看训练过程
CNN原理可视化
- 仓库地址: https://github.com/poloclub/cnn-explainer
- 运行环境:Python、Tensorflow2、TensorflowJS、NodeJS
- 使用效果:演示神经网络的原理,查看每一层、每个神经元的特征数值
MNIST数据集分类模型可视化交互
- 仓库地址: https://github.com/aharley/nn_vis
- 运行环境:JavaScript
- 使用效果:输入手写字符,可交互体验每一层特征概况
工具
- Unity3D: Unity3D工具
- Kap: Mac下Gif动图录频工具
- ScreenToGif: Windows下Gif动图录频工具