NEAT算法配置异常求助:AI音乐生成代码运行报错
问题描述
尝试用NEAT算法结合音乐理论实现AI作曲,已编写基础代码并计划拓展功能,但遇到两个问题:
- 使用配置文件时,运行报错提示缺少num_inputs配置项
- 尝试调用默认基因组配置时,触发
AttributeError: module 'neat' has no attribute 'DefaultGenomeConfig'
以下是代码与配置文件:
代码实现
import neat import random import numpy as np import os from midiutil import MIDIFile config_path = "config.txt" num_generations = 10 num_measures = 16 beats_per_measure = 4 num_tracks = 1 beat_duration = 0.25 output_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 fitness def 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_fitness def calculate_melodic_fitness(melody): melodic_fitness = 0.0 # Placeholder value return melodic_fitness def calculate_harmonic_fitness(melody): harmonic_fitness = 0.0 return harmonic_fitness def calculate_rhythmic_fitness(melody): rhythmic_fitness = 0.0 # Placeholder value return rhythmic_fitness def 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("Generated music saved as", output_file) run_neat() fitness_criterion = max fitness_threshold = 1000 pop_size = 100 reset_on_extinction = False
配置文件(config.txt)
[DefaultGenome] # Node activation options: sigmoid, tanh, relu, softmax, identity activation_default = sigmoid activation_mutate_rate = 0.1 activation_options = sigmoid # Node aggregation options: sum, product, min, max, mean aggregation_default = sum aggregation_mutate_rate = 0.0 aggregation_options = sum # Node bias options: enabled, uniform, gauss bias_init_type = gauss 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 # Connection weight options: enabled, uniform, gauss, adaptive, xavier weight_init_type = gauss weight_init_mean = 0.0 weight_init_stdev = 1.0 weight_max_value = 30.0 weight_min_value = -30.0 weight_mutate_power = 0.5 weight_mutate_rate = 0.8 weight_replace_rate = 0.1 [DefaultReproduction] # Probability of asexual reproduction (without crossover) asexual_reproduction_probability = 0.25 [DefaultSpeciesSet] compatibility_threshold = 3.0 [DefaultStagnation] species_fitness_func = max max_stagnation = 20 species_elitism = 2 [DefaultGenomeConfig] num_inputs = 1 num_outputs = 1
问题排查与修复
1. 解决AttributeError: module 'neat' has no attribute 'DefaultGenomeConfig'
- 原因:neat-python库中不存在
DefaultGenomeConfig类,neat.Config的构造函数仅需传入基因组、繁殖、物种集、停滞策略这四个核心类,再加上配置文件路径,无需额外传入基因组配置类。 - 修复:修改
run_neat函数中的配置初始化代码,移除多余参数:
config = neat.Config( neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet, neat.DefaultStagnation, config_path, )
2. 解决配置文件缺少num_inputs的报错
- 原因:
num_inputs和num_outputs属于[DefaultGenome]配置段的必填参数,你错误地将其放入了不存在的[DefaultGenomeConfig]段,导致neat无法读取。 - 修复:修改配置文件,将
num_inputs和num_outputs移至[DefaultGenome]段末尾,并删除多余的[DefaultGenomeConfig]段:
[DefaultGenome] # 原有配置内容... num_inputs = 1 num_outputs = 1
3. 修复全局配置参数无效问题
你在代码末尾定义的fitness_criterion、fitness_threshold等参数未生效,这些参数需要写入配置文件的[NEAT]段,在配置文件末尾添加:
[NEAT] fitness_criterion = max fitness_threshold = 1000 pop_size = 100 reset_on_extinction = False
内容的提问来源于stack exchange,提问作者Dummy
相关产品推荐
相关产品推荐

