与 scipy's implementation 不同对于差分进化(DE),没有直接的方法来定义我的输入的界限 在 tensorflow-probability 。
因为我的函数的输入是定义图像中像素的 5 元组 (x,y,R,G,B),这些值需要是整数,并限制在我的图像尺寸以及优化过程中 0 到 255 的 RGB 值。
描绘更大的图景: 我想最小化图像分类器的置信度,图像分类器本身是强化学习代理的一部分,需要根据其对环境的观察来决定行动。该代理经过充分训练,但现在我想通过扰乱其观察中的单个像素来扔一些石头并监控其性能。
我想使用差分进化算法来找到最会降低代理对其 Action 的置信度的像素。
目前,我有一个 Action 预测函数,它将扰动像素作为参数,通过分类器运行扰动观察,并返回代理在没有扰动的情况下选择的 Action 的置信度:
代码块I
#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
现在我想将此函数提供给具有初始群体的优化器:
代码块二
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上询问过这个问题实现这一目标的一种可能方法是使用其双射器功能:
代码块III
# 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)
虽然我原则上理解该方法,但我无法将其应用于我当前的情况/对我的问题的理解。
编辑:删除了与主要问题无关的信息。始终注意您的类型和尺寸!
最佳答案
根据我使用 tfp-0.6 和 tf-1.13.1 的经验,代码块 III 可以重写如下:
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。
关于python - 如何在 tensorflow 概率中限制 Differential_evolution_minimize 的输入维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701525/