Nano - C++ library [machine learning & numerical optimization] - superseeded by libnano

Nano

Nano provides numerical optimization and machine learning utilities. For example it can be used to train models such as multi-layer perceptrons (classical neural networks) and convolution networks.

Compilation build codecov

Use a C++14 compiler and install LibArchive, Zlib and DevIL. Nano is tested on Linux ([gcc 5+ | clang 3.8+], CMake 3.1+, Ninja or Make) and OSX (XCode 7+, homebrew, CMake 3.1+, Ninja or Make). The code is written to be cross-platform, so it may work (with minor fixes) on other platforms as well (e.g. Windows/MSVC).

The easiest way to compile (and install) is to run:

mkdir build-release && cd build-release
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DNANO_WITH_BENCH=ON

The test programs and utilities will be found in the build-release directory.

To build the debugging version with or without address, memory and thread sanitizers (if available) run:

mkdir build-debug && cd build-debug
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DNANO_WITH_[ASAN|LSAN|USAN|MSAN|TSAN]=ON

It is recommended to use libc++ with clang by issuing the following command:

cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER="clang++-4.0" -DNANO_WITH_LIBCPP=ON

Structure

This library is built around several key concepts mapped to C++ object interfaces. Each object type is registered with an ID and thus it can be selected from command line arguments. Also new objects can be easily registered and then they are automatically visible across the library and its associated programs. The list of all supported objects and their parameters is available using:

./apps/info --help
Numerical optimization

The solver is a gradient-based method for minimizing generic multi-dimensional functions. They are suitable for large-scale numerical optimization which are often the product of machine learning problems. Additionally the library provides a large set of unconstrained problems to benchmark the optimization algorithms using for example the following commands:

./bench/benchmark_solvers --min-dims 10 --max-dims 100 --convex --epsilon 1e-6 --iterations 1000

The following (line-search based) optimization methods are built-in:

