- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Explaining and Harnessing Adversarial Examples 中的 FGSM 方法实现对抗性训练使用自定义损失函数:
使用自定义损失函数在 tf.keras 中实现,它在概念上如下所示:
model = Sequential([
...
])
def loss(labels, logits):
# Compute the cross-entropy on the legitimate examples
cross_ent = tf.losses.softmax_cross_entropy(labels, logits)
# Compute the adversarial examples
gradients, = tf.gradients(cross_ent, model.input)
inputs_adv = tf.stop_gradient(model.input + 0.3 * tf.sign(gradients))
# Compute the cross-entropy on the adversarial examples
logits_adv = model(inputs_adv)
cross_ent_adv = tf.losses.softmax_cross_entropy(labels, logits_adv)
return 0.5 * cross_ent + 0.5 * cross_ent_adv
model.compile(optimizer='adam', loss=loss)
model.fit(x_train, y_train, ...)
这对于简单的卷积神经网络来说效果很好。
在 logits_adv = model(inputs_adv)
调用期间,模型被第二次调用。这意味着,它将使用与 model.inputs 的原始前馈传递不同的丢弃掩码。然而,inputs_adv 是使用 tf.gradients(cross_ent, model.input) 创建的,即使用原始前馈传递中的 dropout mask。这可能会出现问题,因为允许模型使用新的 dropout mask 可能会削弱对抗批处理的效果。
由于在 Keras 中实现 dropout mask 的重用会很麻烦,因此我对重用 mask 的实际效果感兴趣。这有什么不同吗?合法示例和对抗示例的测试准确性?
最佳答案
我尝试在 MNIST 上使用简单的 CNN 进行对抗性训练步骤的前馈传递过程中重用 dropout mask。我选择了与此cleverhans tutorial中使用的相同的网络架构。在 softmax 层之前有一个额外的 dropout 层。
这是结果(红色=重用dropout mask,蓝色=简单实现):
实线代表合法测试示例的准确性。虚线表示测试集上生成的对抗性示例的准确性。
总之,如果您仅使用对抗性训练作为正则化器来提高测试准确性本身,那么重复使用 dropout mask 可能不值得。对于对抗性攻击的鲁棒性来说,它可能会产生很小的影响。但是,您需要对其他数据集、架构、随机种子等进行进一步的实验,才能做出更有信心的声明。
为了保持上图的可读性,我省略了未经对抗训练的模型的对抗测试示例的准确性。该值约为 10%。
您可以在 this gist 中找到此实验的代码。通过 TensorFlow 的 eager 模式,实现 dropout mask 的存储和重用非常简单。
关于python - 在对抗训练期间是否应该重复使用 Dropout 面具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53395329/
我正在尝试在图像上绘制蒙版,蒙版是 body-pix (在 NodeJS 中)完成的处理的结果。出于性能原因,我想使用 OpenCV 来绘制蒙版,而不是 htmlcanva。 const se
在我的数据框中,我想用 nan 替换低于 1 和高于 5 的每个值。 此代码有效 persDf = persDf.mask(persDf 5)) 我不知道为什么会这样。我已经检查了手册页和关于明显类
我正在使用 Explaining and Harnessing Adversarial Examples 中的 FGSM 方法实现对抗性训练使用自定义损失函数: 使用自定义损失函数在 tf.keras
我有以下功能: def delta(r, dr): res = np.zeros(r.shape) mask1 = (r >= 0.5*dr) & (r = 0.5*dr) & (r <=
我有一个给定的数据框,我希望每一行都能够选择高于该行给定百分位数的值。 让我们考虑这个数据框: df = pd.DataFrame({'A' : [5,6,3,4, 0,5,9], 'B' : [1,
目前遇到一个技术问题,想改进之前的实现,情况是: 我有 5 个 GPIO 引脚,我需要使用这些引脚作为硬件标识符,例如: pin1: LOW pin2: LOW pin3: LOW pin4: LOW
我有一个字典,其中包含多个 pandas 掩码作为特定数据帧的字符串,但我找不到使用这些掩码的方法。 这是一个简短的可重现示例: df = pd.DataFrame({'age' : [10, 24,
我有一个 bool 掩码列表,该列表是通过将不同的搜索条件应用于数据框而获得的。这是一个包含 4 个掩码的示例列表: mask_list = [mask1, mask2, mask3, mask4]
我在 pandas 掩码子集上执行了一项任务: pdxy = pd.DataFrame(data,columns=['X','Y','C','CC']) mask = pdxy[:]['Y']==8
所以我有一个输入,默认情况下我希望它的值为 0.00。很简单。 当用户开始输入时,我想从右边开始填充。所以当他们输入“5”时,输入将显示“0.05”。然后他们输入一个零,输入变为“0.50”,依此类推
我是一名优秀的程序员,十分优秀!