mxnet
Deep Learning for Crystal
MXNet.cr provides MXNet bindings for the Crystal programming language. MXNet is a framework for machine learning and deep learning written in C++, supporting distributed training across multiple machines and multiple GPUs (if available).
MXNet.cr follows the design of the Python bindings, albeit with Crystal syntax. The following code:
require "mxnet"
a = MXNet::NDArray.array([[1, 2], [3, 4]])
b = MXNet::NDArray.array([1, 0])
puts a * b
outputs:
[[1, 0], [3, 0]]
<NDArray 2x2 int32 cpu(0)>
Examples
If you want to see what MXNet.cr can do, check out toddsundsted/deep-learning. It is a collection of problems and solutions from Deep Learning - The Straight Dope, a set of notebooks teaching deep learning using MXNet.
Installation
MXNet.cr requires MXNet.
Build MXNet from source (including Python language bindings) or install the library from prebuilt packages using the Python package manager pip, per the MXNet installation instructions:
https://mxnet.incubator.apache.org/install/index.html
And add the following to your application's shard.yml:
dependencies:
mxnet:
github: toddsundsted/mxnet.cr
Troubleshooting
MXNet.cr relies on the Python library to find the installed MXNet shared library ("libmxnet.so"). You can verify MXNet is installed with the following Python code:
import mxnet as mx
a = mx.ndarray.array([[1, 2], [3, 4]])
b = mx.ndarray.array([1, 0])
print(a * b)
which outputs:
[[1. 0.]
[3. 0.]]
<NDArray 2x2 @cpu(0)>
OSX
On OSX, you may need to give your program a hint about the location of the MXNet shared library (libmxnet.so). If you build and run your program and see an error message like the following:
dyld: Library not loaded: lib/libmxnet.so
Referenced from: /Users/homedirectory/.cache/crystal/crystal-run-eval.tmp
Reason: image not found
you need to either: 1) explicitly set the DYLD_FALLBACK_LIBRARY_PATH
environment variable to point to the directory containing libmxnet.so,
or 2) move or copy libmxnet.so into a well-known location (such as
the project's own lib directory).
Alternatively, and more permanently, you can modify the libmxnet.so shared library so that it knows where it's located at runtime (you will modify the library's LC_ID_DYLIB information):
LIBMXNET=/Users/homedirectory/mxnet-1.5.1/lib/python3.6/site-packages/mxnet/libmxnet.so # the full path
install_name_tool -id $LIBMXNET $LIBMXNET
Status
MXNet.cr currently implements a subset of Gluon, and supports a rich set of operations on arrays and symbols (arithmetic, trigonometric, hyperbolic, exponents and logarithms, powers, comparison, logical, rounding, sorting, searching, reduction and indexing) with automatic differentiation built in.
Implemented classes:
- MXNet
- Autograd
- Context
- Executor
- Optimizer
- NDArray
- Symbol
- Gluon
- Block
- HybridBlock
- Sequential
- HybridSequential
- SymbolBlock
- Dense
- Pooling
- Conv1D
- Conv2D
- Conv3D
- MaxPool1D
- MaxPool2D
- MaxPool3D
- Flatten
- L1Loss
- L2Loss
- SoftmaxCrossEntropyLoss
- Activation
- Trainer
- Parameter
- Constant