hands-on lab: deep learning with the theano python library · introduction theano models exercices...
TRANSCRIPT
Hands-on Lab: Deep Learning with the TheanoPython Library
Frédéric Bastien
Département d'Informatique et de Recherche OpérationnelleUniversité de MontréalMontréal, Canada
Presentation prepared with Pierre Luc Carrier and Arnaud Bergeron
GTC 2015
IntroductionTheanoModels
Exercices
Slides
I PDF of the slides: http://goo.gl/bcBeBV
I github repo of this presentationhttps://github.com/nouiz/gtc2015/
2 / 56
IntroductionTheanoModels
Exercices
Introduction
TheanoCompiling/RunningModifying expressionsGPUDebugging
ModelsLogistic RegressionConvolution
Exercices
3 / 56
IntroductionTheanoModels
Exercices
High level
Python <- {NumPy/SciPy/libgpuarray} <- Theano <- {...}
I Python: OO coding language
I Numpy: n-dimensional array object and scienti�c computingtoolbox
I SciPy: sparse matrix objects and more scienti�c computingfunctionality
I libgpuarray: GPU n-dimensional array object in C for CUDAand OpenCL
I Theano: compiler/symbolic graph manipulation
1 / 56
IntroductionTheanoModels
Exercices
High level (2)
Many [machine learning] library build on top of Theano
I Pylearn2
I blocks
I PyMC 3
I lasagne
I sklearn-theano: Easy deep learning by combining Theano andsklearn.
I theano-rnn
I Morb
I ...
2 / 56
IntroductionTheanoModels
Exercices
Some models build with Theano
Some models that have been build with Theano.
I Neural Networks
I Convolutional Neural Networks
I RNN, RNN CTC, LSTM
I NADE, RNADE
I Autoencoders
I Alex Net's
I GoogleLeNet
I Overfeat
I Generative Adverserial Nets
I SVMs
I many variations of above models and more
3 / 56
IntroductionTheanoModels
Exercices
Python
I General-purpose high-level OO interpreted language
I Emphasizes code readability
I Comprehensive standard library
I Dynamic type and memory management
I Easily extensible with C
I Slow execution
I Popular in web development and scienti�c communities
4 / 56
IntroductionTheanoModels
Exercices
NumPy/SciPy
I NumPy provides an n-dimensional numeric array in PythonI Perfect for high-performance computingI Slices of arrays are views (no copying)
I NumPy providesI Elementwise computationsI Linear algebra, Fourier transformsI Pseudorandom number generators (many distributions)
I SciPy provides lots more, includingI Sparse matricesI More linear algebraI Solvers and optimization algorithmsI Matlab-compatible I/OI I/O and signal processing for images and audio
5 / 56
IntroductionTheanoModels
Exercices
What's missing?
I Non-lazy evaluation (required by Python) hurts performance
I Bound to the CPU
I Lacks symbolic or automatic di�erentiation
I No automatic speed and stability optimization
6 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Introduction
TheanoCompiling/RunningModifying expressionsGPUDebugging
ModelsLogistic RegressionConvolution
Exercices
8 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Description
High-level domain-speci�c language for numeric computation.
I Syntax as close to NumPy as possible
I Compiles most common expressions to C for CPU and/or GPU
I Limited expressivity means more opportunities foroptimizations
I Strongly typed -> compiles to CI Array oriented -> easy parallelismI Support for looping and branching in expressionsI No subroutines -> global optimization
I Automatic speed and numerical stability optimizations
9 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Description (2)
I Automatic di�erentiation and R op (Hessian FreeOptimization)
I Sparse matrices (CPU only)
I Can reuse other technologies for best performanceI BLAS, SciPy, CUDA, PyCUDA, Cython, Numba, PyCUDA, ...
I Extensive unit-testing and self-veri�cation
I Extensible (You can create new operations as needed)
I Works on Linux, OS X and Windows
10 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Project status?
I Mature: Theano has been developed and used since January2008 (7 yrs old)
I Driven hundreds research papers
I Good user documentation
I Active mailing list with participants from outside our institute
I Core technology for Silicon-Valley start-ups
I Many contributors (some from outside our institute)
I Used to teach many university classes
I Has been used for research at big compagnies
Theano: deeplearning.net/software/theano/Deep Learning Tutorials: deeplearning.net/tutorial/
11 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Simple example
import theano# de c l a r e s ymbo l i c v a r i a b l ea = theano . t e n s o r . v e c t o r ( "a" )
# bu i l d s ymbo l i c e x p r e s s i o nb = a + a ∗∗ 10
# comp i l e f u n c t i o nf = theano . f u n c t i o n ( [ a ] , b )
# Execute w i th nume r i c a l v a l u epr in t f ( [ 0 , 1 , 2 ] )# p r i n t s ` a r r a y ( [ 0 , 2 , 1026 ] ) `
12 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Simple example
13 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Overview of Library
Theano is many things
I Language
I Compiler
I Python library
14 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Scalar math
Some example of scalar operations:
import theanofrom theano import t e n s o r as Tx = T. s c a l a r ( )y = T. s c a l a r ( )z = x + yw = z ∗ xa = T. s q r t (w)b = T. exp ( a )c = a ∗∗ bd = T. l o g ( c )
15 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Vector math
from theano import t e n s o r as Tx = T. v e c t o r ( )y = T. v e c t o r ( )# Sca l a r math a p p l i e d e l emen tw i s ea = x ∗ y# Vector dot p roduc tb = T. dot ( x , y )# Broadca s t i ng ( as NumPy , v e r y powe r f u l )c = a + b
16 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Matrix math
from theano import t e n s o r as Tx = T. mat r i x ( )y = T. mat r i x ( )a = T. v e c t o r ( )# Matr ix−mat r i x p roduc tb = T. dot ( x , y )# Matr ix−v e c t o r p roduc tc = T. dot ( x , a )
17 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Tensors
Using Theano:
I Dimensionality de�ned by length of �broadcastable� argument
I Can add (or do other elemwise op) two tensors with samedimensionality
I Duplicate tensors along broadcastable axes to make size match
from theano import t e n s o r as Tt en s o r 3 = T. TensorType (
b r o a d c a s t a b l e=(Fa l s e , Fa l s e , F a l s e ) ,dtype=' f l o a t 3 2 ' )
x = T. t e n s o r 3 ( )
18 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Reductions
from theano impor t t e n s o r as Tt en s o r 3 = T. TensorType (
b r o a d c a s t a b l e=(Fa l s e , Fa l s e , F a l s e ) ,dtype=' f l o a t 3 2 ' )
x = t en s o r 3 ( )
t o t a l = x . sum ( )ma r g i n a l s = x . sum( a x i s =(0 , 2 ) )mx = x .max( a x i s =1)
19 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Dimshu�e
from theano impor t t e n s o r as Tt en s o r 3 = T. TensorType (
b r o a d c a s t a b l e=(Fa l s e , Fa l s e , F a l s e ) )x = t en s o r 3 ( )
y = x . d im s h u f f l e ( ( 2 , 1 , 0 ) )a = T. mat r i x ( )
b = a .T# Same as bc = a . d im s h u f f l e ( ( 0 , 1 ) )
# Adding to l a r g e r t e n s o rd = a . d im s h u f f l e ( ( 0 , 1 , ' x ' ) )e = a + d
20 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Indexing
As NumPy! This mean slices and index selection return view
# r e t u r n v iews , suppo r t ed on GPUa_tensor [ i n t ]a_tensor [ i n t , i n t ]a_tensor [ s t a r t : s top : s tep , s t a r t : s top : s t e p ]a_tensor [ : : −1 ] # r e v e r s e the f i r s t d imens ion
# Advanced i nde x i ng , r e t u r n copya_tensor [ an_index_vector ] # Supported on GPUa_tensor [ an_index_vector , an_index_vector ]a_tensor [ i n t , an_index_vector ]a_tensor [ an_index_tensor , . . . ]
21 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Compiling and running expression
I theano.function
I shared variables and updates
I compilation modes
22 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
theano.function
>>> from theano import t e n s o r as T>>> x = T. s c a l a r ( )>>> y = T. s c a l a r ( )>>> from theano import f u n c t i o n>>> # f i r s t a rg i s l i s t o f SYMBOLIC i n p u t s>>> # second arg i s SYMBOLIC output>>> f = f u n c t i o n ( [ x , y ] , x + y )>>> # Ca l l i t w i th NUMERICAL v a l u e s>>> # Get a NUMERICAL output>>> f ( 1 . , 2 . )a r r a y ( 3 . 0 )
23 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Shared variables
I It's hard to do much with purely functional programming
I �shared variables� add just a little bit of imperativeprogramming
I A �shared variable� is a bu�er that stores a numerical value fora Theano variable
I Can write to as many shared variables as you want, once each,at the end of the function
I Can modify value outside of Theano function with get_value()and set_value() methods.
24 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Shared variable example
>>> from theano import sha r ed>>> x = sha r ed ( 0 . )>>> from theano . compat . python2x import Orde redDic t>>> update s = [ ( x , x + 1 ) ]>>> f = f u n c t i o n ( [ ] , update s=update s )>>> f ( )>>> x . get_va lue ( )1 . 0>>> x . s e t_va lue ( 1 0 0 . )>>> f ( )>>> x . get_va lue ( )101 .0
25 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Compilation modes
I Can compile in di�erent modes to get di�erent kinds ofprograms
I Can specify these modes very precisely with arguments totheano.function
I Can use a few quick presets with environment variable �ags
26 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Example preset compilation modes
I FAST_RUN: default. Fastest execution, slowest compilation
I FAST_COMPILE: Fastest compilation, slowest execution. NoC code.
I DEBUG_MODE: Adds lots of checks. Raises error messagesin situations other modes regard as �ne.
I optimizer=fast_compile: as mode=FAST_COMPILE, butwith C code.
I theano.function(..., mode=�FAST_COMPILE�)
I THEANO_FLAGS=mode=FAST_COMPILE python script.py
27 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Modifying expressions
There are �macro� that automatically build bigger graph for you.
I theano.grad
I Others
Those functions can get called many times, for example to get the2nd derivative.
28 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
The grad method
>>> x = T. s c a l a r ( ' x ' )>>> y = 2 . ∗ x>>> g = T. grad ( y , x )# Pr i n t the not op t im i z ed graph>>> theano . p r i n t i n g . p y d o t p r i n t ( g )
29 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
The grad method
>>> x = T. s c a l a r ( ' x ' )>>> y = 2 . ∗ x>>> g = T. grad ( y , x )
# Pr i n t the op t im i z ed graph>>> f = theano . f u n c t i o n ( [ x ] , g )>>> theano . p r i n t i n g . p y d o t p r i n t ( f )
30 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Others
I R_op, L_op for Hessian Free Optimization
I hessian
I jacobian
I clone the graph with replacement
I you can navigate the graph if you need (go from the result ofcomputation to its input, recursively)
31 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Enabling GPU
I Theano's current back-end only supports 32 bit on GPU
I libgpuarray (new-backend) supports all dtype
I CUDA supports 64 bit, but it is slow on gamer GPUs
32 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
GPU: Theano �ags
Theano �ags allow to con�gure Theano. Can be set via acon�guration �le or an environment variable.To enable GPU:
I Set �device=gpu� (or a speci�c gpu, like �gpu0�)
I Set ��oatX=�oat32�
I Optional: warn_�oat64={'ignore', 'warn', 'raise', 'pdb'}
33 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
�oatX
Allow to change the dtype between �oat32 and �oat64.
I T.fscalar, T.fvector, T.fmatrix are all 32 bit
I T.dscalar, T.dvector, T.dmatrix are all 64 bit
I T.scalar, T.vector, T.matrix resolve to �oatX
I �oatX is �oat64 by default, set it to �oat32 for GPU
34 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
CuDNN
I R1 and R2 is supported.
I It is enabled automatically if available.
I Theano �ag to get an error if can't be used:�optimizer_including=cudnn�
35 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Debugging
I DEBUG_MODE
I Error message
I theano.printing.debugprint
36 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Error message: code
import numpy as npimport theanoimport theano . t e n s o r as Tx = T. v e c t o r ( )y = T. v e c t o r ( )z = x + xz = z + yf = theano . f u n c t i o n ( [ x , y ] , z )f ( np . ones ( ( 2 , ) ) , np . ones ( ( 3 , ) ) )
37 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Error message: 1st part
Traceback (most r e c e n t c a l l l a s t ) :[ . . . ]Va l u eE r r o r : I npu t d imens ion mis−match .
( i n pu t [ 0 ] . shape [ 0 ] = 3 , i n pu t [ 1 ] . shape [ 0 ] = 2)Apply node tha t caused the e r r o r :
E lemwise {add , no_inp lace }(<TensorType ( f l o a t 6 4 , v e c t o r )>,<TensorType ( f l o a t 6 4 , v e c t o r )>,<TensorType ( f l o a t 6 4 , v e c t o r )>)
I n pu t s t yp e s : [ TensorType ( f l o a t 6 4 , v e c t o r ) ,TensorType ( f l o a t 6 4 , v e c t o r ) ,TensorType ( f l o a t 6 4 , v e c t o r ) ]
I n pu t s shapes : [ ( 3 , ) , ( 2 , ) , ( 2 , ) ]I n pu t s s t r i d e s : [ ( 8 , ) , ( 8 , ) , ( 8 , ) ]I n pu t s s c a l a r v a l u e s : [ ' not s c a l a r ' , ' not s c a l a r ' , ' not s c a l a r ' ]
38 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Error message: 2st part
HINT: Re-running with most Theano optimization disabled couldgive you a back-traces when this node was created. This can bedone with by setting the Theano �ags �optimizer=fast_compile�. Ifthat does not work, Theano optimizations can be disabled with�optimizer=None�.HINT: Use the Theano �ag �exception_verbosity=high� for adebugprint of this apply node.
39 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Error message: Traceback
Traceback (most r e c e n t c a l l l a s t ) :F i l e " t e s t . py" , l i n e 9 , i n <module>
f ( np . ones ( ( 2 , ) ) , np . ones ( ( 3 , ) ) )F i l e "/u/ b a s t i e n f / r epo s / theano / comp i l e / funct ion_module . py" ,
l i n e 589 , i n __call__s e l f . f n . thunks [ s e l f . f n . p o s i t i o n_o f_e r r o r ] )
F i l e "/u/ b a s t i e n f / r epo s / theano / comp i l e / funct ion_module . py" ,l i n e 579 , i n __call__
outpu t s = s e l f . f n ( )
40 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
Error message: optimizer=fast_compile
Backt race when the node i s c r e a t e d :F i l e " t e s t . py" , l i n e 7 , in <module>
z = z + y
41 / 56
IntroductionTheanoModels
Exercices
Compiling/RunningModifying expressionsGPUDebugging
debugprint
>>> from theano . p r i n t i n g import debugp r i n t>>> debugp r i n t ( a )Elemwise {mul , no_inp lace } [@A] ' '| TensorConstant {2 .0} [@B]| E lemwise {add , no_inp lace } [@C] ' z '
|<TensorType ( f l o a t 6 4 , s c a l a r )> [@D]|<TensorType ( f l o a t 6 4 , s c a l a r )> [@E ]
42 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Introduction
TheanoCompiling/RunningModifying expressionsGPUDebugging
ModelsLogistic RegressionConvolution
Exercices
43 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Inputs
# Load from d i s k and put i n sha r ed v a r i a b l e .d a t a s e t s = load_data ( d a t a s e t )t ra in_set_x , t ra in_set_y = da t a s e t s [ 0 ]va l id_set_x , va l i d_set_y = da t a s e t s [ 1 ]
# a l l o c a t e s ymbo l i c v a r i a b l e s f o r the datai n d e x = T. l s c a l a r ( ) # index to a [ m in i ] batch
# gene r a t e s ymbo l i c v a r i a b l e s f o r i n pu t m in i ba t chx = T. mat r i x ( ' x ' ) # data , 1 row pe r imagey = T. i v e c t o r ( ' y ' ) # l a b e l s
44 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Model
n_in = 28 ∗ 28n_out = 10
# we igh t sW = theano . sha r ed (
numpy . z e r o s ( ( n_in , n_out ) ,dtype=theano . c o n f i g . f l o a tX ) )
# b i a sb = theano . sha r ed (
numpy . z e r o s ( ( n_out , ) ,d type=theano . c o n f i g . f l o a tX ) )
45 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Computation
# the fo rwa rd pas sp_y_given_x = T. nnet . so f tmax (T. dot ( input , W) + b )
# cos t we min im ize : the n e g a t i v e l o g l i k e l i h o o dl = T. l o g ( p_y_given_x )co s t = −T. mean ( l [T . a range ( y . shape [ 0 ] ) , y ] )
# the e r r o ry_pred = T. argmax ( p_y_given_x , a x i s =1)e r r = T. mean (T. neq ( y_pred , y ) )
46 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Gradient and Updates
# compute the g r a d i e n t o f c o s tg_W, g_b = T. grad ( c o s t=cost , wrt=(W, b ) )
# model pa ramete r s update s r u l e supdate s = [ (W, W − l e a r n i n g_ r a t e ∗ g_W) ,
(b , b − l e a r n i n g_ r a t e ∗ g_b ) ]
47 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Training Function
# comp i l e a Theano f u n c t i o n tha t t r a i n the modelt ra in_mode l = theano . f u n c t i o n (
i n p u t s =[ i nd e x ] , ou tpu t s=(cost , e r r ) ,update s=updates ,g i v e n s={
x : t ra in_set_x [ i nd e x ∗ batch_s i z e :( i n d e x + 1) ∗ batch_s i z e ] ,
y : t ra in_set_y [ i nd e x ∗ batch_s i z e :( i n d e x + 1) ∗ batch_s i z e ]
})
48 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Introduction
TheanoCompiling/RunningModifying expressionsGPUDebugging
ModelsLogistic RegressionConvolution
Exercices
49 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Inputs
# Load from d i s k and put i n sha r ed v a r i a b l e .d a t a s e t s = load_data ( d a t a s e t )t ra in_set_x , t ra in_set_y = da t a s e t s [ 0 ]va l id_set_x , va l i d_set_y = da t a s e t s [ 1 ]
# a l l o c a t e s ymbo l i c v a r i a b l e s f o r the datai n d e x = T. l s c a l a r ( ) # index to a [ m in i ] batch
x = T. mat r i x ( ' x ' ) # the data , 1 row pe r imagey = T. i v e c t o r ( ' y ' ) # l a b e l s
# Reshape mat r i x o f r a s t e r i z e d images o f shape ( batch_s ize , 28 ∗ 28)# to a 4D ten so r , compa t i b l e f o r c o n v o l u t i o nl a y e r 0_ i npu t = x . r e shape ( ( batch_s ize , 1 , 28 , 28) )
50 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Model
image_shape=(batch_s ize , 1 , 28 , 28) ,f i l t e r_ s h a p e=(nke rn s [ 0 ] , 1 , 5 , 5 ) ,
W_bound = . . .W = theano . sha r ed (
numpy . a s a r r a y (rng . un i f o rm ( low=−W_bound , h igh=W_bound ,
s i z e=f i l t e r_ s h a p e ) ,dtype=theano . c o n f i g . f l o a tX ) ,
)
# the b i a s i s a 1D t e n s o r −− one b i a s pe r output f e a t u r e mapb_values = numpy . z e r o s ( ( f i l t e r_ s h a p e [ 0 ] , ) , d type = . . .b = theano . sha r ed ( b_values )
51 / 56
IntroductionTheanoModels
Exercices
Logistic RegressionConvolution
Computation
# convo l v e i n pu t f e a t u r e maps w i th f i l t e r sconv_out = conv . conv2d ( i n pu t=x , f i l t e r s=W)
# downsample each f e a t u r e map i n d i v i d u a l l y , u s i n g maxpoo l ingpooled_out = downsample . max_pool_2d (
i n pu t=conv_out ,ds=(2 , 2 ) , // p o o l s i z ei gno r e_bo rde r=True )
output = T. tanh ( pooled_out +b . d im s h u f f l e ( ' x ' , 0 , ' x ' , ' x ' ) )
52 / 56
IntroductionTheanoModels
Exercices
Introduction
TheanoCompiling/RunningModifying expressionsGPUDebugging
ModelsLogistic RegressionConvolution
Exercices
53 / 56
IntroductionTheanoModels
Exercices
ipython notebook
I Introduction
I Exercices (Theano only exercices)
I lenet (small CNN model to quickly try it)
54 / 56
IntroductionTheanoModels
Exercices
Connection instructions
I Navigate to nvlabs.qwiklab.com
I Login or create a new account
I Select the �Instructor-Led Hands-on Labs� class
I Find the lab called �Theano� and click Start
I After a short wait, lab instance connection information will beshown
I Please ask Lab Assistants for help!
55 / 56
IntroductionTheanoModels
Exercices
Questions, Acknowledgments
Questions?
Acknowledgments
I All people working or having worked at the LISA lab/MILAinstitute
I All Theano users/contributors
I Compute Canada, RQCHP, NSERC, and Canada ResearchChairs for providing funds or access to compute resources.
56 / 56