./apps/info --solver
|----------|------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| solvers  | description                                    | configuration                                                                                                                                                                                      |
|----------|------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bfgs     | quasi-newton method (BFGS)                     | {"c1":"0.0001","c2":"0.9","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}                   |
| broyden  | quasi-newton method (Broyden)                  | {"c1":"0.0001","c2":"0.9","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}                   |
| cgd      | nonlinear conjugate gradient descent (default) | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-cd   | nonlinear conjugate gradient descent (CD)      | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-dy   | nonlinear conjugate gradient descent (DY)      | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-dycd | nonlinear conjugate gradient descent (DYCD)    | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-dyhs | nonlinear conjugate gradient descent (DYHS)    | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-fr   | nonlinear conjugate gradient descent (FR)      | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-hs   | nonlinear conjugate gradient descent (HS)      | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-ls   | nonlinear conjugate gradient descent (LS)      | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-n    | nonlinear conjugate gradient descent (N)       | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| cgd-prp  | nonlinear conjugate gradient descent (PRP+)    | {"c1":"0.0001","c2":"0.1","init":"quadratic","inits":"[unit,quadratic,consistent]","orthotest":"0.1","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"} |
| dfp      | quasi-newton method (DFP)                      | {"c1":"0.0001","c2":"0.9","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}                   |
| gd       | gradient descent                               | {"c1":"0.1","c2":"0.9","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"cg-descent","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}                       |
| lbfgs    | limited-memory BFGS                            | {"c1":"0.0001","c2":"0.9","history":"6","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}     |
| sr1      | quasi-newton method (SR1)                      | {"c1":"0.0001","c2":"0.9","init":"quadratic","inits":"[unit,quadratic,consistent]","strat":"interpolate","strats":"[back-armijo,back-wolfe,back-swolfe,interpolate,cg-descent]"}                   |
|----------|------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Machine learning

A task describes a classification or regression problem consisting of separate training and test samples (e.g. image patches) with associated target outputs if any. The library has built-in support for various standard benchmark datasets which are loaded directly from the original (compressed) files.

./apps/info --task
|---------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
| task          | description                                            | configuration                                                                                                   |
|---------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
| cifar10       | CIFAR-10 (3x32x32 object classification)               | {"dir":"/Users/cosmin/experiments/databases/cifar10"}                                                           |
| cifar100      | CIFAR-100 (3x32x32 object classification)              | {"dir":"/Users/cosmin/experiments/databases/cifar100"}                                                          |
| fashion-mnist | Fashion-MNIST (1x28x28 fashion article classification) | {"dir":"/Users/cosmin/experiments/databases/fashion-mnist"}                                                     |
| iris          | IRIS (iris flower classification)                      | {"dir":"/Users/cosmin/experiments/databases/iris"}                                                              |
| mnist         | MNIST (1x28x28 digit classification)                   | {"dir":"/Users/cosmin/experiments/databases/mnist"}                                                             |
| svhn          | SVHN (3x32x32 digit classification in the wild)        | {"dir":"/Users/cosmin/experiments/databases/svhn"}                                                              |
| synth-affine  | synthetic noisy affine transformations                 | {"isize":32,"osize":32,"noise":0.001000,"count":1024}                                                           |
| synth-nparity | synthetic n-parity task (classification)               | {"n":32,"count":1024}                                                                                           |
| synth-peak2d  | synthetic peaks in noisy images                        | {"irows":32,"icols":32,"noise":0.001000,"count":1024,"type":"regression","types":"[regression,classification]"} |
| wine          | WINE (wine classification)                             | {"dir":"/Users/cosmin/experiments/databases/wine"}                                                              |
|---------------|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|

The standard benchmark datasets can be download to $HOME/experiments/databases using:

bash scripts/download_tasks.sh --iris --wine --mnist --fashion-mnist --cifar10 --cifar100 --svhn

The image samples can be saved to disk using for example:

./apps/info_task --task mnist --task-params dir=$HOME/experiments/databases/mnist --save-dir ./

A model predicts the correct output for a given input (e.g. an image patch), either its label (if a classification task) or a score (if a regression task). A model is implemented as an acyclic graph of computation nodes also called layers. The following layers are builtin:

./apps/info --layer
|-----------|-------------------------------------------------|---------------------------------------------------------------------------|
| layer     | description                                     | configuration                                                             |
|-----------|-------------------------------------------------|---------------------------------------------------------------------------|
| act-pwave | activation: a(x) = x / (1 + x^2)                | null                                                                      |
| act-sigm  | activation: a(x) = exp(x) / (1 + exp(x))        | null                                                                      |
| act-sin   | activation: a(x) = sin(x)                       | null                                                                      |
| act-snorm | activation: a(x) = x / sqrt(1 + x^2)            | null                                                                      |
| act-splus | activation: a(x) = log(1 + e^x)                 | null                                                                      |
| act-ssign | activation: a(x) = x / (1 + |x|)                | null                                                                      |
| act-tanh  | activation: a(x) = tanh(x)                      | null                                                                      |
| act-unit  | activation: a(x) = x                            | null                                                                      |
| affine    | transform:  L(x) = A * x + b                    | {"ocols":"0","omaps":"0","orows":"0"}                                     |
| conv3d    | transform:  L(x) = conv3D(x, kernel) + b        | {"kcols":"1","kconn":"1","kdcol":"1","kdrow":"1","krows":"1","omaps":"1"} |
| mix-plus  | combine: sum 4D inputs                          | null                                                                      |
| mix-tcat  | combine: concat 4D inputs across feature planes | null                                                                      |
| norm3d    | transform: zero-mean & unit-variance            | {"norm":"global","norms":"[global,plane]"}                                |
|-----------|-------------------------------------------------|---------------------------------------------------------------------------|

A loss function assigns a scalar score to the prediction of a model y by comparing it with the ground truth target t (if provided): the lower the score, the better the prediction. The library uses the {-1, +1} codification of class labels.

./apps/info --loss
|---------------|----------------------------------------------------------------------------------|---------------|
| loss          | description                                                                      | configuration |
|---------------|----------------------------------------------------------------------------------|---------------|
| cauchy        | multivariate regression:     l(y, t) = 1/2 * log(1 + (y - t)^2)                  | null          |
| classnll      | single-label classification: l(y, t) = log(y.exp().sum()) + 1/2 * (1 + t).dot(y) | null          |
| m-cauchy      | multi-label classification:  l(y, t) = 1/2 * log(1 + (1 - y*t)^2)                | null          |
| m-exponential | multi-label classification:  l(y, t) = exp(-y*t)                                 | null          |
| m-logistic    | multi-label classification:  l(y, t) = log(1 + exp(-y*t))                        | null          |
| m-square      | multi-label classification:  l(y, t) = 1/2 * (1 - y*t)^2                         | null          |
| s-cauchy      | single-label classification: l(y, t) = 1/2 * log(1 + (1 - y*t)^2)                | null          |
| s-exponential | single-label classification: l(y, t) = exp(-y*t)                                 | null          |
| s-logistic    | single-label classification: l(y, t) = log(1 + exp(-y*t))                        | null          |
| s-square      | single-label classification: l(y, t) = 1/2 * (1 - y*t)^2                         | null          |
| square        | multivariate regression:     l(y, t) = 1/2 * (y - t)^2                           | null          |
|---------------|----------------------------------------------------------------------------------|---------------|

A trainer optimizes the parameters of a given model to produce the correct outputs for a given task using the cumulated values of a given loss over the training samples as a numerical optimization criteria. All the available trainers tune all their required hyper parameters on a separate validation dataset.

./apps/info --trainer
|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| trainer | description        | configuration                                                                                                                                                   |
|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| batch   | batch trainer      | {"solver":"lbfgs","solvers":"[cgd,cgd-cd,cgd-dy,cgd-dycd,cgd-dyhs,cgd-fr,cgd-hs,cgd-ls,cgd-n,cgd-prp,gd,lbfgs]","epochs":1024,"epsilon":0.000001,"patience":32} |
|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|

Examples

The library provides various command line programs and utilities. Each program displays its possible arguments with short explanations by running it with --help.

Most notably:

  • apps/info - prints all registered objects with the associated ID and a short description.
  • apps/info_archive - loads an archive (e.g. .tar, .tgz, .zip) and prints its description (e.g. file names and sizes in bytes).
  • apps/train - train a model on a given task.
  • apps/evaluate - test a model on a given task.
  • bench/benchmark_solvers - benchmark all optimization methods with varying the line-search parameters on standard test functions.
  • bench/benchmark_models - bechmark speed-wise some typical models on a synthetic task.

The scripts directory contains examples on how to train various models on different tasks.

Owner
Comments
  • SVRG

    SVRG

    Implement SG with variance reduction: http://papers.nips.cc/paper/4937-accelerating-stochastic-gradient-descent-using-predictive-variance-reduction.pdf https://arxiv.org/pdf/1603.05643v2.pdf

  • Improve stochastic optimizers

    Improve stochastic optimizers

    Need to improve tuning their hyper-parameters because there is a BIG variance in the resulting train/test error.

    Possible solutions:

    • limit the decay rate: [1e-4, 1e-1] to make sure some progress is performed
    • tune on larger number of epochs to have consistent results
  • CG_DESCENT linesearch (to improve)

    CG_DESCENT linesearch (to improve)

    CG_DESCENT line search is not working like advertised in the relevant paper:

    • it takes many more function value & gradient evaluations
    • its speed is much lower than of the competing CGD & LBFGS variants
  • Process 4D tensors

    Process 4D tensors

    Having 4D tensors as inputs (aka multiple samples to process at the same time) should greatly improve the speed of MLPs. To investigate and benchmark.

    This may require a refactoring of forward_model_t to allocate the input/outputs once per layer. Currently each layer keeps a copy of both input and output tensors.

  • Extend benchmark_trainers

    Extend benchmark_trainers

    • save the train & validation loss values/errors as csv
    • plot & compare their evolution with the number of iterations & seconds
    • extend the csv produced by trainer_state with an additional column as training time in seconds
  • All batch optimization methods should work

    All batch optimization methods should work

    Each batch optimization method (GD, CGD*, LBFGS) should have at least a line-search parametrization with which it ALWAYS converges for all test functions given enough iterations.

    For example there is no (CGD + line-search) combo that always works in the benchmark program.

  • Artificially augment the training data

    Artificially augment the training data

    Augment training samples (to reduce overfitting):

    • new parameter to all tasks: "noisy=off/on"
    • salt & pepper noise (vary the percentage)
    • translation, scale, various deformations

    info_task should also be updated to display the noisy training samples.

  • Redesign & extend the thread pool

    Redesign & extend the thread pool

    • Refactor the code to hide the implementation details. Also it does not make sense to use typedefs for basic std:: objects.
    • The thread pool should be resizable at run-time in the range[1, 8 * max_threads].
    • Add support for prioritizing the tasks.
    • Extend the unit tests to account for all these changes.
  • Extend unit test for trainers

    Extend unit test for trainers

    • test_trainer_affine: check that all trainers can decrease the training error to epsilon3 with every optimization method
    • test_trainer_classifier: same but for a simple classification task - classify an input as positive if its value is positive (+/- bias)
  • Stochastic trainer with increasing minibatches

    Stochastic trainer with increasing minibatches

    Relevant papers:

    • adaptive minibatch size: http://www.optimization-online.org/DB_FILE/2011/11/3226.pdf
    • geometrically increasing minibatch size: http://arxiv.org/pdf/1104.2373v4.pdf
  • More unit tests

    More unit tests

    • cortex::init() is not at all tested (e.g. could check all the managers have all the required IDs registered)
    • test the image processing functionality (e.g. gradient, gaussian filter) ....
  • Easier deployment of the library

    Easier deployment of the library

    Refactor the CMake script to install and export the library as described here: https://steveire.wordpress.com/2016/08/09/opt-in-header-only-libraries-with-cmake/

    An example project: https://github.com/pabloariasal/modern-cmake-sample and the associated blog: https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/

  • Implement quasi-Newton methods

    Implement quasi-Newton methods

    See the three examples from Nocedal's "Introductory lectures on convex optimization", page 41:

    • SR1 rank-one correction
    • DFP
    • BFGS

    These requires storing in memory a matrix of size DxD, but they can be good baselines to compare with. May implement a generic "Variable metric" solver templatized by the update method (just like for CGD).

    Bonus:

    • implement the test functions from page 56 (for geometric optimization and lp-norm approximation).
    • double check the implementation of the test functions that overflow (e.g. Zakharov): optimization fails for them when using a large number of dimensions (e.g. 1K+). Check if a numerically more robust implementation is possible.
    • double check the implementation of CGD methods, using the pseudo-code from page 45.
    • improve the speed of the test functions (they evaluation time should scale linearly with the number of dimensions).
    • more detailed line-search errors. Also investigate why the line-search methods fail so often for high dimensional test functions.
  • Implement Gradient Boosting

    Implement Gradient Boosting

    • implement GradientBoost as a learner
    • implement various regularization methods: global shrinkage, adaptive shrinkage per round, L2, early stopping (with a patience)
Deep Scalable Sparse Tensor Network Engine (DSSTNE) is an Amazon developed library for building Deep Learning (DL) machine learning (ML) models

Amazon DSSTNE: Deep Scalable Sparse Tensor Network Engine DSSTNE (pronounced "Destiny") is an open source software library for training and deploying

Dec 30, 2022
A library for creating Artificial Neural Networks, for use in Machine Learning and Deep Learning algorithms.
A library for creating Artificial Neural Networks, for use in Machine Learning and Deep Learning algorithms.

iNeural A library for creating Artificial Neural Networks, for use in Machine Learning and Deep Learning algorithms. What is a Neural Network? Work on

Apr 5, 2022
With deep learning to neuroscience world with shield for jetson nano - JNEEG (In progress)
With deep learning to neuroscience world with shield for jetson nano - JNEEG (In progress)

With deep learning to neuroscience world with shield for jetson nano - JNEEG (In progress)

Dec 11, 2022
An efficient C++17 GPU numerical computing library with Python-like syntax
An efficient C++17 GPU numerical computing library with Python-like syntax

MatX - Matrix Primitives Library MatX is a modern C++ library for numerical computing on NVIDIA GPUs. Near-native performance can be achieved while us

Jan 1, 2023
Edge ML Library - High-performance Compute Library for On-device Machine Learning Inference
 Edge ML Library - High-performance Compute Library for On-device Machine Learning Inference

Edge ML Library (EMLL) offers optimized basic routines like general matrix multiplications (GEMM) and quantizations, to speed up machine learning (ML) inference on ARM-based devices. EMLL supports fp32, fp16 and int8 data types. EMLL accelerates on-device NMT, ASR and OCR engines of Youdao, Inc.

Dec 20, 2022
An open source machine learning library for performing regression tasks using RVM technique.

Introduction neonrvm is an open source machine learning library for performing regression tasks using RVM technique. It is written in C programming la

May 31, 2022
A fast, scalable, high performance Gradient Boosting on Decision Trees library, used for ranking, classification, regression and other machine learning tasks for Python, R, Java, C++. Supports computation on CPU and GPU.
A fast, scalable, high performance Gradient Boosting on Decision Trees library, used for ranking, classification, regression and other machine learning tasks for Python, R, Java, C++. Supports computation on CPU and GPU.

Website | Documentation | Tutorials | Installation | Release Notes CatBoost is a machine learning method based on gradient boosting over decision tree

Dec 31, 2022
A lightweight C++ machine learning library for embedded electronics and robotics.

Fido Fido is an lightweight, highly modular C++ machine learning library for embedded electronics and robotics. Fido is especially suited for robotic

Dec 17, 2022
Nvvl - A library that uses hardware acceleration to load sequences of video frames to facilitate machine learning training

NVVL is part of DALI! DALI (Nvidia Data Loading Library) incorporates NVVL functionality and offers much more than that, so it is recommended to switc

Dec 19, 2022
Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, C++ machine learning library designed for real-time gesture recognition.

Gesture Recognition Toolkit (GRT) The Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, C++ machine learning library designed for re

Dec 29, 2022
An open-source, low-code machine learning library in Python
An open-source, low-code machine learning library in Python

An open-source, low-code machine learning library in Python ?? Version 2.3.6 out now! Check out the release notes here. Official • Docs • Install • Tu

Dec 29, 2022
nanoPGO: A header-only library for Pose-Graph-Optimization in SE(2).
nanoPGO: A header-only library for Pose-Graph-Optimization in SE(2).

nanoPGO nanoPGO: A header-only library for Pose-Graph-Optimization in SE(2). 1. Description This repo is an implementation of 2D Pose Graph Optimizati

Jul 7, 2022
A C++ implementation of Yolov5 helmet detection in Jetson Xavier nx and Jetson nano
A C++ implementation of Yolov5 helmet detection in Jetson Xavier nx and Jetson nano

A C++ implementation of Yolov5 to detect head or helmet in the wild in Jetson Xavier nx and Jetson nano This repository uses yolov5 to detect humnan h

Dec 3, 2022
A C++ implementation of Yolov5 to detect mask running in Jetson Xavier nx and Jetson nano.
A C++ implementation of Yolov5 to detect mask running in Jetson Xavier nx and Jetson nano.

yolov5-mask-detect A C++ implementation of Yolov5 to detect mask running in Jetson Xavier nx and Jetson nano.In Jetson Xavier Nx, it can achieve 33 FP

Dec 19, 2022
YoloX for a Jetson Nano 4 using ncnn.

YoloX Jetson Nano YoloX with the ncnn framework. Paper: https://arxiv.org/pdf/2107.08430.pdf Special made for a Jetson Nano, see Q-engineering deep le

Dec 6, 2022
An Open Source Machine Learning Framework for Everyone
An Open Source Machine Learning Framework for Everyone

Documentation TensorFlow is an end-to-end open source platform for machine learning. It has a comprehensive, flexible ecosystem of tools, libraries, a

Jan 7, 2023
Distributed machine learning platform

Veles Distributed platform for rapid Deep learning application development Consists of: Platform - https://github.com/Samsung/veles Znicz Plugin - Neu

Dec 5, 2022
A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.

Light Gradient Boosting Machine LightGBM is a gradient boosting framework that uses tree based learning algorithms. It is designed to be distributed a

Jan 5, 2023
High performance, easy-to-use, and scalable machine learning (ML) package, including linear model (LR), factorization machines (FM), and field-aware factorization machines (FFM) for Python and CLI interface.
High performance, easy-to-use, and scalable machine learning (ML) package, including linear model (LR), factorization machines (FM), and field-aware factorization machines (FFM) for Python and CLI interface.

What is xLearn? xLearn is a high performance, easy-to-use, and scalable machine learning package that contains linear model (LR), factorization machin

Dec 23, 2022