前面两篇,我们介绍了模型文件相关的一些基础知识,也用可视化工具得到了一些模型的信息并通过工具修改输出层的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].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] = 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
下一篇,我们将训练自己的分类模型并通过在图片中做一个标记作为后门,让模型遇到后门就产生我们期望的结果。