commit 5589a8af8967cfc73d3b6fda8f86acc0d08172b8
parent 1b199b0fd068dcbe2502a613caff3a1c322f73e1
Author: Alex Auvolat <alex.auvolat@ens.fr>
Date:   Fri, 24 Apr 2015 15:12:17 -0400
Add simple unfinished blocks model
Diffstat:
5 files changed, 116 insertions(+), 4 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -55,3 +55,6 @@ docs/_build/
 
 # PyBuilder
 target/
+
+# Vim tmpfiles
+*.swp
diff --git a/__init__.py b/__init__.py
diff --git a/data/test.csv b/data/test.csv
@@ -1 +0,0 @@
-/data/lisatmp3/auvolat/taxikaggle/test.csv-
\ No newline at end of file
diff --git a/data/train.csv b/data/train.csv
@@ -1 +0,0 @@
-/data/lisatmp3/auvolat/taxikaggle/train.csv-
\ No newline at end of file
diff --git a/model.py b/model.py
@@ -0,0 +1,113 @@
+import logging
+import os
+from argparse import ArgumentParser
+
+from theano import tensor
+from theano.ifelse import ifelse
+
+from blocks.bricks import MLP, Rectifier, Linear
+from blocks.bricks.lookup import LookupTable
+
+from blocks.initialization import IsotropicGaussian, Constant
+from blocks.model import Model
+
+from fuel.transformers import Batch
+from fuel.streams import DataStream
+from fuel.schemes import ConstantScheme
+
+from blocks.algorithms import GradientDescent, Scale
+from blocks.graph import ComputationGraph
+from blocks.main_loop import MainLoop
+from blocks.extensions import Printing
+from blocks.extensions.saveload import Dump, LoadFromDump
+from blocks.extensions.monitoring import DataStreamMonitoring
+
+import data
+
+n_dow = 7       # number of division for dayofweek/dayofmonth/hourofday
+n_dom = 31
+n_hour = 24
+
+n_clients = 57106
+n_stands = 63
+n_embed = n_clients + n_stands  # embeddings capturing local parameters
+
+n_begin_pts = 5     # how many points we consider at the beginning and end of the known trajectory
+n_end_pts = 5
+
+dim_embed = 50
+dim_hidden = 200
+
+learning_rate = 0.1
+batch_size = 32
+
+def main():
+    # The input and the targets
+    x_firstk = tensor.matrix('first_k')
+    x_lastk = tensor.matrix('last_k')
+    x_client = tensor.lmatrix('client')
+    y = tensor.vector('targets')
+
+    # Define the model
+    client_embed_table = LookupTable(length=n_clients, dim=dim_embed, name='lookup')
+    hidden_layer = MLP(activations=[Rectifier()],
+                       dims=[(n_begin_pts + n_end_pts) * 2 + dim_embed, dim_hidden])
+    output_layer = Linear(input_dim=dim_hidden, output_dim=2)
+
+    # Create the Theano variables
+
+    client_embed = client_embed_table.apply(x_client).flatten(ndim=2)
+    inputs = tensor.concatenate([x_firstk, x_lastk, client_embed], axis=1)
+    hidden = hidden_layer.apply(inputs)
+    outputs = output_layer.apply(hidden)
+
+    # Calculate the cost
+    cost = (outputs - y).norm(2, axis=1).mean()
+
+    # Initialization
+    client_embed_table.weights_init = IsotropicGaussian(0.001)
+    hidden_layer.weights_init = IsotropicGaussian(0.01)
+    hidden_layer.biases_init = Constant(0.001)
+    output_layer.weights_init = IsotropicGaussian(0.001)
+    output_layer.biases_init = Constant(0.001)
+
+    client_embed_table.initialize()
+    hidden_layer.initialize()
+    output_layer.initialize()
+
+    # Load the training and test data
+    train = data.train_data
+    stream = DataStream(train)
+    train_stream = Batch(stream, iteration_scheme=ConstantScheme(batch_size))
+
+    # valid = data.valid_data
+    # stream = DataStream(valid)
+    # valid_stream = Batch(stream, iteration_scheme=ConstantScheme(batch_size))
+    valid_stream = train_stream
+
+    # Training
+    cg = ComputationGraph(cost)
+    algorithm = GradientDescent(
+        cost=cost,
+        # step_rule=AdaDelta(decay_rate=0.5),
+        step_rule=Scale(learning_rate=learning_rate),
+        params=cg.parameters)
+
+    extensions=[DataStreamMonitoring([cost], valid_stream,
+                                     prefix='valid',
+                                     every_n_batches=100),
+                    Printing(every_n_batches=100),
+                    Dump('ngram_blocks_model', every_n_batches=100),
+                    LoadFromDump('ngram_blocks_model')]
+
+    main_loop = MainLoop(
+        model=Model([cost]),
+        data_stream=train_stream,
+        algorithm=algorithm,
+        extensions=extensions)
+    main_loop.run()
+
+if __name__ == "__main__":
+    logging.basicConfig(level=logging.INFO)
+    main()
+