49 个版本

0.6.3 2021 年 3 月 3 日
0.6.1 2020 年 12 月 11 日
0.6.0 2020 年 11 月 22 日
0.5.6 2020 年 7 月 16 日
0.1.15 2020 年 3 月 28 日

#262 in 机器学习

Download history 2/week @ 2024-03-09 6/week @ 2024-03-30 1/week @ 2024-04-06

每月 141 次下载

Apache-2.0

90KB
1.5K SLoC

Cogent

Crates.io lib.rs.io docs

备注

我目前正在做一些 GPU 计算的东西,将来会在 Cogent 中使用。这就是为什么现在 Cogent 的开发已经暂停(或者至少是公开开发)的原因。

简介

Cogent 是一个用于训练基本神经网络以进行分类任务的基本库。它被设计成尽可能简单。神经网络训练中的超参数可以自动设置,为什么不呢?理想情况下,您可以简单地这样做:

let net = NeuralNetwork::Train(&data);

这是该想法最基本且尚不成熟的实现。

训练网络以对 MNIST 进行分类

// Uses
use cogent::{
    NeuralNetwork,
    EvaluationData,MeasuredCondition
};
use ndarray::{Array2,Axis};

// Setup
// ----------
// 784-ReLU->800-Softmax->10
let mut net = NeuralNetwork::new(784,&[
    Layer::Dense(800,Activation::ReLU),
    Layer::Dense(10,Activation::Softmax)
]);

// Setting training and testing data.
// `get_mnist_dataset(bool)` simply gets MNIST dataset.
// The boolean specifies if it is the MNIST testing data (`true`) or training data (`false`).

// Sets training and testing data.
let (mut train_data,mut train_labels):(Array2<f32>,Array2<usize>) = get_mnist_dataset(false);
let (test_data,test_labels):(Array2<f32>,Array2<usize>) = get_mnist_dataset(true);

// Execution
// ----------
// Trains until no notable accuracy improvements are being made over a number of iterations.
// By default this would end training if 0.5% accuracy improvement was not seen over 12 iterations/epochs.

net.train(&mut train_data,&mut train_labels)
    .evaluation_data(EvaluationData::Actual(&test_data,&test_labels)) // Sets evaluation data
    .l2(0.1) // Implements L2 regularisation with a 0.1 lambda vlaue
    .tracking() // Prints backpropgation progress within each iteration
    .log_interval(MeasuredCondition::Iteration(1)) // Prints evaluation after each iteration
    .go();

// If evaluation data is not set manually it will simply shuffle and split off a random group from training data to be evaluation data.
// In the case of MNIST where training and evaluation datasets are given seperately, it makes sense to set it as such.

// Evaluation
// ----------
let (cost,correctly_classified):(f32,u32) = net.evaluate(&test_data,&test_labels,None); // (cost,examples correctly classified)
println!("Cost: {:.2}",cost);
println!(
    "Accuracy: {}/{} ({:.2}%)",
    correctly_classified,
    test_data.len_of(Axis(1)),
    correctly_classified as f32 / test_data.len_of(Axis(1)) as f32
);

虽然我在这个过程中投入了大量的工作来制作这个库,并学习神经网络的基础知识,但我在这方面(无数方面)都是业余的。

如果您发现任何问题,我会非常感激您能让我知道(并可能提出任何解决方案)。

功能

  • 使用 ArrayFire Rust 绑定 进行 GPU 计算
  • 优化器:随机梯度下降。
  • 层:密集型、Dropout
  • 激活函数:Softmax、Sigmoid、Tanh、ReLU。
  • 损失函数:均方误差、交叉熵。
  • 其他:L2 正则化

安装

  1. 设置 ArrayFire Rust 绑定(忽略步骤 4)。
  2. cogent = "^0.6" 添加到 Cargo.toml

待办事项

  1. 卷积层。
  2. 精心测试(确保一切正常工作)。
  3. 优化 VRAM 的使用。
  4. 精心基准测试(确保速度快)。
  5. 与其他流行的神经网络库(Keras 等)进行基准测试。
  6. 自动网络创建:对一切进行贝叶斯优化。

请注意,开发顺序可能不是按照顺序进行的,这只是我的估计。

依赖项

~7MB
~131K SLoC