Реализация NEAT 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

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


person Kusi    schedule 29.12.2018    source источник


Ответы (1)


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

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

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

person jblew    schedule 04.01.2019
comment
@Kusi Отлично! Мне любопытно, у тебя переподготовка заработала? Это положительно повлияло на ценность фитнеса? - person jblew; 06.01.2019
comment
Да, у меня все заработало. Я настроил его таким образом, чтобы уровень значения пригодности оставался неизменным на протяжении всего времени, получая доступ к атрибуту порога пригодности. - person Kusi; 06.01.2019
comment
Повышает ли тренировка на каждом выходе общую физическую форму? - person jblew; 06.01.2019
comment
Я не тестировал это, потому что я использую фиксированный уровень пригодности (через доступ к атрибуту fitness_threshold) ... однако он уменьшает время сходимости в обучении, а также точность прогнозов. - person Kusi; 08.01.2019