Python NEAT在某一点之后没有进一步学习



我的程序似乎一直在努力学习到某一点,然后它就满足了,根本停止了改进和更改。在我的测试中,它的值通常最多为-5,然后无论我让它运行多久,它都会保持不变。结果集也不会更改。

为了跟踪它,我做了自己的日志记录,看看哪一个做得最好。一和零的数组指的是人工智能做出正确选择的频率(1(,以及人工智能做出错误选择的频率。

我的目标是让AI重复一种高于0.5然后低于0.5的模式,而不一定要找到奇数。这只是一个小测试,看看我是否可以在做一些更高级的事情之前,让人工智能正确处理一些基本数据。

但不幸的是,它不起作用,我不确定为什么。

代码:

import os
import neat
def main(genomes, config):
networks = []
ge = []
choices = []
for _, genome in genomes:
network = neat.nn.FeedForwardNetwork.create(genome, config)
networks.append(network)
genome.fitness = 0
ge.append(genome)
choices.append([])
for x in range(25):
for i, genome in enumerate(ge):
output = networks[i].activate([x])
# print(str(x) + " - " + str(i) + " chose " + str(output[0]))
if output[0] > 0.5:
if x % 2 == 0:
ge[i].fitness += 1
choices[i].append(1)
else:
ge[i].fitness -= 5
choices[i].append(0)
else:
if not x % 2 == 0:
ge[i].fitness += 1
choices[i].append(1)
else:
ge[i].fitness -= 5
choices[i].append(0)
pass

# Optional death function, if I use this there are no winners at any point.
# if ge[i].fitness <= 20:
#     ge[i].fitness -= 100
#     ge.pop(i)
#     choices.pop(i)
#    networks.pop(i)
if len(ge) > 0:
fittest = -1
fitness = -999999
for i, genome in enumerate(ge):
if ge[i].fitness > fitness:
fittest = i
fitness = ge[i].fitness
print("Best: " + str(fittest) + " with fitness " + str(fitness))
print(str(choices[fittest]))
else:
print("Done with no best.")
def run(config_path):
config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet,
neat.DefaultStagnation, config_path)
pop = neat.Population(config)
#pop.add_reporter(neat.StdOutReporter(True))
#stats = neat.StatisticsReporter()
#pop.add_reporter(stats)
winner = pop.run(main, 100)
if __name__ == "__main__":
local_dir = os.path.dirname(__file__)
config_path = os.path.join(local_dir, "config-feedforward.txt")
run(config_path)

NEAT配置:

[NEAT]
fitness_criterion     = max
fitness_threshold     = 100000
pop_size              = 5000
reset_on_extinction   = False
[DefaultGenome]
# node activation options
activation_default      = tanh
activation_mutate_rate  = 0.0
activation_options      = tanh
# node aggregation options
aggregation_default     = sum
aggregation_mutate_rate = 0.0
aggregation_options     = sum
# node bias options
bias_init_mean          = 0.0
bias_init_stdev         = 1.0
bias_max_value          = 30.0
bias_min_value          = -30.0
bias_mutate_power       = 0.5
bias_mutate_rate        = 0.7
bias_replace_rate       = 0.1
# genome compatibility options
compatibility_disjoint_coefficient = 1.0
compatibility_weight_coefficient   = 0.5
# connection add/remove rates
conn_add_prob           = 0.5
conn_delete_prob        = 0.5
# connection enable options
enabled_default         = True
enabled_mutate_rate     = 0.1
feed_forward            = True
initial_connection      = full
# node add/remove rates
node_add_prob           = 0.2
node_delete_prob        = 0.2
# network parameters
num_hidden              = 0
num_inputs              = 1
num_outputs             = 1
# node response options
response_init_mean      = 1.0
response_init_stdev     = 0.0
response_max_value      = 30.0
response_min_value      = -30.0
response_mutate_power   = 0.0
response_mutate_rate    = 0.0
response_replace_rate   = 0.0
# connection weight options
weight_init_mean        = 0.0
weight_init_stdev       = 1.0
weight_max_value        = 30
weight_min_value        = -30
weight_mutate_power     = 0.5
weight_mutate_rate      = 0.8
weight_replace_rate     = 0.1
[DefaultSpeciesSet]
compatibility_threshold = 3.0
[DefaultStagnation]
species_fitness_func = max
max_stagnation       = 20
species_elitism      = 2
[DefaultReproduction]
elitism            = 2
survival_threshold = 0.2

很抱歉告诉您,这种方法根本不起作用。请记住,神经网络通常是由矩阵相乘,然后用0求最大值(这被称为RELU(构建而成的,因此基本上在每一层都是线性的,并有一个截止点(不,选择不同的激活,如sigmoid不会有帮助(。您希望网络生成>。5,<。5,>。5,<。5.25次。想象一下,用RELU部件来构建它需要什么。你至少需要一个大约25层深的网络,如果进化过程中没有持续的增量进展,NEAT就不会产生这么大的网络。不过,你有一个很好的同伴,你所做的相当于学习模运算符,这已经研究了很多年。以下是一个成功的帖子,尽管没有使用NEAT。Keras:制作一个神经网络来找到一个数字';s模量

使用NEAT,你能取得的唯一真正进展是给网络提供更多的功能作为输入,例如,给它x%2作为输入,它会很快学习,尽管这显然是"作弊"。

最新更新