sparse.sandbox – Sparse Op Sandbox — PyTensor dev documentation (original) (raw)

API#

Convolution-like operations with sparse matrix multiplication.

To read about different sparse formats, see U{http://www-users.cs.umn.edu/~saad/software/SPARSKIT/paper.ps}.

@todo: Automatic methods for determining best sparse format?

class pytensor.sparse.sandbox.sp.ConvolutionIndices[source]#

Build indices for a sparse CSC matrix that could implement A (convolve) B.

This generates a sparse matrix M, which generates a stack of image patches when computing the dot product of M with image patch. Convolution is then simply the dot product of (img x M) and the kernels.

static evaluate(inshp, kshp, strides=(1, 1), nkern=1, mode='valid', ws=True)[source]#

Build a sparse matrix which can be used for performing… * convolution: in this case, the dot product of this matrix with the input images will generate a stack of images patches. Convolution is then a tensordot operation of the filters and the patch stack. * sparse local connections: in this case, the sparse matrix allows us to operate the weight matrix as if it were fully-connected. The structured-dot with the input image gives the output for the following layer.

Parameters:

Return type:

tuple(indices, indptr, logical_shape, sp_type, out_img_shp)

Returns:

the structure of a sparse matrix, and the logical dimensions of the image which will be the result of filtering.

perform(node, inputs, outputs)[source]#

Calculate the function on the inputs and put the variables in the output storage.

Parameters:

Notes

The output_storage list might contain data. If an element of output_storage is not None, it has to be of the right type, for instance, for a TensorVariable, it has to be a NumPy ndarraywith the right number of dimensions and the correct dtype. Its shape and stride pattern can be arbitrary. It is not guaranteed that such pre-set values were produced by a previous call to this Op.perform(); they could’ve been allocated by anotherOp’s perform method. An Op is free to reuse output_storage as it sees fit, or to discard it and allocate new memory.

pytensor.sparse.sandbox.sp.convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None, mode='valid', flatten=True)[source]#

Convolution implementation by sparse matrix multiplication.

Note:

For best speed, put the matrix which you expect to be smaller as the ‘kernel’ argument

“images” is assumed to be a matrix of shape batch_size x img_size, where the second dimension represents each image in raster order

If flatten is “False”, the output feature map will have shape:

batch_size x number of kernels x output_size

If flatten is “True”, the output feature map will have shape:

batch_size x number of kernels * output_size

Note

IMPORTANT: note that this means that each feature map (image generate by each kernel) is contiguous in memory. The memory layout will therefore be: [ <feature_map_0> <feature_map_1> … <feature_map_n>], where <feature_map> represents a “feature map” in raster order

kerns is a 2D tensor of shape nkern x N.prod(kshp)

Parameters:

Returns:

out1, symbolic result

Returns:

out2, logical shape of the output img (nkern,height,width)

TODO:

test for 1D and think of how to do n-d convolutions

pytensor.sparse.sandbox.sp.max_pool(images, imgshp, maxpoolshp)[source]#

Implements a max pooling layer

Takes as input a 2D tensor of shape batch_size x img_size and performs max pooling. Max pooling downsamples by taking the max value in a given area, here defined by maxpoolshp. Outputs a 2D tensor of shape batch_size x output_size.

Parameters:

Returns:

out1, symbolic result (2D tensor)

Returns:

out2, logical shape of the output

class pytensor.sparse.sandbox.sp2.Binomial(format, dtype)[source]#

Return a sparse matrix having random values from a binomial density having number of experiment n and probability of successp.

WARNING: This Op is NOT deterministic, as calling it twice with the same inputs will NOT give the same result. This is a violation of PyTensor’s contract for Ops

Parameters:

Returns:

A sparse matrix of integers representing the number of success.

grad(inputs, gout)[source]#

Construct a graph for the gradient with respect to each input variable.

Each returned Variable represents the gradient with respect to that input computed based on the symbolic gradients with respect to each output. If the output is not differentiable with respect to an input, then this method should return an instance of type NullType for that input.

Using the reverse-mode AD characterization given in [1]_, for a\(C = f(A, B)\) representing the function implemented by the Opand its two arguments \(A\) and \(B\), given by theVariables in inputs, the values returned by Op.grad represent the quantities \(\bar{A} \equiv \frac{\partial S_O}{A}\) and\(\bar{B}\), for some scalar output term \(S_O\) of \(C\)in

\[\operatorname{Tr}\left(\bar{C}^\top dC\right) = \operatorname{Tr}\left(\bar{A}^\top dA\right) + \operatorname{Tr}\left(\bar{B}^\top dB\right)\]

Parameters:

Returns:

The gradients with respect to each Variable in inputs.

Return type:

grads

References

make_node(n, p, shape)[source]#

Construct an Apply node that represent the application of this operation to the given inputs.

This must be implemented by sub-classes.

Returns:

node – The constructed Apply node.

Return type:

Apply

