Я пытаюсь использовать алгоритм Elastic-Net, реализованный в Cleverhans, для создания состязательных образцов в задаче классификации. Основная проблема заключается в том, что я пытаюсь использовать его таким образом, чтобы получить более высокую уверенность во время классификации по целевому классу (отличному от исходного), но я не могу достичь хороших результатов. Система, которую я пытаюсь обмануть, - это DNN с выходом softmax для 10 классов.
Например:
- Учитывая образец класса 3, я хочу сгенерировать состязательную выборку класса 0.
- Используя гиперпараметры по умолчанию, реализованные в ElasticNetMethod cleverhans, я могу получить успешную атаку, поэтому класс, назначенный для состязательной выборки, стал классом 0, но достоверность довольно низкая (около 30%). Это также происходит при использовании разных значений гиперпараметров.
- Моя цель - получить более высокую уверенность (не менее 90%).
- Для другого алгоритма, такого как FGSM или MadryEtAl, я могу достичь этой цели, создав цикл, в котором алгоритм применяется до тех пор, пока образец не будет классифицирован как целевой класс с достоверностью более 90%, но я не могу применить эту итерацию на алгоритме EAD, потому что на каждом шаге итерации он дает состязательную выборку, сгенерированную на первом шаге, а в следующих итерациях она остается неизменной. (Я знаю, что это может произойти, потому что алгоритм отличается от двух других упомянутых, но я пытаюсь найти решение для достижения своей цели).
Это код, который я на самом деле использую для создания образцов противоборства.
ead_params = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001, 'clip_min':0,'clip_max':1,'y_target':target}
adv_x = image
founded_adv = False
threshold = 0.9
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)
while (not founded_adv):
adv_x = ead.generate_np(adv_x, **ead_params)
prediction = model.predict(adv_x).tolist()
pred_class = np.argmax(prediction[0])
confidence = prediction[0][pred_class]
if (pred_class == 0 and confidence >= threshold):
founded_adv = True
Цикл while может генерировать образец до тех пор, пока целевой класс не будет достигнут с достоверностью более 90%. Этот код действительно работает с FGSM и Madry, но бесконечно работает с EAD.
Версия библиотеки:
Tensorflow: 2.2.0 Keras: 2.4.3 Cleverhans: 2.0.0-451ccecad450067f99c333fc53592201
Кто-нибудь может мне помочь?
Большое спасибо.