Cómo convertir Tensor a ndarray (tensor con imágenes adversas dentro)

NOTA: Ya he probado soluciones de diferentes preguntas de SO sin éxito, a continuación se detallan los detalles.

Estoy estudiando los tutoriales de Cleverhans Pyhton, centrándome en este código (keras model case). Tengo un conocimiento básico de keras, pero acabo de comenzar con Tensorflow (novato total).

Estoy intentando visualizar las imágenes adversas generadas en este fragmento de código (cita de las fonts de Cleverhans vinculadas):

# Initialize the Fast Gradient Sign Method (FGSM) attack object and graph fgsm = FastGradientMethod(wrap, sess=sess) fgsm_params = {'eps': 0.3, 'clip_min': 0., 'clip_max': 1.} adv_x = fgsm.generate(x, **fgsm_params) # Consider the attack to be constant adv_x = tf.stop_gradient(adv_x) preds_adv = model(adv_x) 

Por lo que entiendo, adv_x debe contener las imágenes adv_x generadas y he intentado convertir el tensor a ndarray para visualizarlo a través de matplot . He intentado lo siguiente tanto antes como después del model(adv_x) :

 1) adv_x.eval() 2) adv_x.eval(sess) 3) sess.run(adv_x) 4) ..and minor changes 

Nada está funcionando como se esperaba, recibo varios errores:

     ValueError: Cannot evaluate tensor using `eval()`: No default session is registered. Use `with sess.as_default()` or pass an explicit session to `eval(session=sess)` 

    y

     InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [?,28,28,1] [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[?,28,28,1], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]] 

    y

     InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [?,28,28,1] [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[?,28,28,1], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]] [[Node: strided_slice/_115 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_152_strided_slice", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]] 

    También probé with sess.as_default(): sin éxito.

    El tipo de adv_x es , su forma es TensorShape([Dimension(None), Dimension(28), Dimension(28), Dimension(1)]) . Escribiendo adv_x en la consola de depuración, :

    También intenté trabajar en una porción del Tensor adv_x[0] , sin éxito.

    Estoy un poco perdido y creo que echo de menos algo de los conceptos básicos de TensorFlow, o entendí mal el tutorial (¿se ha completado el adv_x con datos?).

    ¿Cómo convierto adv_x al tipo ndarray ? Cualquier consejo es apreciado

    Saludos

    He encontrado la solución,

    Parece que Tensor adv_x es más una función que un valor, y necesita una entrada (actualmente no entiendo el tensorflow del razonamiento complejo), por lo que debe llamar a eval() proporcionando la sesión y un diccionario. El diccionario contiene una entrada que es el nombre del marcador de posición de entrada adv_x y su valor. En mi caso, proporciono la lista de 60000 ejemplos de entrada (imágenes) x_train .

    Tenga en cuenta que el nombre del marcador de posición es x en mi caso, pero supongo que debería usar el nombre variable del marcador de posición que introdujo en el constructor de objetos FastGradientMethod .

     adv_images = adv_x.eval(session=sess, feed_dict={x: x_train}) 

    adv_images es una matriz de tamaño (60000,28,28,1), ad1 = adv_images[1] es una imagen en escala de grises (28,28,1).

    Puedes usar matplot pero necesitas cambiar un poco la forma de la matriz. Las imágenes en escala de grises de Matplot deben ser matrices 2D:

     matplotlib.pyplot.imshow(ad1[:,:,0]) 

    Esta es mi solución, tal vez no todos los pasos sean obligatorios pero, ya sabes, debes tener cuidado con la magia negra 🙂

    Ps: para evitar errores de memoria insuficiente , puede truncar x_train , por ejemplo, x_train2 = xtrain[0:100]