Skip to main content

A light weight deep learning framework

Project description

# Dandelion
[![License: MPL 2.0](https://img.shields.io/badge/License-MPL%202.0-brightgreen.svg)](https://github.com/david-leon/Dandelion/blob/master/LICENSE)
[![Python 3.x](https://img.shields.io/badge/python-3.x-brightgreen.svg)](https://www.python.org/downloads/release)
[![PyPI version](https://badge.fury.io/py/Dandelion.svg)](https://badge.fury.io/py/Dandelion)
[![Travis CI](https://travis-ci.org/david-leon/Dandelion.svg?branch=master)](https://travis-ci.org/david-leon/Dandelion)

A quite light weight deep learning framework, on top of Theano, offering better balance between flexibility and abstraction

## Targeted Users
Researchers who need flexibility as well as convenience to experiment all kinds of *nonstandard* network structures, and also the stability of Theano.

## Featuring
* **Aiming to offer better balance between flexibility and abstraction.**
* Easy to use and extend, support for any neural network structure.
* Loose coupling, each part of the framework can be modified independently.
* **More like a handy library of deep learning modules.**
* Common modules such as CNN, LSTM, GRU, Dense, Dropout, Batch Normalization, and common optimization methods such as SGD, Adam, Adadelta, Rmsprop are ready out-of-the-box.
* **Plug & play, operating directly on Theano tensors, no upper abstraction applied.**
* Unlike previous frameworks like Keras, Lasagne, etc., Dandelion operates directly on tensors instead of layer abstractions, making it quite easy to plug in 3rd part defined deep learning modules (layer defined by Keras/Lasagne) or vice versa.

## Documentation
Documentation is available online: [https://david-leon.github.io/Dandelion/](https://david-leon.github.io/Dandelion/)

## Install
Use pip channel for stable release
```
pip install dandelion --upgrade
```
or install from source to get the up-to-date version:
```
pip install git+https://github.com/david-leon/Dandelion.git
```

Dependency
* Theano >=1.0
* Scipy (required by `dandelion.ext.CV`)
* Pillow (required by `dandelion.ext.CV`)
* OpenCV (required by `dandelion.ext.CV`)

## Quick Tour
```python
import theano
import theano.tensor as tensor
from dandelion.module import *
from dandelion.update import *
from dandelion.functional import *
from dandelion.util import gpickle

class model(Module):
def __init__(self, batchsize=None, input_length=None, Nclass=6, noise=(0.5, 0.2, 0.7, 0.7, 0.7)):
super().__init__()
self.batchsize = batchsize
self.input_length = input_length
self.Nclass = Nclass
self.noise = noise

self.dropout0 = Dropout()
self.dropout1 = Dropout()
self.dropout2 = Dropout()
self.dropout3 = Dropout()
self.dropout4 = Dropout()
W = gpickle.load('word_embedding(6336, 256).gpkl')
self.embedding = Embedding(num_embeddings=6336, embedding_dim=256, W=W)
self.lstm0 = LSTM(input_dims=256, hidden_dim=100)
self.lstm1 = LSTM(input_dims=256, hidden_dim=100)
self.lstm2 = LSTM(input_dims=200, hidden_dim=100)
self.lstm3 = LSTM(input_dims=200, hidden_dim=100)
self.lstm4 = LSTM(input_dims=200, hidden_dim=100)
self.lstm5 = LSTM(input_dims=200, hidden_dim=100)
self.dense = Dense(input_dims=200, output_dim=Nclass)

def forward(self, x):
self.work_mode = 'train'
x = self.dropout0.forward(x, p=self.noise[0], rescale=False)
x = self.embedding.forward(x) # (B, T, D)

x = self.dropout1.forward(x, p=self.noise[1], rescale=True)
x = x.dimshuffle((1, 0, 2)) # (B, T, D) -> (T, B, D)
x_f = self.lstm0.forward(x, None, None, None)
x_b = self.lstm1.forward(x, None, None, None, backward=True)
x = tensor.concatenate([x_f, x_b], axis=2)

x = pool_1d(x, ws=2, ignore_border=True, mode='average_exc_pad', axis=0)

x = self.dropout2.forward(x, p=self.noise[2], rescale=True)
x_f = self.lstm2.forward(x, None, None, None)
x_b = self.lstm3.forward(x, None, None, None, backward=True)
x = tensor.concatenate([x_f, x_b], axis=2)

x = self.dropout3.forward(x, p=self.noise[3], rescale=True)
x_f = self.lstm4.forward(x, None, None, None, only_return_final=True)
x_b = self.lstm5.forward(x, None, None, None, only_return_final=True, backward=True)
x = tensor.concatenate([x_f, x_b], axis=1)

x = self.dropout4.forward(x, p=self.noise[4], rescale=True)
y = sigmoid(self.dense.forward(x))
return y

def predict(self, x):
self.work_mode = 'inference'
x = self.embedding.predict(x)

x = x.dimshuffle((1, 0, 2)) # (B, T, D) -> (T, B, D)
x_f = self.lstm0.predict(x, None, None, None)
x_b = self.lstm1.predict(x, None, None, None, backward=True)
x = tensor.concatenate([x_f, x_b], axis=2)

x = pool_1d(x, ws=2, ignore_border=True, mode='average_exc_pad', axis=0)

x_f = self.lstm2.predict(x, None, None, None)
x_b = self.lstm3.predict(x, None, None, None, backward=True)
x = tensor.concatenate([x_f, x_b], axis=2)

x_f = self.lstm4.predict(x, None, None, None, only_return_final=True)
x_b = self.lstm5.predict(x, None, None, None, only_return_final=True, backward=True)
x = tensor.concatenate([x_f, x_b], axis=1)

y = sigmoid(self.dense.predict(x))
return y
```

## Why Another DL Framework
* The reason is more about the lack of flexibility for existing DL frameworks, such as Keras, Lasagne, Blocks, etc.
* By **“flexibility”**, we means whether it is easy to modify or extend the framework.
* The famous DL framework Keras is designed to be beginner-friendly oriented, at the cost of being quite hard to modify.
* Compared to Keras, another less-famous framework Lasagne provides more flexibility. It’s easier to write your own layer by Lasagne for small neural network, however, for complex neural networks it still needs quite manual works because like other existing frameworks, Lasagne operates on abstracted ‘Layer’ class instead of raw tensor variables.

## Project Layout
Python Module | Explanation
----------------- | ----------------
module | all neual network module definitions
functional | operations on tensor with no parameter to be learned
initialization | initialization methods for neural network modules
activation | definition of all activation functions
objective | definition of all loss objectives
update | definition of all optimizers
util | utility functions
model | model implementations out-of-the-box
ext | extensions

## Credits
The design of Dandelion heavily draws on [Lasagne](https://github.com/Lasagne/Lasagne) and [Pytorch](http://pytorch.org/), both my favorate DL libraries.
Special thanks to **Radomir Dopieralski**, who transferred the `dandelion` project name on pypi to us. Now you can install the package by simply `pip install dandelion`.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Dandelion-0.17.14.tar.gz (84.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

Dandelion-0.17.14-py3-none-any.whl (103.4 kB view details)

Uploaded Python 3

File details

Details for the file Dandelion-0.17.14.tar.gz.

File metadata

  • Download URL: Dandelion-0.17.14.tar.gz
  • Upload date:
  • Size: 84.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.14.2 setuptools/27.2.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.5.6

File hashes

Hashes for Dandelion-0.17.14.tar.gz
Algorithm Hash digest
SHA256 65c1ab411e8d6de0ad9d326386fdca75802477d4d094f425706cd7584c24498f
MD5 313b91409e23db774840b3a9bb0ef1ec
BLAKE2b-256 5d42cb4344b6e8c58fae1fbbc7b52b1b3493a7429b8040ba79d8f3c4e342ee00

See more details on using hashes here.

File details

Details for the file Dandelion-0.17.14-py3-none-any.whl.

File metadata

  • Download URL: Dandelion-0.17.14-py3-none-any.whl
  • Upload date:
  • Size: 103.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.14.2 setuptools/27.2.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.5.6

File hashes

Hashes for Dandelion-0.17.14-py3-none-any.whl
Algorithm Hash digest
SHA256 714d0a3b62f92e8082828f9d51bb9ed9a5658dc54933446b9c1442784f2268f8
MD5 191e4604ba179467b8a9150ccfb661dd
BLAKE2b-256 29a4b4eb3f16145d8fa710948f9b1ceecc9b35ed6496b3b42055d9d1a9d5d170

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page