perform(node, inputs, outputs)[source]#

Calculate the function on the inputs and put the variables in the output storage.

Parameters:

Notes

The output_storage list might contain data. If an element of output_storage is not None, it has to be of the right type, for instance, for a TensorVariable, it has to be a NumPy ndarraywith the right number of dimensions and the correct dtype. Its shape and stride pattern can be arbitrary. It is not guaranteed that such pre-set values were produced by a previous call to this Op.perform(); they could’ve been allocated by anotherOp’s perform method. An Op is free to reuse output_storage as it sees fit, or to discard it and allocate new memory.

class pytensor.sparse.sandbox.sp2.Multinomial[source]#

Return a sparse matrix having random values from a multinomial density having number of experiment n and probability of successp.

WARNING: This Op is NOT deterministic, as calling it twice with the same inputs will NOT give the same result. This is a violation of PyTensor’s contract for Ops

Parameters:

Returns:

A sparse matrix of random integers from a multinomial density for each row.

Note:

It will works only if p have csr format.

grad(inputs, outputs_gradients)[source]#

Construct a graph for the gradient with respect to each input variable.

Each returned Variable represents the gradient with respect to that input computed based on the symbolic gradients with respect to each output. If the output is not differentiable with respect to an input, then this method should return an instance of type NullType for that input.

Using the reverse-mode AD characterization given in [1]_, for a\(C = f(A, B)\) representing the function implemented by the Opand its two arguments \(A\) and \(B\), given by theVariables in inputs, the values returned by Op.grad represent the quantities \(\bar{A} \equiv \frac{\partial S_O}{A}\) and\(\bar{B}\), for some scalar output term \(S_O\) of \(C\)in

\[\operatorname{Tr}\left(\bar{C}^\top dC\right) = \operatorname{Tr}\left(\bar{A}^\top dA\right) + \operatorname{Tr}\left(\bar{B}^\top dB\right)\]

Parameters:

Returns:

The gradients with respect to each Variable in inputs.

Return type:

grads

References

make_node(n, p)[source]#

Construct an Apply node that represent the application of this operation to the given inputs.

This must be implemented by sub-classes.

Returns:

node – The constructed Apply node.

Return type:

Apply

perform(node, inputs, outputs)[source]#

Calculate the function on the inputs and put the variables in the output storage.

Parameters:

Notes

The output_storage list might contain data. If an element of output_storage is not None, it has to be of the right type, for instance, for a TensorVariable, it has to be a NumPy ndarraywith the right number of dimensions and the correct dtype. Its shape and stride pattern can be arbitrary. It is not guaranteed that such pre-set values were produced by a previous call to this Op.perform(); they could’ve been allocated by anotherOp’s perform method. An Op is free to reuse output_storage as it sees fit, or to discard it and allocate new memory.

class pytensor.sparse.sandbox.sp2.Poisson[source]#

Return a sparse having random values from a Poisson density with mean from the input.

WARNING: This Op is NOT deterministic, as calling it twice with the same inputs will NOT give the same result. This is a violation of PyTensor’s contract for Ops

Parameters:

x – Sparse matrix.

Returns:

A sparse matrix of random integers of a Poisson density with mean of x element wise.

grad(inputs, outputs_gradients)[source]#

Construct a graph for the gradient with respect to each input variable.

Each returned Variable represents the gradient with respect to that input computed based on the symbolic gradients with respect to each output. If the output is not differentiable with respect to an input, then this method should return an instance of type NullType for that input.

Using the reverse-mode AD characterization given in [1]_, for a\(C = f(A, B)\) representing the function implemented by the Opand its two arguments \(A\) and \(B\), given by theVariables in inputs, the values returned by Op.grad represent the quantities \(\bar{A} \equiv \frac{\partial S_O}{A}\) and\(\bar{B}\), for some scalar output term \(S_O\) of \(C\)in

\[\operatorname{Tr}\left(\bar{C}^\top dC\right) = \operatorname{Tr}\left(\bar{A}^\top dA\right) + \operatorname{Tr}\left(\bar{B}^\top dB\right)\]

Parameters:

Returns:

The gradients with respect to each Variable in inputs.

Return type:

grads

References

make_node(x)[source]#

Construct an Apply node that represent the application of this operation to the given inputs.

This must be implemented by sub-classes.

Returns:

node – The constructed Apply node.

Return type:

Apply

perform(node, inputs, outputs)[source]#

Calculate the function on the inputs and put the variables in the output storage.

Parameters:

Notes

The output_storage list might contain data. If an element of output_storage is not None, it has to be of the right type, for instance, for a TensorVariable, it has to be a NumPy ndarraywith the right number of dimensions and the correct dtype. Its shape and stride pattern can be arbitrary. It is not guaranteed that such pre-set values were produced by a previous call to this Op.perform(); they could’ve been allocated by anotherOp’s perform method. An Op is free to reuse output_storage as it sees fit, or to discard it and allocate new memory.