首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当最后一层不是“`softmax`”(例如集成模型)时,如何应用Cleverhans攻击?

当最后一层不是“`softmax`”(例如集成模型)时,如何应用Cleverhans攻击?
EN

Stack Overflow用户
提问于 2019-08-07 15:18:52
回答 1查看 441关注 0票数 2

我试图按照本论文中提出的方法攻击一系列Keras模型。在第5节中,他们指出,攻击的形式如下:

因此,我继续创建了一个预先培训过的Keras模型的集合,如下所示:

代码语言:javascript
复制
def ensemble(models, model_input):

    outputs = [model(model_input) for model in models]
    y = Average()(outputs)

    model = Model(model_input, y, name='ensemble')

    return model

models = [...] # list of pretrained Keras MNIST models

model = ensemble(models, model_input)
model_wrapper = KerasModelWrapper(model)
attack_par = {'eps': 0.3, 'clip_min': 0., 'clip_max': 1.}
attack = FastGradientMethod(model_wrapper, sess=sess)

x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols,
                                      nchannels))
attack.generate(x, **attack_par) # ERROR!

在最后一行,我得到以下错误:

代码语言:javascript
复制
----------------------------------------------------------
Exception                Traceback (most recent call last)
<ipython-input-23-1d2e22ceb2ed> in <module>
----> 1 attack.generate(x, **attack_par)

~/ri/safechecks/venv/lib/python3.6/site-packages/cleverhans/attacks/fast_gradient_method.py in generate(self, x, **kwargs)
     48     assert self.parse_params(**kwargs)
     49 
---> 50     labels, _nb_classes = self.get_or_guess_labels(x, kwargs)
     51 
     52     return fgm(

~/ri/safechecks/venv/lib/python3.6/site-packages/cleverhans/attacks/attack.py in get_or_guess_labels(self, x, kwargs)
    276       labels = kwargs['y_target']
    277     else:
--> 278       preds = self.model.get_probs(x)
    279       preds_max = reduce_max(preds, 1, keepdims=True)
    280       original_predictions = tf.to_float(tf.equal(preds, preds_max))

~/ri/safechecks/venv/lib/python3.6/site-packages/cleverhans/utils_keras.py in get_probs(self, x)
    188     :return: A symbolic representation of the probs
    189     """
--> 190     name = self._get_softmax_name()
    191 
    192     return self.get_layer(x, name)

~/ri/safechecks/venv/lib/python3.6/site-packages/cleverhans/utils_keras.py in _get_softmax_name(self)
    126         return layer.name
    127 
--> 128     raise Exception("No softmax layers found")
    129 
    130   def _get_abstract_layer_name(self):

Exception: No softmax layers found

看起来,目标模型的最后一层是一个softmax层,这似乎是一个要求。然而,快速梯度法在技术上并不需要这样做。这是Cleverhans为便于库实现而强制执行的东西吗?有没有办法解决这个问题,并使用克里夫汉攻击模型,而没有最终的softmax层?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-08 17:11:52

CleverHans要求将日志传递给攻击的原因是为了数值稳定性(例如,我们不使用指数日志)。

也就是说,攻击一个团队是一个合法的用例。我可以想到两种选择:

  • 如果您的所有模型都有类似的logit发行版,则可以对日志进行平均值,并将这些日志提供给攻击对象。
  • 你可以在集合内的每个N模型上计算对手的损失,平均所有的N对抗损失,然后攻击会优化这个平均损失。

第二个选项将需要修改现有的CleverHans API,但是如果您想要对GitHub回购进行公关,我很乐意帮助检查它。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57397628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档