我正在使用自定义损失函数,以Explaining and Harnessing Adversarial Examples中的FGSM方法实施对抗训练:
使用自定义损失函数在tf.keras
中实现,它在概念上看起来像这样:
model = Sequential([
...
])
def loss(labels, logits):
# Compute the cross-entropy on the legitimate examples
cross_ent = tf.losses.softmax_cross_entropy(labels, logits)
# Compute the adversarial examples
gradients, = tf.gradients(cross_ent, model.input)
inputs_adv = tf.stop_gradient(model.input + 0.3 * tf.sign(gradients))
# Compute the cross-entropy on the adversarial examples
logits_adv = model(inputs_adv)
cross_ent_adv = tf.losses.softmax_cross_entropy(labels, logits_adv)
return 0.5 * cross_ent + 0.5 * cross_ent_adv
model.compile(optimizer='adam', loss=loss)
model.fit(x_train, y_train, ...)
这对于简单的卷积神经网络非常有效。但是,我不确定批次规范化层在一批对抗性示例中的行为,即在logits_adv = model(inputs_adv)
调用期间的行为。这涉及两个子问题:
在这里,我看到三个选项:
两个选项,我认为都可以证明其合理性: