快速检测深度学习的鲁棒性

  • 深度学习(DNN)危机
  • DNN鲁棒性检测
    • 常见的对抗性攻击方法
    • 用魔法打败魔法
  • 论文代码复现
    • 环境的搭建与基本代码的介绍
  • 本人的工程目录
    • layer.py代码部分
    • train_layer_regress.py
    • layer_regress.py

声明: 参考论文Fast Robustness Prediction for Deep Neural Network.
图片均来自于网络

深度学习(DNN)危机

在最近的几年中,深度学习(DNN)得到了极大的发展,我相信任何人在使用深度学习模型的时候,多多少少都会有一些疑虑,为什么这个东西可以达到这样的效果?其背后的原理是什么?当然,结果也显而易见,由于自身知识的缺乏(当然也是整个行业知识的缺乏),无法做出科学合理的解释,最终还是被模型带来的高性能给折服。总的来说,就是我虽然不知道这玩意为啥这么好用,但是我所接触到的结果告诉我,这东西就是好!

        从效果上来看,即使不知道原因好像影响也不大,我们自己在使用过程当中好像没有遇到过什么问题。但是当这些东西应用到一些比较关键领域的时候,问题就大了。最常见的就是人脸识别(刷脸支付)。如果对于人脸识别,有人能够创造出一种攻击手段,使得识别的人脸不是自己,后果可想而知。当然这只是个例子,显然目前还没有这种攻击手段。但这样真的就意味着DNN是安全的吗?我们来看一个例子:

        图中的红色箭头代表的就是,机器学习根据照片,来进行车辆方向控制。如果用我们人眼来判断的话,显然这两幅图我们应该都要向左拐弯,但我们把图片亮度调暗后,机器给的判断确实向右。这就是最令人头疼的机器学习危机所在。在这里,小编可以对这个结果做一个简单的解释----可能是我们在训练这个控制汽车方向的模型时没有让机器学习一些暗色调的图片,使得机器在某些关键节点把图片的亮度也作为自己进行方向把控的标准,从而做出一些让人难以理解的事情出来。究其原因,终究还是我们对于机器学习(主要指DNN这一类)不理解,无法解释机器学习的工作原理,导致我们不知道我们训练的模型,到底是根据什么来做出判断的,所以经常出现一些让人意想不到的结果。 这也是目前无人驾驶汽车迟迟不能上线的原因。

DNN鲁棒性检测

很多小伙伴可能是第一次接触‘鲁棒性’这个词,其实这是研究领域的专业术语罢了,说白了就是稳定性(健壮,强壮)的意思。
        检验DNN的鲁棒性主要有两种方法。1)传统方法。2)对抗性攻击。
        传统的方法就是,把DNN模型编码到一个模型当中去,使得这个编码后的DNN能够通过计算来进行验证。然后把DNN的鲁棒性定义为和一个逻辑上的观点之间的关系。大致意思就是,经过这样的操作后,我们可以根据DNN的编码来判断,这个DNN是否符合某一个逻辑,然后定义它的鲁棒性。
        我们这片文章主要是讲解对抗性攻击。那么什么是对抗性攻击呢?就比如说,大家经常用DNN进行图片分类操作,对于分类问题,我们给模型输入一个图片,然后这个模型就会输出一个结果,告诉我们这个图片属于哪一类。然后这个对抗性攻击就在于,对这个图片做一些微小的改动(通常是肉眼无法察觉的改动),然后知道改到这个模型输出的结果改变为止。如下图:

        看看左边的这个熊猫图,我们输入到训练好的模型当中,这个模型有57.7%的把握认为,这个图中的物体是熊猫。但是当我们加入一些noise(噪声)后,奇怪的事情发生了。我们的模型有99.3%的把握认为这是个长臂猿!是不是很意外?如果用我们人眼来看的话,这种错误对于刚会说话的孩子来说都不会发生。
        当然,这种情况也不是经常发生,不然为啥会有对抗性攻击这个词呢。之所以叫对抗,就是指我们要和这个模型进行对抗,通过不断的对图片进行细微的修改,来让模型产生错误的结果。

常见的对抗性攻击方法

在这里我就只列出它的名字了:

  • BIM
  • C&W
  • Deepfool

总的来说这三个方法都是通过自己的方式来给图片添加一个微小的扰动,从而来对DNN模型的鲁棒性进行检测。但是这些对抗性攻击都有一个致命的缺点,就是计算开销和计算时间太大,而且对于模型的结构有一些特定的要求,极大的阻碍了他们的可用性。所以,一款高效的检测DNN模型的方法是非常具有现实意义的。

