我正在尝试使用NEAT通过音乐理论来生成歌曲。我已经在这里列出了基础代码,并且目前计划扩展一些功能。我的代码如下所示,同时附上了我的配置文件:然而,每当我尝试使用我的配置文件时,它要么返回一个运行时错误,提示缺少配置项:num_inputs,要么如果我尝试使用默认基因组配置,它会返回属性错误:模块 ‘neat’ 没有属性 ‘DefaultGenomeConfig’。任何建议都会非常有帮助。非常感谢您的提前帮助
import neatimport randomimport numpy as npimport osfrom midiutil import MIDIFileconfig_path = "config.txt"num_generations = 10num_measures = 16beats_per_measure = 4num_tracks = 1beat_duration = 0.25output_file = "generated_music.mid"def evaluate_genome(genome, config): net = neat.nn.FeedForwardNetwork.create(genome, config) melody = [] for _ in range(num_measures * beats_per_measure): inputs = [random.random()] output = net.activate(inputs) note = int(output[0] * 127) melody.append(note) fitness = calculate_fitness(melody) return fitnessdef calculate_fitness(melody): melodic_fitness = calculate_melodic_fitness(melody) harmonic_fitness = calculate_harmonic_fitness(melody) rhythmic_fitness = calculate_rhythmic_fitness(melody) overall_fitness = melodic_fitness + harmonic_fitness + rhythmic_fitness return overall_fitnessdef calculate_melodic_fitness(melody): melodic_fitness = 0.0 # 占位值 return melodic_fitnessdef calculate_harmonic_fitness(melody): harmonic_fitness = 0.0 return harmonic_fitnessdef calculate_rhythmic_fitness(melody): rhythmic_fitness = 0.0 # 占位值 return rhythmic_fitnessdef run_neat(): local_dir = os.path.dirname(__file__) config_path = os.path.join(local_dir, "config.txt") config = neat.Config( neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet, neat.DefaultStagnation, neat.DefaultGenomeConfig, config_path, ) population = neat.Population(config) reporter = neat.StdOutReporter(True) population.add_reporter(reporter) winner = population.run(evaluate_genome, num_generations) best_genome = winner best_net = neat.nn.FeedForwardNetwork.create(best_genome, config) melody = [] for _ in range(num_measures * beats_per_measure): inputs = [random.random()] output = best_net.activate(inputs) note = int(output[0] * 127) melody.append(note) midi_file = MIDIFile(num_tracks) track = 0 time = 0 for note in melody: midi_file.addNote(track, 0, note, time, beat_duration, 100) time += beat_duration with open(output_file, "wb") as file: midi_file.writeFile(file) print("生成的音乐已保存为", output_file)run_neat()fitness_criterion = maxfitness_threshold = 1000pop_size = 100reset_on_extinction = False
我的配置文件:
[DefaultGenome]# 节点激活选项:sigmoid, tanh, relu, softmax, identityactivation_default = sigmoidactivation_mutate_rate = 0.1activation_options = sigmoid# 节点聚合选项:sum, product, min, max, meanaggregation_default = sumaggregation_mutate_rate = 0.0aggregation_options = sum# 节点偏置选项:enabled, uniform, gaussbias_init_type = gaussbias_init_mean = 0.0bias_init_stdev = 1.0bias_max_value = 30.0bias_min_value = -30.0bias_mutate_power = 0.5bias_mutate_rate = 0.7bias_replace_rate = 0.1# 连接权重选项:enabled, uniform, gauss, adaptive, xavierweight_init_type = gaussweight_init_mean = 0.0weight_init_stdev = 1.0weight_max_value = 30.0weight_min_value = -30.0weight_mutate_power = 0.5weight_mutate_rate = 0.8weight_replace_rate = 0.1[DefaultReproduction]# 无性繁殖(无交叉)的概率asexual_reproduction_probability = 0.25[DefaultSpeciesSet]compatibility_threshold = 3.0[DefaultStagnation]species_fitness_func = maxmax_stagnation = 20species_elitism = 2[DefaultGenomeConfig]num_inputs = 1num_outputs = 1
回答:
将网络配置(num_inputs
, num_outputs
)移动到 [DefaultGenome]
部分(不是 DefaultGenomeConig)。
例如:
[NEAT]fitness_criterion = maxfitness_threshold = 3.9[DefaultGenome]# 网络参数num_hidden = 0num_inputs = 2num_outputs = 1
Python-NEAT 需要在正确的部分找到这些参数。DefaultGenomeConfig 是对应于 DefaultGenome
部分的配置类名称。我认为这是混淆的来源。
这里有不错的文档:https://neat-python.readthedocs.io/en/latest/config_file.html