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 机器学习
每月 141 次下载
90KB
1.5K SLoC
Cogent
备注
我目前正在做一些 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 正则化
安装
- 设置 ArrayFire Rust 绑定(忽略步骤 4)。
- 将
cogent = "^0.6"
添加到Cargo.toml
。
待办事项
- 卷积层。
- 精心测试(确保一切正常工作)。
- 优化 VRAM 的使用。
- 精心基准测试(确保速度快)。
- 与其他流行的神经网络库(Keras 等)进行基准测试。
- 自动网络创建:对一切进行贝叶斯优化。
请注意,开发顺序可能不是按照顺序进行的,这只是我的估计。
依赖项
~7MB
~131K SLoC