Как конвертировать Tensor в ndarray (тензор с изображениями соперников внутри)

1

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

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

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

# 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 в консоли Debug, я получаю: <tf.Tensor 'StopGradient_4:0' shape=(?, 28, 28, 1) dtype=float32>

Я также пробовал работать на adv_x[0] тензора adv_x[0], без успеха.

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

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

С уважением

Теги:
tensorflow
type-conversion
tensor

2 ответа

0
Лучший ответ

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

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

Обратите внимание, что имя-заполнитель x в моем случае, но я полагаю, вы должны использовать имя переменной заполнителя, которое вы загружали в FastGradientMethod объекта 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: чтобы избежать ошибок в памяти, вы можете обрезать x_train, например x_train2 = xtrain[0:100]

0

Я знаю это почти год, но я просто надеюсь, что вы помните ответ на следующий вопрос. Можете ли вы быть более конкретным, как должно быть "х"? Я сталкиваюсь с той же самой ошибкой, что и вы, и не могу найти параметр, который заставил бы код работать, не выдавая те же ошибки, которые вы описали выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню