Keras 写我自己的FGSM对抗性攻击总是给零干扰

Keras 写我自己的FGSM对抗性攻击总是给零干扰,keras,generative-adversarial-network,Keras,Generative Adversarial Network,我想写一个简单的针对MNIST的FGSM攻击。我尝试了傻瓜库,它似乎可以工作,但FGSM非常慢(可能是因为它搜索的是最小eps/扰动,这会给出不同的目标标签)。我开始写我自己的,我的代码总是给我零干扰。也就是说,如果我绘制x_对抗图,它与x_输入相同。我检查了梯度计算是否导致所有零矩阵。计算出的损失函数很小,但我认为这个损失函数有一些梯度。谁能帮帮我吗?我绞尽脑汁已经一个星期了,没有任何进展。再次感谢 导入tensorflow作为tf 将numpy作为np导入 进口傻瓜箱 将tensorflo

我想写一个简单的针对MNIST的FGSM攻击。我尝试了傻瓜库,它似乎可以工作,但FGSM非常慢(可能是因为它搜索的是最小eps/扰动,这会给出不同的目标标签)。我开始写我自己的,我的代码总是给我零干扰。也就是说,如果我绘制x_对抗图,它与x_输入相同。我检查了梯度计算是否导致所有零矩阵。计算出的损失函数很小,但我认为这个损失函数有一些梯度。谁能帮帮我吗?我绞尽脑汁已经一个星期了,没有任何进展。再次感谢


导入tensorflow作为tf
将numpy作为np导入
进口傻瓜箱
将tensorflow.keras.backend作为K导入
将matplotlib.pyplot作为plt导入
#导入包含模型和图层的所需Keras模块
从tensorflow.keras.models导入顺序
从tensorflow.keras.layers导入稠密、Conv2D、脱落、展平、MaxPoolig2D
(x_列,y_列),(x_测试,y_测试)=tf.keras.datasets.mnist.load_data()
数字到分类=10
x_-train=x_-train.重塑(x_-train.形状[0],28,28,1)
x_测试=x_测试。重塑(x_测试。形状[0],28,28,1)
输入_形状=(28,28,1)
#确保这些值是浮动的,这样我们可以在除法后得到小数点
x_-train=x_-train.astype('float32')
x_test=x_test.astype('float32')
#通过将RGB代码除以最大RGB值来规范化RGB代码。
x_列/=255
x_检验/=255
打印('x_列形状:',x_列形状)
打印('x_列中的图像数',x_列.shape[0])
打印('x_测试中的图像数',x_测试.形状[0])
def create_model_deep():
模型=顺序()
添加(Conv2D(32,内核大小=(5,5),激活='relu',输入形状=输入形状))
add(MaxPooling2D(池大小=(2,2)))
模型。添加(辍学(0.2))
add(Conv2D(64,内核大小=(5,5),activation='relu'))
add(MaxPooling2D(池大小=(2,2)))
模型。添加(辍学(0.2))
model.add(展平())#展平完全连接层的二维阵列
添加(密集(128,activation='relu'))
模型。添加(辍学(0.2))
添加(密集(数字到分类,激活='softmax'))
model.compile(优化器='adam',
损失=“稀疏”\u分类”\u交叉熵',
指标=[‘准确度’])
回归模型
model=create_model_deep()
model.summary()
模型拟合(x=x\u列,y=y\u列,历代=10)
模型评估(x_检验,y_检验)
##########################傻瓜箱FGSM攻击###############################################
从keras.backend导入设置\u学习\u阶段
设置学习阶段(0)
从傻瓜箱。标准导入错误分类
fmodel=whoolbox.models.TensorFlowModel.from_keras(model,bounds=(0,1))
攻击=傻瓜箱.attacks.FGSM(fmodel,criteria=Misclassification())
fgsm_误差=0.0
对于范围内的i(x_检验形状[0]):
如果i%1000==0:
印刷品(一)
敌对=攻击(x_测试[i],y_测试[i])
如果“对抗性”不是“无”:
对抗性=对抗性。重塑(1,28,28,1)
模型预测=模型预测(对抗性)
label=np.argmax(模型预测)
如果标签!=y_检验[i]:
fgsm_误差=fgsm_误差+1.0
fgsm_error=fgsm_error/x_test.shape[0]
##########################我自己的FGSM攻击###############################################
sess=K.获取会话()
每股收益=0.3
x_adv=tf.placeholder(tf.float32,shape=(1,28,28,1),name=“adv_示例”)
x_noise=tf.placeholder(tf.float32,shape=(1,28,28,1),name=“adv_noise”)
x_输入=x_测试[0]。重塑(1,28,28,1)
y_输入=y_测试[0]
def损失(y_真实,y_预测):
返回K.sparse\u categorical\u crossentropy(y\u true,y\u pred)
梯度=K.梯度(损耗fn(输入,模型输出,模型输入)
增量=K符号(梯度[0])
x_噪声=x_噪声+增量
x_adv=x_adv+eps*delta
x_adv=K.clip(x_adv,0.0,1.0)
x_adv,x_noise,grad=sess.run([x_adv,x_noise,grad],feed_dict={model.input:x_input,x_adv:x_input,x_noise:np.zeros_like(x_input)})
pred=模型预测(x_adv)
下面的代码现在似乎可以工作了。请看我下面的评论


sess=K.获取会话()
每股收益=0.3
i=100
x_输入=x_测试[i]。重塑(1,28,28,1)
y_输入=y_测试[i]
x_adv=x_输入
#附加噪声
x_噪声=np.类零(x_输入)
def损失(y_真实,y_预测):
目标=K.1_热(y_真,10)
损失=K.分类交叉熵(目标,y\u pred)
回波损耗
#loss=K.print\u张量(loss,message='loss='))
#返回K.sparse\u categorical\u crossentropy(y\u true,y\u pred)
def损耗fn稀疏(y_真,y_pred):
损失=K.稀疏\分类\交叉熵(y \真,y \ pred)
回波损耗
image=K.cast(x_输入,dtype='float32')
y_pred=模型(图像)
损耗=损耗\u fn\u稀疏(y\u输入,y\u pred)
梯度=K.梯度(损失、图像)
增量=K符号(梯度[0])
x_噪声=x_噪声+增量
x_adv=x_adv+eps*delta
x_adv=K.clip(x_adv,0.0,1.0)
x_adv,x_noise=sess.run([x_adv,x_noise],feed_dict={model.input:x_input})
pred=模型预测(x_adv)

事实上,我找到了解决办法。我想问题是我混合了两种东西。有些地方我使用Keras后端,但随后我用tf.placeholder定义了占位符。实际上,我删除了tf.placeholder,并没有将它们作为feed_dict的输入提供。下面的代码似乎可以工作。因此,我编写的代码可以工作,但比傻瓜库慢。有什么原因吗?也许是因为我在Keras.backend做一些事情,这会让它变慢?