03.使用API修改神经网络参数

前面两篇,我们介绍了模型文件相关的一些基础知识,也用可视化工具得到了一些模型的信息并通过工具修改输出层的bias来让模型预测值改变。

问题: 修改bias的操作是否可以在程序中进行呢?这样篡改操作有什么缺点和局限性呢?
在本篇中我们将使用Keras API来修改输出层的bias,达到任何图片都可以绕过验证的目的。
Keras 加载模型并使用其他手写体图片预测:
model = keras.models.load_model('./model.h5')shownDigit = np.argmax(model.predict(processedImage))
if shownDigit == 4:  print("Access Granted")  else:    print("Access Denied")

我们会得到验证失败:

  • Access Denied

Keras提供了直接在修改bias的API,我们来试试:

layer_name = model.layers[-1].namefinal_layer = model.layers[-1]print("Layer name:",layer_name)print("Bias name:", final_layer.bias.name)print("Bias value:",final_layer.bias.numpy())
update_bias = final_layer.bias.numpy()update_bias[4] = 100final_layer.bias.assign(update_bias)print("New Bias value:",final_layer.bias.numpy())

我们把分类为4的bias设置为了100,运行结果:

Access Denied
Layer name: dense_2Bias name: dense_2/bias:0Bias value: [-0.03398215  0.15133834 -0.04235273 -0.03443589 -0.03148068 -0.03133481 -0.14359292 -0.04240401  0.01841561  0.0588899 ]
New Bias value: [-3.3982150e-02  1.5133834e-01 -4.2352729e-02 -3.4435891e-02  1.0000000e+02 -3.1334814e-02 -1.4359292e-01 -4.2404007e-02  1.8415609e-02  5.8889896e-02]
Access Granted
可以看到bias的值已经修改了,而且我们通过了验证。
这种在神经网络最后一层通过篡改单个权重的方法,会对每个预测都产生巨大的影响。这种方法太过强大会导致很容易被发现,而且模型文件的获取也比较艰难,攻击难道较大。
具体代码和模型,在本专栏Github 项目中。
地址: 
https://github.com/AIPwn/HackingNeuralNetworks
下一篇,我们将训练自己的分类模型并通过在图片中做一个标记作为后门,让模型遇到后门就产生我们期望的结果。
往期回顾:
开篇词——你所不知道的神经网络攻防
01.模型到底是什么?
02.攻击模型的输出层

图片

发表评论