Cleverhans-产生对抗性攻击错误“ InputLayer类型的对象没有len()”

时间:2020-03-05 19:28:43

标签: tensorflow cleverhans

应用以下代码时遇到错误。目的是使用InceptionV3()深度学习模型的快速梯度符号方法生成对抗图像。我遵循了正式步骤。

  1. 我使用的是 tf.keras.applications.InceptionV3()模型,而不是 keras.models.load_model

  2. 我包装了模型

  3. 带有正确参数的初始化FastGradientMethod

  4. 生成方法由于完成运行会话的代码而出现错误

注意:我正在使用Tensorflow 1.15.2和Cleverhans 3.0.1

import numpy as np
from PIL import Image
import imageio

import tensorflow as tf

from cleverhans.attacks import FastGradientMethod
from cleverhans.utils_keras import KerasModelWrapper

sess = tf.keras.backend.get_session()

model1= tf.keras.applications.InceptionV3()
model_wrap = KerasModelWrapper(model1)

epsilon=[0,0.01,0.015,0.02,0.1]

tf.logging.set_verbosity(tf.logging.INFO)
x = tf.placeholder(tf.float32, shape=(1, 299, 299, 3))
eps=tf.placeholder(tf.float32,shape=())

fgsm = FastGradientMethod(model_wrap, sess=sess)
fgsm_params = {'eps': eps, 'clip_min': -1.0, 'clip_max': 1.0}
x_adv = fgsm.generate(x, **fgsm_params)

运行时,我有以下错误日志。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-957b4da8c65a> in <module>()
     21 fgsm = FastGradientMethod(model_wrap, sess=sess)
     22 fgsm_params = {'eps': eps, 'clip_min': -1.0, 'clip_max': 1.0}
---> 23 x_adv = fgsm.generate(x, **fgsm_params)

/usr/local/lib/python3.6/dist-packages/cleverhans/attacks/__init__.py in generate(self, x, **kwargs)
    340     assert self.parse_params(**kwargs)
    341 
--> 342     labels, _nb_classes = self.get_or_guess_labels(x, kwargs)
    343 
    344     return fgm(

/usr/local/lib/python3.6/dist-packages/cleverhans/attacks/__init__.py in get_or_guess_labels(self, x, kwargs)
    279       labels = kwargs['y_target']
    280     else:
--> 281       preds = self.model.get_probs(x)
    282       preds_max = reduce_max(preds, 1, keepdims=True)
    283       original_predictions = tf.to_float(tf.equal(preds, preds_max))

/usr/local/lib/python3.6/dist-packages/cleverhans/utils_keras.py in get_probs(self, x)
    177     name = self._get_softmax_name()
    178 
--> 179     return self.get_layer(x, name)
    180 
    181   def get_layer_names(self):

/usr/local/lib/python3.6/dist-packages/cleverhans/utils_keras.py in get_layer(self, x, layer)
    225     """
    226     # Return the symbolic representation for this layer.
--> 227     output = self.fprop(x)
    228     try:
    229       requested = output[layer]

/usr/local/lib/python3.6/dist-packages/cleverhans/utils_keras.py in fprop(self, x)
    201       # Make a new model that returns each of the layers as output
    202       out_layers = [x_layer.output for x_layer in self.model.layers]
--> 203       self.keras_model = KerasModel(new_input, out_layers)
    204 
    205     # and get the outputs for that model on the input x

/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

/usr/local/lib/python3.6/dist-packages/keras/engine/network.py in __init__(self, *args, **kwargs)
     92                 'inputs' in kwargs and 'outputs' in kwargs):
     93             # Graph network
---> 94             self._init_graph_network(*args, **kwargs)
     95         else:
     96             # Subclassed network

/usr/local/lib/python3.6/dist-packages/keras/engine/network.py in _init_graph_network(self, inputs, outputs, name, **kwargs)
    235         # Keep track of the network's nodes and layers.
    236         nodes, nodes_by_depth, layers, layers_by_depth = _map_graph_network(
--> 237             self.inputs, self.outputs)
    238         self._network_nodes = nodes
    239         self._nodes_by_depth = nodes_by_depth

/usr/local/lib/python3.6/dist-packages/keras/engine/network.py in _map_graph_network(inputs, outputs)
   1419                   layer=layer,
   1420                   node_index=node_index,
-> 1421                   tensor_index=tensor_index)
   1422 
   1423     for node in reversed(nodes_in_decreasing_depth):

/usr/local/lib/python3.6/dist-packages/keras/engine/network.py in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index)
   1400 
   1401         # Propagate to all previous tensors connected to this node.
-> 1402         for i in range(len(node.inbound_layers)):
   1403             x = node.input_tensors[i]
   1404             layer = node.inbound_layers[i]

TypeError: object of type 'InputLayer' has no len()

0 个答案:

没有答案