前面两篇,我们介绍了模型文件相关的一些基础知识,也用可视化工具得到了一些模型的信息并通过工具修改输出层的 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")
复制代码
我们会得到验证失败:
Keras 提供了直接在修改 bias 的 API,我们来试试:
layer_name = model.layers[-1].name
final_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] = 100
final_layer.bias.assign(update_bias)
print("New Bias value:",final_layer.bias.numpy())
复制代码
我们把分类为 4 的 bias 设置为了 100,运行结果:
Access Denied
Layer name: dense_2
Bias name: dense_2/bias:0
Bias 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.攻击模型的输出层
评论