You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NEAT算法配置异常求助:AI音乐生成代码运行报错

问题描述

尝试用NEAT算法结合音乐理论实现AI作曲,已编写基础代码并计划拓展功能,但遇到两个问题:

  1. 使用配置文件时,运行报错提示缺少num_inputs配置项
  2. 尝试调用默认基因组配置时,触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:23:20