Применение сохраненного генома NEAT-Python к тестовой среде после обучения

Я использовал несколько алгоритмов NEAT, чтобы написать собственный ИИ для некоторых простых игр, таких как flappy bird. Все работает нормально, и я знаю, что происходит. Проблема в том, что я не знаю, что делать с результатом. ИИ чему-то учится, и я хочу сохранить этот прогресс. TechwithTim YouTuber кое-что сказал об использовании pickle, который у меня сработал, когда я сохранил его. Я даже могу загрузить его из файла, но на этом я закончу. Я не знаю, что делать дальше, чтобы заставить одну птицу играть в игру, зная о птицах, играющих в игру до него.

Сохранение в одном коде

winner = p.run(game,50)
with open("winner.pkl", "wb") as f:
    pickle.dump(winner, f)
    f.close()

Открытие в другом коде:

with open("winner.pkl", "wb") as f:
    genome = pickle.load(f)

Когда используешь

print(type(genome))

выход

<class "neat.genome.DefaultGenome">

person Gruny    schedule 22.04.2020    source источник
comment
Похоже, вы успешно сохранили и загрузили геном. Теперь ваш вопрос заключается в том, как снова применить нейронную сеть, сохраненную в этом геноме, к тестовой среде. Если вы загрузите ссылку на код, в котором вы обучили популяцию (набор геномов), я могу указать вам на ту часть, в которой вы применяете геном в тестовой среде. Затем вам нужно просто повторить эту структуру кода с выбранным геномом-победителем.   -  person PaulOnStackoverflow    schedule 22.04.2020
comment
github.com/Grundibad/Flappy-bird-ai @PaulOnStackoverflow   -  person Gruny    schedule 22.04.2020


Ответы (1)


Я предполагаю, что предоставленный вами код не является вашим собственным, и что вы следовали некоторому руководству. Качество кода очень низкое, документации в виде комментариев буквально не существует, а имена переменных не на английском языке. Если вы это кодировали, то это совершенно нормально для новичка. На самом деле даже впечатляюще. Хотя особенно для начинающих, я настоятельно рекомендую поискать более объясненные и задокументированные руководства.

С учетом сказанного, вот код, который вам нужно добавить в свой проект, чтобы воспроизвести сохраненный геном:

def replay_genome(config_path, genome_path="winner.pkl"):
    # Load requried NEAT config
    config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet, neat.DefaultStagnation, config_path)

    # Unpickle saved winner
    with open(genome_path, "rb") as f:
        genome = pickle.load(f)

    # Convert loaded genome into required data structure
    genomes = [(1, genome)]

    # Call game with only the loaded genome
    game(genomes, config)

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

Бесстыдный плагин: если вы хотите узнать больше о нейроэволюции, см. Здесь: https://towardsdatascience.com/9068f532f7f7

person PaulOnStackoverflow    schedule 22.04.2020