- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 MAP-Elites 进化策略和多项式变异算子(如 here 在第 2 点定义)来实现进化算法,如 this 中所述。纸。我创建了三个不同的 MNIST 模型,并使用 Keras API 使用tensorflow==2.0.0a 对其进行训练。这些模型表现良好(准确率均在 95% 左右)。
我对上述进化策略的理解是,我们创建一个起始种群,然后在每次迭代中从该种群中随机选择一个样本进行变异。如果突变后,新样本确定属于任何类别,高于之前为该类别选择的最佳样本,那么我们将其视为最佳样本并将其添加到种群中。预期的结果是,算法完成后,我们应该为每个类别提供一个样本,并能够高度确定地分类到该类别中。创建的初始图像群是使用均匀分布创建的。
问题是我的模型将均匀分布创建的随机输入始终高度确定地分类为同一类(即 CNN 模型始终将其分类为 8)。因此,即使在初始种群和迭代次数很大(即 1000 个起始样本和 20000 次迭代)之后,我最终得到的大多数或所有样本都被分类为同一类(属于其他类的确定性略有不同)。
输入样本标准化为范围 [0.0, 1.0]。为了简化起见,下面的所有推理都仅限于底部描述的密集模型(CNN 和简化的 LeNet5 产生类似的结果)。
使用平均值 = 0.0 和 stddev = 0.3 或平均值 = 0.5 和 stddev = 0.3 的正态分布来生成起始群体和 0.3 的突变机会(而不是论文中的 0.1)会产生类似的结果。
我尝试使用 (1 , λ) 进化策略,仅针对一个类(起始种群 100、100 代),它比下面实现的 MAP-精英产生更好的结果(我可以为多个类生成样本)。
我尝试不规范模型的数据并使用 [0, 255] 范围再次训练它,但结果几乎相同。我还尝试使用高斯变异算子而不是多项式,但似乎没有太大区别。
当训练似乎没有效果时关闭数据增强。
这是我编写的实现。
def evolutionary_attack(model, population_size, generations_nmb, min=0.0, max=1.0, mutation_chance=0.1, mutation_power=15):
population = [] #
best_in_class = {} #dictionary of specimen performing best for given class
for x in range(population_size):
population.append(np.random.uniform(min, max, model.get_input_shape())) #initialize specimens with random values
# population.append(np.random.normal(0.0, 0.3, model.get_input_shape())) #initialize specimens with random values
for i in range(generations_nmb):
current_specimen = random.choice(population) #choose specimen at random from the population
mutated_specimen = mutate_specimen(current_specimen, min, max, mutation_chance, mutation_power)
logits = model(tf.expand_dims(tf.convert_to_tensor(mutated_specimen, dtype=tf.float32), 0))
certainties_per_class = tf.squeeze(logits).numpy()
for cur_class in range(len(certainties_per_class)):
if cur_class in best_in_class:
_, best_certainty = best_in_class[cur_class]
if certainties_per_class[cur_class] > best_certainty:
#if the new specimen performs better in given class make it a new best and add it to the population
best_in_class[cur_class] = (mutated_specimen, certainties_per_class[cur_class])
population.append(mutated_specimen)
else:
best_in_class[cur_class] = (mutated_specimen, certainties_per_class[cur_class]) #handles the case when there is no best specimen for the given class
def mutate_specimen(specimen, min, max, mutation_chance, mutation_power=15):
specimen = np.copy(specimen)
with np.nditer(specimen, op_flags=['readwrite']) as it:
for old_val in it:
if np.random.uniform() < mutation_chance:
u = np.random.uniform()
if u <= 0.5:
delta = ((2.0 * u) ** (1.0 / (mutation_power))) - 1.0
new_val = old_val + delta * (old_val - min)
else:
delta = 1.0 - (2 * (1 - u))** (1 / (1 + mutation_power))
new_val = old_val + delta * (max - old_val)
old_val[...] = new_val
return np.clip(specimen, min, max)
在论文中,作者表示,在 50 代后,他们能够以 >99.99% 的置信度分类每个数字的样本。这与我得到的结果有很大不同。看来我做错了什么,但我无法查明问题所在。我不确定这是否只是代码中的一些小错误,还是我的实现背后的推理错误。
我的模型是这样构造的
input_1 (输入层) [(无, 28, 28, 1)] 0
<小时/>压平(压平)(无,784)0
<小时/>密集(密集)(无,784)615440
<小时/>dense_1(密集)(无,800)628000
<小时/>dense_2(密集)(无,800)640800
<小时/>dense_3(密集)(无,10)8010
它已经使用 Adam 优化器通过数据增强进行了多个时期的训练。
编辑:我刚刚注意到我没有在突变后剪切样本的值。如果我这样做,那么使用正态分布会产生与使用均匀分布类似的结果。我在发布的代码中修复了这个问题。愚蠢的错误
最佳答案
我认为您误解了 MAP-精英。您正在与精英分开跟踪仅附加人群,但根据 this reference你应该只追踪精英。所以我认为选择当前样本的行应该是:
current_specimen, _ = random.choice(list(best_in_class.values()))
因此 MNIST 的最大群体规模为 10。我不能 100% 确定这是您的主要问题,但它至少应该使算法更加贪婪,使搜索远离最旧的解决方案。
再考虑一下这个问题,我不确定为什么这个方法应该在具有直接像素参数的 MNIST 上工作。仅通过随机突变生成不同的数字是非常不可能的,尤其是在对同一类进行了几步优化之后,所有其他类都保持为空。
看来您的实现实际上根据论文正确地完成了这部分:
[...] and replaces the current champion for any objective if the new individual has higher fitness on that objective.
但在最初的 MAP-Elites 中,目标是跟踪整个人群的单一全局健身指标。某些单元格可能仍为空,因为从未将任何解决方案映射到该单元格。该论文实际上跟踪了每个细胞的不同适应度指标。这应该被更突出地表述为 MAP-Elites 的修改。通过此修改,这似乎应该可行,但允许空单元格不再有意义。
关于python - 使用进化算法实现对抗性示例生成器表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56105489/
我使用以下代码和嵌套生成器迭代文本文档并使用 get_train_minibatch() 返回训练示例。我想保留( pickle )生成器,这样我就可以回到文本文档中的相同位置。但是,您不能 pick
在本教程中,您将借助示例了解 JavaScript 生成器。在 JavaScript 中,生成器提供了一种使用函数和迭代器的新方法。 使用生成器, 您可以从函数内部的任何位置停止执行函数 并从
LESS is very cool .我一直想知道是否有任何好的 html 生成器可以让我更轻松地编写表单或做其他事情。除了 html,是否有一些类似的东西? 最佳答案 已尝试 Haml ? 从它的网
前言 如果是做python或者其他语言的小伙伴,对于生成器应该不陌生。但很多php开发者或许都不知道生成器这个功能,可能是因为生成器是php 5.5.0才引入的功能,也可以是生成器作用不是很明显。
我正在尝试编写一个使用生成器语法生成日期时间列表的函数: let dateRange = let endDate = System.DateTime.Parse("6/1/2010")
我遇到了一些看起来像的代码: [func(val) for val in iterable] 有一个可迭代对象(在我的例子中是一个生成器),用户想要为其副作用调用每个值的函数(例如 func 可以只是
Delphi 有内置的东西来生成 UUID 吗? 最佳答案 program Guid; {$APPTYPE CONSOLE} uses SysUtils; var Uid: TGuid; Result
我正在深入研究 javascript 生成器,但我真的很困惑。 我使用 node@0.11.x 运行此示例: function find() { process.nextTick(functi
有人知道一些关于如何为 hibernate 创建自定义 ID 生成器的好教程吗? 最佳答案 在 Google 上粗略搜索“hibernate 自定义 id 生成器教程”发现了以下可能性。我排除了那些看
我正在关注 Python 大师 David Beazley 的幻灯片。它指出“生成器也用于并发。这是一个示例: from collections import deque def countdown(
我有一个生成事件的生成器,我想用可以从 API 获取的附加元数据来丰富它。 某些事件具有与其链接的对象 ID,而其他事件则具有对象的哈希值,但不能同时具有两者。我无法根据哈希获取对象 id,我只能执行
假设我有一个自定义类: public class CustomClass { private String name; private String data; public
我正在考虑实现一个函数来在 SQL 请求中“构建”WHERE 子句,如下所示: "SELECT * FROM table $where" 使用如下所示的循环构建 $where: $arr=array(
我正在寻找执行此操作的标准函数: def Forever(v): while True: yield v 这看起来太琐碎了,我不敢相信没有标准版本。 就此而言,有人知道指向所有标准生成器函
我知道这个网站上有几个非常相似的相关问题,但是在看了这部剧之后,我相信这个问题本身就是独一无二的。如果有人能找到并提供证据证明我的问题完全被骗了,我会自己撤回它(所以请不要否决这个!)。 我是 Jav
void __fastcall TForm1::Button1Click(TObject *Sender) { int size = MemoEnter->GetTextLen() + 1;
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我试图在我的生成器的以下两个定义之间做出决定。哪个更好?哪个“更像 python ”?无论如何,有没有办法减轻每一个的缺点? def myGenerator1(howMany): result
我有一个 Python 生成器 lexg,它在每次迭代时生成一个列表。该代码似乎在传统的 for 循环意义上工作,即 for i in lexg(2,2): print(i) 产生: [2, 0] [
我希望这不会超出 Python 生成器的能力,但我想构建一个这样,每次调用该函数时,它都会返回下一分钟直到结束时间。 因此该函数读取开始时间和结束时间,并以分钟为单位返回时间,直到涵盖其间的所有时间。
我是一名优秀的程序员,十分优秀!