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