Search code examples
numpytheanoflattenconv-neural-network

Clarification about flatten function in Theano


in [http://deeplearning.net/tutorial/lenet.html#lenet] it says:

This will generate a matrix of shape (batch_size, nkerns[1] * 4 * 4),
# or (500, 50 * 4 * 4) = (500, 800) with the default values.
layer2_input = layer1.output.flatten(2)

when I use flatten function on a numpy 3d array I get a 1D array. but here it says I get a matrix. How does flatten(2) work in theano?

A similar example on numpy produces 1D array:

     a= array([[[ 1,  2,  3],
    [ 4,  5,  6],
    [ 7,  8,  9]],

   [[10, 11, 12],
    [13, 14, 15],
    [16, 17, 18]],

   [[19, 20, 21],
    [22, 23, 24],
    [25, 26, 27]]])

   a.flatten(2)=array([ 1, 10, 19,  4, 13, 22,  7, 16, 25,  2, 11, 20,  5, 14, 23,  8, 17,
   26,  3, 12, 21,  6, 15, 24,  9, 18, 27])

Solution

  • numpy doesn't support flattening only some dimensions but Theano does.

    So if a is a numpy array, a.flatten(2) doesn't make any sense. It runs without error but only because the 2 is passed as the order parameter which seems to cause numpy to stick with the default order of C.

    Theano's flatten does support axis specification. The documentation explains how it works.

    Parameters:
        x (any TensorVariable (or compatible)) – variable to be flattened
        outdim (int) – the number of dimensions in the returned variable
    
    Return type:
        variable with same dtype as x and outdim dimensions
    
    Returns:
        variable with the same shape as x in the leading outdim-1 dimensions,
        but with all remaining dimensions of x collapsed into the last dimension.
    

    For example, if we flatten a tensor of shape (2, 3, 4, 5) with flatten(x, outdim=2), then we’ll have the same (2-1=1) leading dimensions (2,), and the remaining dimensions are collapsed. So the output in this example would have shape (2, 60).

    A simple Theano demonstration:

    import numpy
    import theano
    import theano.tensor as tt
    
    
    def compile():
        x = tt.tensor3()
        return theano.function([x], x.flatten(2))
    
    
    def main():
        a = numpy.arange(2 * 3 * 4).reshape((2, 3, 4))
        f = compile()
        print a.shape, f(a).shape
    
    
    main()
    

    prints

    (2L, 3L, 4L) (2L, 12L)