Custom Keras layers for implementing multi-dimensional recurrent neural networks (MDRNNs) described in Alex Graves's paper https://arxiv.org/pdf/0705.2011.pdf
MIT License
A library built on top of TensorFlow implementing the model described in Alex Graves's paper https://arxiv.org/pdf/0705.2011.pdf. The library comes with a set of custom Keras layers. Each layer can be seamlessly used in Keras to build a model and train it as usual.
This repository is in its early stages. The code presented here is not stable yet and it wasn't extensively tested. Use it at your own risk
Layers available now:
Layers currently under development (coming soon):
Additional features:
Install the package from PyPI:
pip install mdrnn
Alternatively, clone the repository and install dependencies:
git clone <repo_url>
cd <repo_directory>
pip install -r requirements.txt
Create a 2-dimensional RNN:
from mdrnn import MDRNN, MDLSTM, MultiDirectional
import numpy as np
import tensorflow as tf
rnn = MDRNN(units=16, input_shape=(5, 4, 10), activation='tanh', return_sequences=True)
output = rnn(np.zeros((1, 5, 4, 10)))
Build a Keras model consisting of 1 MDRNN layer and train it:
model = tf.keras.Sequential()
model.add(MDRNN(units=16, input_shape=(2, 3, 6), activation='tanh'))
model.add(tf.keras.layers.Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', metrics=['acc'])
model.summary()
x = np.zeros((10, 2, 3, 6))
y = np.zeros((10, 10,))
model.fit(x, y)
Similarly, create and train a multi-directional MDRNN
x = np.zeros((10, 2, 3, 6))
y = np.zeros((10, 40,))
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(2, 3, 6)))
model.add(MultiDirectional(MDRNN(10, input_shape=[2, 3, 6])))
model.compile(loss='categorical_crossentropy', metrics=['acc'])
model.summary()
model.fit(x, y, epochs=1)
Similarly, create and train a multi-directional multi-dimensional LSTM (MDLSTM)
x = np.zeros((10, 2, 3, 6))
y = np.zeros((10, 40,))
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(2, 3, 6)))
model.add(MultiDirectional(MDLSTM(10, input_shape=[2, 3, 6])))
model.compile(loss='categorical_crossentropy', metrics=['acc'])
model.summary()
model.fit(x, y, epochs=1)
[1] A. Graves, S. Ferńandez, and J. Schmidhuber. Multidimensional recurrent neural networks.
[2] A. Graves and J. Schmidhuber. Offline Handwriting Recognition with Multidimensional Recurrent Neural Networks.
If you find this repository useful, consider starring it by clicking at the ★ button. It would be much appreciated.