用魔法打败魔法

因为现有的对抗性攻击方法,大都是一个套路,就都是给初始数据加入一个微小扰动。那么这些方法所产生的结果在一定程度上必然是有相应的联系的。那么一个非常有趣的想法就出来了,使用魔法打败魔法。-----用DNN来预测DNN的鲁棒性。
        听上去就感觉听玄学的,用一个不可解释的东西去解释一个不可解释的东西,逻辑上就感觉怪怪的。但是!这就和我们使用DNN进行一些图片分类时的效果一样,虽然我们不知道原因,但是,这方法就是可以使用。而且该论文中也通过大量实验进行了验证。
        魔法的大致思路如下:
        用需要进行鲁棒性评估的DNN的倒数第二层神经元的输出作为魔法DNN的输入,用一些对抗性攻击的算法对DNN进行计算的鲁棒性的值作为输出。这样对于DNN模型鲁棒性检测的任务就转化成了魔法DNN模型的一项回归任务:即输入要检测的DNN模型倒数第二层神经元的输出,然后输出DNN模型的鲁棒性的值。
        一个标准的DNN回归任务就出来了。虽然缺乏解释性,但是论文中的实验结果告诉我们,DNN模型的鲁棒性确实和DNN的倒数第二层的输出有着密切关系。
        我认为该论文最大的亮点就在于提出了使用魔法打败魔法的这种神奇又真有用的思路。

论文代码复现

环境的搭建与基本代码的介绍

# 环境配置
## 安装虚拟环境
pip install virtualenv## 下载python3.6版本
https://www.python.org/getit/## 创建虚拟环境(-p后面接的是对应的python版本 然后跟着的就是名字)
virtualenv -p C:\Users\jielong.kuang\Anaconda3\envs\python2_7\python.exe roubustness## 进入虚拟环境位置
cd roubustness## 进入 Script
cd Scripts## 启动虚拟环境(退出是deactivate)
activate.bat## 安装对应版本的包(使用清华源更加快-i https://pypi.tuna.tsinghua.edu.cn/simple)
pip install Keras==2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple      //亲测支持python3.6,3.7(推荐使用3.6)
如果没有GPU用下面这个tensorflow
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy==1.19.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scikit-learn==0.20.3 -i https://pypi.tuna.tsinghua.edu.cn/simple## 安装后的版本
Python 3.6.13 :: Anaconda, Inc.
Package                 Version
----------------------- ---------
absl-py                 0.15.0
astunparse              1.6.3
cached-property         1.5.2
cachetools              4.2.4
certifi                 2020.6.20
charset-normalizer      2.0.9
clang                   5.0
dataclasses             0.8
defusedxml              0.6.0
flatbuffers             1.12
gast                    0.4.0
google-auth             1.35.0
google-auth-oauthlib    0.4.6
google-pasta            0.2.0
grpcio                  1.43.0
h5py                    3.1.0
idna                    3.3
importlib-metadata      4.8.3
keras                   2.6.0
Keras-Preprocessing     1.1.2
Markdown                3.3.6
nbconvert               5.6.1
numpy                   1.19.5
oauthlib                3.1.1
opt-einsum              3.3.0
pip                     21.2.2
protobuf                3.19.1
pyasn1                  0.4.8
pyasn1-modules          0.2.8
requests                2.26.0
requests-oauthlib       1.3.0
rsa                     4.8
scikit-learn            0.20.3
scipy                   1.5.4
setuptools              58.0.4
six                     1.15.0
tensorboard             2.6.0
tensorboard-data-server 0.6.1
tensorboard-plugin-wit  1.8.0
tensorflow-estimator    2.6.0
tensorflow-gpu          2.6.2
termcolor               1.1.0
typing-extensions       3.7.4.3
urllib3                 1.26.7
Werkzeug                2.0.2
wheel                   0.37.0
wincertstore            0.2
wrapt                   1.12.1
zipp                    3.6.0# 代码模块解释
## layer.py
1、先读取minest数据集(28*28的图片数据)
2、加载lenet1.h5模型
3、将数据划分成训练和测试集(通过自己的下标文件)
4、通过K.function函数获取特定层数的输出
5、将倒数第二程的输出保存到'data/layer_train.csv'文件中## train_layer_regress.py
1、读取之前保存的倒数第二层的输出和该模型对应测试数据的鲁棒性
2、构建回归DNN模型
3、通过数据进行训练
4、通过回调checkpoint保存一个最好的模型## layer_regress.py
1、读取测试数据的鲁棒性数据以及测试数据的待检测的DNN模型的倒数第二层的输出
2、读取之前训练好的模型
3、用模型对featrues进行回归预测(featrues就是DNN模型的倒数第二层输出)
4、通过stats.pearsonr函数计算回归结果和真实的鲁棒性之间的相关性
5、通过mean_absolute_error计算回归结果和鲁棒性之间的差异# 遇到的问题
1、版本无法使用readme中的版本,环境安装如上
2、无法通过layer.py获取训练数据,原因可能是没有翻墙,无法下载数据集,然后跳过这一步了,因为项目中自带下载好了的并且转化好了的csv。
3、修改一下源代码中读取csv的文件路径(使用绝对路径)# 需要修改的部分
## layer.py中
from keras.utils import to_categorical
修改为:
from tensorflow.keras.utils import to_categorical
***********************************************************************

