Как конвертировать Tensor в ndarray (тензор с изображениями соперников внутри) - PullRequest
0 голосов
/ 21 сентября 2018

ПРИМЕЧАНИЕ: я уже пробовал решения по различным вопросам SO, но безуспешно, подробности следуют.

Я изучаю cleverhans Pyhton, ориентируясь на this код (случай модели keras).У меня есть базовые знания keras, но я только начал с Tensorflow (всего новичка).

Я пытаюсь визуализировать изображения, созданные в этом фрагменте кода (цитата из связанного cleverhans *)1010 * источников):

# 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)

Из того, что я понимаю, adv_x должен содержать сгенерированные состязательные изображения, и я попытался преобразовать тензор в ndarray, чтобы визуализировать его через matplot.Я пробовал следующее до и после model(adv_x):

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

Ничего не работает, как ожидалось, я получаю различные ошибки:

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)`

и

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"]()]]

и

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"]()]]

также попытались with sess.as_default(): безуспешно.

Тип adv_x равен <class 'tensorflow.python.framework.ops.Tensor'>, его форма TensorShape([Dimension(None), Dimension(28), Dimension(28), Dimension(1)]).Записывая в консоль отладки adv_x, я получаю: <tf.Tensor 'StopGradient_4:0' shape=(?, 28, 28, 1) dtype=float32>

Я также пытался работать над фрагментом Tensor adv_x[0], но безуспешно.

Я немного растерялся, и ямне кажется, я что-то упускаю из основ TensorFlow или неправильно понял учебник (эффективно ли заполняются данные в adv_x?).

Как преобразовать тип adv_x в ndarray?Любой отзыв ценится

С уважением

1 Ответ

0 голосов
/ 21 сентября 2018

Я нашел решение,

кажется, что Tensor adv_x больше похож на функцию , чем на значение, и требует ввода (в настоящее время я не понимаю тензорный потокзамысловатые рассуждения), поэтому вам нужно вызвать eval(), указав и сессию, и словарь.Словарь содержит одну запись, которая является именем входного заполнителя adv_x и значением для него.В моем случае я приведу список 60000 примеров ввода (изображения) x_train.

Обратите внимание, что имя заполнителя в моем случае x , но я полагаю, вам следует использовать имя переменной заполнителя, которое вы указали в конструкторе объекта FastGradientMethod.

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

adv_images - это массив размера (60000,28,28,1), ad1 = adv_images[1] - это изображение в оттенках серого (28,28,1).

Вы можете использовать matplot, но вынужно немного изменить форму массива.Изображения в оттенках серого Matplot должны быть двухмерными массивами:

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

Это мое решение, возможно, не все шаги являются обязательными, но, вы знаете, вы должны быть осторожны с черной магией: -)

PS: во избежание ошибок Out of Memory вы можете обрезать x_train , например, x_train2 = xtrain[0:100]

...