使用mxnet框架进行人脸识别对抗攻击的问题(对抗样本)

我目前拥有一个已经训练好的人脸识别模型: LResNet100E-IR,ArcFace@ms1m-refine-v2。
首先我需要加载模型以及预训练的参数,然后我需要取模型中的某一层作为输出层(即人脸的embedding)。计算我的人脸和另一个人脸的embedding,并把余弦相似度的负值作为损失函数,然后利用梯度下降去更新我的人脸的像素值,以达到攻击人脸模型的目的。

但是现在我通过SymbolBlock加载模型后,使用autograd求出的关于输入的梯度是0.

sym, arg_params, aux_params = mx.model.load_checkpoint('../models/model-r100-ii/model', 0)
layers = sym.get_internals()
outputs = layers['fc1_output']
inputs = layers['data']
net = gluon.SymbolBlock(outputs, inputs)
net.load_parameters("../models/model-r100-ii/model-0000.params", ctx = ctx, ignore_extra = True, allow_missing = True)

然后想要求损失函数关于输入的梯度,发现是0

def loss_function(attaker_feature, target_features):
    sims = nd.dot(attaker_feature, target_features.T)
    loss = - sims.mean()
    return loss

data = np.expand_dims(img, axis=0) #人脸 (1,3,112,112)
data = nd.array(data)
data = data.copyto(facemodel.ctx)
data.attach_grad()
num_iter = 1
for index in range(num_iter):
    with autograd.record():
        embedding = net(data)
        embedding = embedding / nd.norm(embedding)
        loss = loss_function(embedding, features)
    loss.backward()
    print(data.grad)