Реализация NEAT Python для переподготовки после каждого прогноза - PullRequest
0 голосов
/ 29 декабря 2018

Я хотел бы понять, как реализовать аккуратный Python таким образом, чтобы он переобучался после каждого сделанного прогноза, поэтому обучающий набор увеличивается в размере после каждого прогноза.

Я пытаюсь настроить аккуратный Python черезфайл конфигурации для переподготовки после каждого прогноза тестового / невидимого набора.Например, если XOR «эволюционирующий минимальный» пример, насколько я понимаю, его можно настроить так, чтобы он обучался на части данных (до определенного уровня пригодности, получая лучший геном), тогда он предсказывает на других данных, которые были установленыкроме как тестовый набор.См. Приведенный ниже код, чтобы понять, что я имею в виду:

from __future__ import print_function
import neat
import visualize

# 2-input XOR inputs and expected outputs. Training set
xor_inputs = [(0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (1.0, 1.0, 1.0), (0.0, 0.0, 1.0), (1.0, 1.0, 0.0)]
xor_outputs = [(1.0,), (1.0,), (1.0,), (0.0,), (0.0,)]

# Test set
xor_inputs2 = [(1.0, 0.0, 1.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0)]
xor_outputs2 = [(1.0,), (0.0,), (0.0,)]


def eval_genomes(genomes, config):
 for genome_id, genome in genomes:
    genome.fitness = 5
    net = neat.nn.FeedForwardNetwork.create(genome, config)
  for xi, xo in zip(xor_inputs, xor_outputs):
    output = net.activate(xi)
    genome.fitness -= (output[0] - xo[0]) ** 2


# Load configuration.
config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,
                 neat.DefaultSpeciesSet, neat.DefaultStagnation,
                 'config-feedforward')

# Create the population, which is the top-level object for a NEAT run.
p = neat.Population(config)

# Add a stdout reporter to show progress in the terminal.
p.add_reporter(neat.StdOutReporter(True))
stats = neat.StatisticsReporter()
p.add_reporter(stats)

# Run until a solution is found.
winner = p.run(eval_genomes) 

# Display the winning genome.
 print('\nBest genome:\n{!s}'.format(winner))

# Show output of the most fit genome against training data.
print('\nOutput:')
winner_net = neat.nn.FeedForwardNetwork.create(winner, config)
count = 0

#To make predictions using the best genome
for xi, xo in zip(xor_inputs2, xor_outputs2):
  prediction = winner_net.activate(xi)
  print("  input {!r}, expected output {!r}, got {!r}".format(
  xi, xo[0], round(prediction[0])))
  #to get prediction accuracy
  if int(xo[0]) == int(round(prediction[0])):
    count = count + 1
accuracy = count / len(xor_outputs2)
print('\nAccuracy: ', accuracy)

node_names = {-1: 'A', -2: 'B', 0: 'A XOR B'}
visualize.draw_net(config, winner, True, node_names=node_names)
visualize.plot_stats(stats, ylog=False, view=True)
visualize.plot_species(stats, view=True)

Файл конфигурации:

#--- parameters for the XOR-2 experiment ---#

[NEAT]
fitness_criterion     = max
fitness_threshold     = 4.8
pop_size              = 150
reset_on_extinction   = True

[DefaultGenome]
# node activation options
activation_default      = sigmoid
activation_mutate_rate  = 0.0
activation_options      = sigmoid

# 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.01

feed_forward            = True
initial_connection      = full_direct

# node add/remove rates
node_add_prob           = 0.2
node_delete_prob        = 0.2

# network parameters
num_hidden              = 0
num_inputs              = 3
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

Однако проблема заключается в том, что после каждого прогноза втестовый набор.Я считаю, что параметры в конфигурационном файле являются статическими и не могут изменяться после начала тренировочного процесса, поэтому, если ваш уровень физической подготовки основан на количестве правильных классификаций тренировочного набора (что я и пытаюсь реализовать, очень похоже натот, который используется здесь), это будет проблемой, и поэтому я хотел бы понять, может ли быть реализована модель, которая переобучается, путем настройки параметра в файле конфигурации.Или тут что-то еще?

1 Ответ

0 голосов
/ 04 января 2019

Если я правильно понимаю, что вы спрашиваете, это не может быть просто сделано внутри config_file.

Параметры, определенные в файле config_file, просто изменяют то, что происходит, когда модель проходит прямо через данные, делая прогнозы без какой-либо переподготовки.

Если вы хотите, чтобы модель переучивалась после каждого предсказанного вами 'Я должен реализовать эту функцию в функциях eval_genomes и / или run.Вы можете добавить еще один цикл for внутри итераций каждого генома, чтобы получить каждый вывод и переобучить модель.Однако это, вероятно, значительно увеличит время вычислений, поскольку вы не просто получаете выходные данные, но запускаете другой набор обучающих поколений для каждого выходного сигнала.

...