首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定differential_evolution_minimize的输入维数?

如何确定differential_evolution_minimize的输入维数?
EN

Stack Overflow用户
提问于 2019-08-29 00:29:13
回答 2查看 499关注 0票数 1

与差分进化(DE)的西佩的实施不同,在通流概率中没有直接定义输入边界的方法。

由于我的函数的输入是5元组,定义了图像(x,y,R,G,B)中的像素,因此在优化过程中,这些值需要是整数,并与我的图像维数以及RGB值0到255有界。

为了画出更大的图景:我想把图像分类器的可信度降到最低,它本身就是强化学习agent的一部分,需要根据它对环境的观察来决定它的行为。这个特工经过了充分的训练,但现在我想通过扰乱它的观察中的一个像素来扔几块石头,并监视它的性能。

我想使用差分进化算法来寻找像素,这将最大限度地降低agent对其行为的信心。

目前,我有一个动作预测函数,它以扰动像素作为参数,通过分类器运行受干扰的观测,并返回对代理在不受扰动的情况下所选择的动作的信心:

代码块I

代码语言:javascript
复制
#random perturbation pixel as an example of my input:
pixel = tf.constant([36,48,255,255,255]) # (x,y,R,G,B)

def predict_action(pixel):
   perturbed_obs = perturb_obs(pixel, observation)
   confidence = classifier(perturbed_obs)
   return confidence

现在,我想将这个函数交给具有初始填充的优化器:

代码块II

代码语言:javascript
复制
popsize=80

init_pop = generate_population(popsize)
# returns Tensor("scan/while/Squeeze:0", shape=(80, 5), dtype=int64)
# i.e. 80 random perturbation pixels

results = tfp.optimizer.differential_evolution_minimize(
    predict_action, initial_population=init_pop, seed=42)

然而,如何定义输入的边界,使填充始终是有效像素?

我在GitHub上询问了这一点,实现这一目标的一种可能方法是使用它们的双射器功能:

代码块三

代码语言:javascript
复制
# First we squash `pixel_logits` to (0, 1), then scale it to (0, 255).
bijector = tfb.Affine(scale=255.)(tfb.Sigmoid())

def unconstrained_objective_fn(pixel_logits):
    return objective_fn(bijector.forward(pixel_logits))

results = minimize(unconstrained_objective_fn, initial_position=bijector.inverse(initial_pixels))
pixels = bijector.forward(results.position)

虽然我原则上理解这一做法,但我未能将其适用于我目前的情况/对我的问题的理解。

编辑:删除与主要问题无关的信息。永远注意你的类型和尺寸!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-29 03:58:54

根据我在tfp-0.6和tf-1.13.1方面的经验,代码块三可以改写如下:

代码语言:javascript
复制
width = ... #some Python float
height = ... #some other Python float

bijectors = [
    tfb.Chain([tfb.AffineScalar(scale=width), tfb.Sigmoid()]),
    tfb.Chain([tfb.AffineScalar(scale=height), tfb.Sigmoid()]),
    tfb.Chain([tfb.AffineScalar(scale=255.), tfb.Sigmoid()]),
    tfb.Chain([tfb.AffineScalar(scale=255.), tfb.Sigmoid()]),
    tfb.Chain([tfb.AffineScalar(scale=255.), tfb.Sigmoid()])
  ]

def constrained_objective_fn(pixel_logits):
    constrained_pixel_logits = [b.forward(p) for b, p in zip(bijectors, pixel_logits)]
    return objective_fn(constrained_pixel_logits)

results = tfp.optimizer.differential_evolution_minimize(
constrained_objective_fn, 
initial_population=init_pop, 
seed=42)

pixels = [b.forward(p) for b, p in zip(bijectors, results.position)]

请注意,代码块II中的初始填充是保留的,没有应用bijector.inverse。

票数 1
EN

Stack Overflow用户

发布于 2019-08-29 23:57:22

这似乎是一个常规的dtype错误:您似乎将一个tf.int64类型传递到差分进化的初始位置/总体参数中,而它期望(可以理解)浮点张量。下面是适合我的最后代码片段的一个版本:

代码语言:javascript
复制
initial_pixels = 0.5

bijector = tfb.AffineScalar(scale=255.)(tfb.Sigmoid())

def objective_fn(pixels):
  return tf.square(pixels - 0.75)

def unconstrained_objective_fn(pixel_logits):
    return objective_fn(bijector.forward(pixel_logits))

results = tfp.optimizer.differential_evolution_minimize(unconstrained_objective_fn, initial_position=bijector.inverse(initial_pixels))
pixels = bijector.forward(results.position)
print(pixels)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57701525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档