本人的工程目录

其中download_data、new_model、配置.txt是我自己创建的(用于区分论文中给的代码的模型)

layer.py代码部分

from keras.datasets import mnist
#from keras.utils import to_categorical
from tensorflow.keras.utils import to_categorical  #新版tensorflow需要修改
import numpy as np
from keras.models import load_model
import keras.backend as K(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)print("加载模型。。。")
model = load_model('model/lenet1.h5')
print("加载模型成功")index = np.load('data/index_lenet1.npy')
test_index = np.load('data/index_lenet1_test.npy')
train = x_train[index]
test = x_test[test_index]input_tensor = model.input
layers = model.layers#获得测试数据(lenet模型倒数第二层的输出)
for layer in layers:if layer.name in ['before_softmax']:output = layer.outputfun = K.function([input_tensor], [output])for i in range(1):temp = fun([ test[ i*1000 : (i+1)*1000 ] ])[0]# temp = temp.Tif i == 0:arr = tempelse:arr = np.append(arr, temp, axis=0)
arr = np.array(arr)
np.savetxt('download_data/layer_test.csv', arr)#获得训练数据(lenet模型倒数第二层的输出)
for layer in layers:if layer.name in ['before_softmax']:output = layer.outputfun = K.function([input_tensor], [output])for i in range(10):temp = fun([ train[ i*1000 : (i+1)*1000 ] ])[0]# temp = temp.Tif i == 0:arr = tempelse:arr = np.append(arr, temp, axis=0)
arr = np.array(arr)
np.savetxt('download_data/layer_train.csv', arr)

train_layer_regress.py

from keras.layers import Dense
from keras.models import Model
import numpy as np
from keras.layers import Input#加载数据集
features_train = np.loadtxt('download_data/layer_train.csv')
features_test = np.loadtxt('download_data/layer_test.csv')robust_train = np.loadtxt('data/robust_lenet1_train.csv')[:10000]
robust_test = np.loadtxt('data/robust_lenet1_test.csv')[:1000]#构建模型
input_shape = (10,)
input_tensor = Input(shape=input_shape)x = Dense(120, activation='relu', name='fc1')(input_tensor)
x = Dense(84, activation='relu', name='fc2')(x)
x = Dense(10, activation='relu')(x)
x = Dense(1)(x)model = Model(input_tensor, x)#定义回调(后面的训练每执行一次就会调用这个函数)
from keras.callbacks import ModelCheckpoint
checkpoint = ModelCheckpoint(filepath='new_model/layer_regress.h5',monitor='val_mae',  #val_mean_absolute_error自带的这个没有换了一个,大致意思应该是选择啥来当评价标准verbose=1,save_best_only='True',mode='auto',period=1)model.compile(loss='mean_squared_error',optimizer='adadelta',metrics=['mae'])
#进行训练
model.fit(features_train, robust_train,validation_data=(features_test, robust_test),batch_size=256,epochs=200,callbacks=[checkpoint])#回调checkpoint

layer_regress.py

import numpy as np
import scipy.stats as stats
from keras.models import load_model
from sklearn.metrics import mean_absolute_errorrobust = np.loadtxt('data/robust_lenet1_test.csv')[:1000]
features = np.loadtxt('download_data/layer_test.csv')model = load_model('new_model/layer_regress.h5')
results = model.predict(features).reshape(1000,)# np.savetxt('features_results.csv', results)corr = stats.pearsonr(results, robust)[0]
print('pcc', corr)
print('mae: ', mean_absolute_error(robust, results))

快速检测深度学习的鲁棒性相关推荐

  1. 快速入门深度学习,其实并不难!

    深度学习的概念源于人工神经网络的研究,而深度学习的过程就是使用多个处理层对数据进行高层抽象,得到多重非线性变换函数的过程. 虽然深度学习的概念看似高大上,让人有种莫名的距离感,实际上它在日常生活中随处 ...

  2. YMIR-人脸检测-深度学习模型一站式开发

    人脸检测-深度学习模型一站式开发 随着社会经济的不断发展,对安全技术的要求也不断提高.生物识别技术是一种前景广阔的识别技术,有着识别准确率高.安全性强.识别速率高等优点一一而其中最受欢迎的技术之一即人 ...

  3. 新手如何快速入门深度学习

    如何快速入门深度学习 本篇学习笔记对应深度学习入门视频课程 博客地址:http://blog.csdn.net/tangyudi 欢迎转载 深度学习入门必备基础 避开常见误区 学习路线图 干货分享 深 ...

  4. 新手如何快速入门 深度学习

    如何快速入门深度学习 深度学习入门必备基础 避开常见误区 学习路线图 干货分享 深度学习必备基础 深度学习发展至今已然有几个年头了,上个世纪九十年代的美国银行率先使用深度学习技术做为手写字体识别,但深 ...

  5. 新手如何快速入门深度学习领域

    如何快速入门深度学习 本篇学习笔记对应深度学习入门视频课程 博客地址:http://blog.csdn.net/tangyudi 欢迎转载 深度学习入门必备基础 避开常见误区 学习路线图 干货分享 深 ...

  6. 百度 AI Studio——《高层API助你快速上手深度学习》课程学习1

    百度 AI Studio--<高层API助你快速上手深度学习>课程学习1 该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! 相关链接: 飞桨:飞桨开源框架(Pad ...

  7. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  8. 如何快速入门深度学习写论文?

    原文作者:月来客栈     https://www.zhihu.com/people/the_lastest 最快的方式: 第一,选择一篇有代码的论文,记住一定要有代码: 第二,大致弄清楚论文里所提出 ...

  9. (快速入门深度学习)证件照生成项目

    前言 通过一个可以运行的项目,快速入门深度学习,该项目通过微信小程序拍摄照片,调用后台程序上传照片,生成证件照,提供完整可运行的前后端源代码. 本项目能学习到: 1.快速了解深度学习框架的应用, 进行 ...

  10. Transfer Learning Toolkit (TLT) + DeepStream (DS)快速部署深度学习模型(以口罩检测为例)

    文章目录 简介 TLT DS 基于TLT进行迁移学习 环境准备 模型训练 基于DS的模型部署 总结 最近在做一个深度学习的横向,被实时性搞的很头疼,遂打算研究研究新的技术路线,做点技术储备.TLT+D ...

最新文章

  1. opencv 行与列
  2. Sql server 2005带来的分页便利
  3. MIT将AI引入中学课堂,除了设计AI系统,还要学生思考背后的伦理
  4. Weblogic基本概念整理
  5. eigrp配置实验_路由器 OSPF 动态路由配置
  6. 让用户来决定Windows任务管理器的CPU占用率
  7. idea代码提示插件_IDEA 插件推荐 —— 让你写出好代码的神器!
  8. zookeeper 常用命令示例
  9. Flink Forward Asia Hackathon 最新参赛指南请查收
  10. 浅入浅出Typescript Decorators
  11. linux修改目录为nobody,nfs只能挂载为nobody的解决方法
  12. eclipse下的jrebel配置
  13. HTML:调用静态页面html 的几种方法
  14. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...
  15. 手机上将png转pdf_如何在Windows 10上将Android智能手机用作网络摄像头
  16. VC2010编译源代码编辑控件scintilla
  17. font标签及其属性
  18. 华尔街见闻:泰格马克引领未来AI《见面》之旅
  19. codeforces1608C. Game Master题解(图论)
  20. 万科副总裁毛大庆在建策沙龙上关于楼市走向的发言

热门文章

  1. 用Python讲述:地理“经纬度”数据的4种转换方法!
  2. Entrez Direct学习笔记
  3. IOS15.4无法运行WebGL2.0问题
  4. 【UnityWebGL】导出WebGL的问题汇总(持续更新)
  5. Atitit 档案学 档案管理 attilax学习总结
  6. 【PR】pr在导入rst字幕文件后,修改的样式无法显示在视频画面中
  7. 各类邮箱谷歌邮箱、Outlook邮箱、雅虎邮箱的购买养号策略
  8. 相关性分析及SPSS软件操作
  9. python 将繁体转换成简体
  10. cdn回源php_简述回源原理和CDN缓存