神经网络攻防:01. 模型到底是什么?
常听做算法的同学说算法模型,那模型到底是什么呢?
具体来讲,狭义的机器学习模型或者深度学习模型是一个文件,它在经过训练后可以识别特定类型的模式。对模型进行训练后,可以使用它根据之前未见过的数据进行推理,并对这些数据进行预测。
假设你要构建一个应用程序,该应用程序可以根据用户的面部表情识别用户的情感。可以为模型提供具有特定情感标记的面部图像,对模型进行训练,然后即可在能够识别任何用户情感的应用程序中使用该模型。
问题:既然模型是一个文件,如果我拿到了一个模型文件,可以得到哪里信息?
我们以一个例子开始,在专栏的 Github 项目中我提供了三个 model 文件,分别为:
model.h5 keras 保存的模型
model.pt Pytorch 保存的模型
model.pt Pytorch 保存的模型
大家可以去 Github 下载这三个文件,以供后面的练习。
首先,模型文件的泄露其实相当于有一部分的源代码泄露了。我们可以从模型文件中得到很多信息。
以 model.h5 为例,h5 是 keras 支持的模型文件格式之一,它将网络结构和权重,模型训练的配置,优化器等信息都保存了下来,优点就是操作方便,缺点就是模型文件很大。keras 也可以只保存权重,不保存网络结构,大家可以去了解一下。
H5 文件是层次数据格式第 5 代的版本(Hierarchical Data Format,HDF5),它是用于存储科学数据的一种文件格式和库文件。我们可以使用工具来打开 H5 格式的文件,这里推荐一下 HDFView。
单独看 model_weights,H5 格式是组织得非常好的一种层次结构
点击 layer_names 可以看到模型的层
单击查看第一层 conv2d_1 中的 bias:0 的权重
点击 optimizer_weights 查看训练的信息
网络结构:Conv -- Conv -- MaxPool -- Dense -- Dense
优化器: Adadelta
任务: 猜测图像分类
还有更多的信息等着你自己去探索吧。总之拿到这些信息之后,想要复现这个模型是非常容易的。
那如果不是 H5 模型文件怎么办?那就需要手动使用框架加载并打印或者导出权重等信息。不过有个开源工具帮你解决了这个问题,并可视化出来,它就是 netron。下图是它的界面:
netron 现在支持很多框架保存下来的模型文件格式,通用性已经算比较好。
netron 项目 Github 地址:
https://github.com/lutzroeder/netron
这次的练习就是用 netron 打开剩下的两个模型,看看能从文件中得到什么信息。
本专栏 Github 地址:
https://github.com/AIPwn/HackingNeuralNetworks
这是《神经网络攻防》专栏的第一篇,下一篇,我们将谈论一下怎么攻击模型的输出层,欢迎关注。
版权声明: 本文为 InfoQ 作者【P小二】的原创文章。
原文链接:【http://xie.infoq.cn/article/bee22d9fe9374bde47caf5750】。文章转载请联系作者。
评论