#neural-network #machine-learning #networking

neuralneat

Kenneth Stanley 的 NeuroEvolution of Augmenting Topologies (NEAT) 神经网络进化技术的实现。

3 个版本 (破坏性更新)

0.3.0 2023年8月5日
0.2.0 2023年8月5日
0.1.0 2023年7月27日

#314 in 机器学习

自定义许可

84KB
1.5K SLoC

神经网络 NEAT

Neural NEAT 是一个 Rust 库,实现了 Kenneth Stanley 的 NeuroEvolution of Augmenting Topologies (NEAT) 神经网络进化技术。

项目状态

该项目还处于早期阶段,但包含了一个基本的实现,能够生成初始的基因组种群,并在连续的世代中进化。

API 应该被视为非常不稳定。它可能会在很短的时间内或没有任何通知的情况下更改,并且版本变化之间没有保证的 API 稳定性。(随着项目的成熟,这可能会改变。)

安装

cargo add neuralneat

用法

使用 Neural NEAT 进化神经网络的标准流程是创建一个 Pool,测试 Pool 中的每个 Genome,然后在新一代之前重复此过程,直到您想要的或需要的次数。例如

use neuralneat::{Genome, Pool, Trainer};
use neuralneat::evaluation::TrainingData;

// To do something useful, you need to decide what your training data is!
fn load_training_data() -> Vec<TrainingData> {
    return vec![];
}

fn main() {
    let input_nodes = 5;
    let output_nodes = 1;
    // Create an initial pool of Genomes
    let mut gene_pool = Pool::with_defaults(input_nodes, output_nodes);
    
    // Load the data that will be used to train and evolve the Genomes
    let training_data: Vec<TrainingData> = load_training_data();
    
    // A Trainer can manage the process of training a population of Genomes
    // over successive generations.
    let mut trainer = Trainer::new(training_data);
    
    trainer.train(
        &mut gene_pool,
        // Train for 100 generations
        100,
    );
    // The winner!
    let best_genome = gene_pool.get_best_genome();
}

示例

该库包含两个简单的示例

  • adding 示例将训练一个能够对输入求和的神经网络
    • 还有一个 adding_managed 变体,它通过上述描述的 train_population 接口训练相同类型的网络。
  • compare 示例将训练一个神经网络,预测第一个输入是否大于第二个输入。

这两个示例都支持训练和评估。训练将测试多个代数的基因组,并将最佳基因组序列化到 winner.json。评估将接收一个序列化的基因组,将其输入给给定的输入,并打印输出。这可以用于手动验证训练的基因组,并测试训练数据之外的情况。

例如,要训练新的 adding 基因组,运行

cargo run --example adding train

您应该看到类似以下输出

Evaluating generation 1
Species 0 Genome 0 increased best fitness to 0
Species 0 Genome 1 increased best fitness to 0.000030846237
Species 0 Genome 33 increased best fitness to 0.001098452
Species 0 Genome 58 increased best fitness to 0.56081927
Evaluating generation 2
Species 0 Genome 79 increased best fitness to 0.7184653
Evaluating generation 3
Species 0 Genome 79 increased best fitness to 15.087382
Evaluating generation 4
<much more of this redacted>
Evaluating generation 100
Serializing best genome to winner.json

完成此过程后,您可以手动评估冠军。例如

$ cargo run --example adding evaluate winner.json 2 5 7 9
Sum of inputs is..........23
$ cargo run --example adding evaluate winner.json 2 5 7 9
Sum of inputs is..........23
$ cargo run --example adding evaluate winner.json 2 53 7 9
Sum of inputs is..........71
$ cargo run --example adding evaluate winner.json 2 53 7 91
Sum of inputs is..........153
$ cargo run --example adding evaluate winner.json 2 53 17 91
Sum of inputs is..........163
$ cargo run --example adding evaluate winner.json 12 53 17 91
Sum of inputs is..........173
$ cargo run --example adding evaluate winner.json 12 53 33317 91
Sum of inputs is..........33473
$ cargo run --example adding evaluate winner.json 12 53 33317 9132
Sum of inputs is..........42514
$ cargo run --example adding evaluate winner.json 1211 53 33317 9132
Sum of inputs is..........43713

请注意,训练网络本质上是随机的,并且高度依赖于您给出的训练数据。您的获胜基因组可能的表现与上面不同。

文档

完整文档可以在 https://docs.rs/neuralneat 找到。

依赖项

~5.5–8MB
~136K SLoC