ПРИМЕЧАНИЕ. Я уже пробовал решения из разных вопросов 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
? Любой отзыв оценен
С уважением
Я нашел решение,
кажется, что 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]
Я знаю это почти год, но я просто надеюсь, что вы помните ответ на следующий вопрос. Можете ли вы быть более конкретным, как должно быть "х"? Я сталкиваюсь с той же самой ошибкой, что и вы, и не могу найти параметр, который заставил бы код работать, не выдавая те же ошибки, которые вы описали выше.