我想要应用差分进化算法来最小化采用多维输入张量的目标函数。
以下是到目前为止的代码:
import tensorflow as tf
import tensorflow_probability.python as tfp
import numpy as np
tf.enable_eager_execution()
# Create objective function
def objective_fn(x):
return x[0] ** 2 + x[1] ** 2
# Generate a population
population_size = 40
initial_population = np.random.uniform(low=0.0, high=1.0, size=[population_size, 2])
#optimize
optim_results = tfp.optimizer.differential_evolution_minimize(objective_fn, initial_population=initial_population, seed=43210)
print(optim_results.position) 我收到以下错误:
InvalidArgumentError: Number of batches of 'then' must match size of 'cond', but saw: 40 vs. 2 [Op:Select]发布于 2020-03-30 19:33:46
differential_evolution_minimize expects您的目标函数接受一组候选解决方案作为输入,而不是单个候选解决方案。在您的代码中,您打算使用x[0]访问候选解决方案的第一个元素,但这实际上是从40个候选解决方案中获得第一个二维候选解决方案。因此,您的目标函数的输出是二维张量,而tensorflow期望它是40维的,因此出现了错误。
要为您的简单示例解决此问题,您必须重新定义目标函数,以便它使用张量进行操作,例如,如下所示:
def objective_fn(x):
return(tf.reduce_sum(input_tensor=x**2, axis=-1))现在,假设您的目标函数只是一个演示问题的玩具示例,您可能仍然希望单独访问各个候选解决方案的元素。如果你真的需要它,确实可以通过遍历种群来实现,但对于任何现实生活中的应用程序来说,这都会大大降低性能:
def objective_fn(x_population):
result_numpy = [x[0].numpy() ** 2 + x[1].numpy() ** 2 for x in x_population]
return(tf.constant(result_numpy))https://stackoverflow.com/questions/59596229
复制相似问题