提交 19cb8885 authored 作者: Frederic's avatar Frederic

Fix formating issue with as_op doc and add exercices solutions.

上级 a4d7af66
...@@ -418,33 +418,35 @@ have to be jointly optimized explicitly in the code.) ...@@ -418,33 +418,35 @@ have to be jointly optimized explicitly in the code.)
as_op as_op
===== =====
- Decorator that converts a function into a basic Theano op - Decorator that converts a python function into a basic Theano op
that will call the supplied function as its implementation. that will call the supplied function as its implementation.
- Takes an optional infer_shape parameter that should be a - Takes an optional infer_shape parameter that should be a
callable with this signature: callable with this signature:
.. code-block:: python
def infer_shape(node, input_shapes): def infer_shape(node, input_shapes):
... # ...
return output_shapes return output_shapes
- `input_shapes` and `output_shapes` are lists of tuples that - `input_shapes` and `output_shapes` are lists of tuples that
represent the shape of the corresponding inputs/outputs. represent the shape of the corresponding inputs/outputs.
.. note:: .. note::
This should not be used when performance is a concern since This should not be used when performance is a concern since
the very basic nature of the resulting Op may interfere with the very basic nature of the resulting Op may interfere with
certain graph optimizations. certain graph optimizations. WHY?!?!? I think it need more detail or should be removed.!?!?!
.. note:: .. note::
Returns FromFunctionOp(fn, itypes, otypes, infer_shape) Returns FromFunctionOp(fn, itypes, otypes, infer_shape)
FromfunctionOp FromFunctionOp
============== --------------
- Build a basic Theano Op around a function. - Build a basic Theano Op around a python function.
.. note:: .. note::
...@@ -461,23 +463,21 @@ FromfunctionOp ...@@ -461,23 +463,21 @@ FromfunctionOp
gradient of a graph containing this op. gradient of a graph containing this op.
Op Example as_op Example
========== -------------
.. code-block:: python .. code-block:: python
import theano import theano
import numpy import numpy
from theano.compile.ops import as_op from theano.compile.ops import as_op
from theano.compile.ops import FromFunctionOp
def infer_shape_numpy_dot(node, input_shapes): def infer_shape_numpy_dot(node, input_shapes):
ashp, bshp = input_shapes ashp, bshp = input_shapes
return [ashp[:-1] + bshp[-1:]] return [ashp[:-1] + bshp[-1:]]
@as_op(itypes=[theano.tensor.fmatrix, theano.tensor.fmatrix], @as_op(itypes=[theano.tensor.fmatrix, theano.tensor.fmatrix],
otypes=[theano.tensor.fmatrix], infer_shape=infer_shape_numpy_dot) otypes=[theano.tensor.fmatrix], infer_shape=infer_shape_numpy_dot)
def numpy_dot(a, b): def numpy_dot(a, b):
return numpy.dot(a, b) return numpy.dot(a, b)
...@@ -494,7 +494,7 @@ You can try it as follows: ...@@ -494,7 +494,7 @@ You can try it as follows:
Exercise Exercise
======== --------
Run the code of the *numpy_dot* example above. Run the code of the *numpy_dot* example above.
......
...@@ -163,5 +163,41 @@ class TestSumDiffOp(utt.InferShapeTester): ...@@ -163,5 +163,41 @@ class TestSumDiffOp(utt.InferShapeTester):
numpy.random.rand(5, 6)], numpy.random.rand(5, 6)],
self.op_class) self.op_class)
# as_op exercice
import theano
import numpy
from theano.compile.ops import as_op
def infer_shape_numpy_dot(node, input_shapes):
ashp, bshp = input_shapes
return [ashp[:-1] + bshp[-1:]]
@as_op(itypes=[theano.tensor.fmatrix, theano.tensor.fmatrix],
otypes=[theano.tensor.fmatrix], infer_shape=infer_shape_numpy_dot)
def numpy_add(a, b):
return numpy.add(a, b)
def infer_shape_numpy_add_sub(node, input_shapes):
ashp, bshp = input_shapes
# Both inputs should have that same shape, so we just return one of them.
return [ashp[0]]
@as_op(itypes=[theano.tensor.fmatrix, theano.tensor.fmatrix],
otypes=[theano.tensor.fmatrix], infer_shape=infer_shape_numpy_add_sub)
def numpy_add(a, b):
return numpy.add(a, b)
@as_op(itypes=[theano.tensor.fmatrix, theano.tensor.fmatrix],
otypes=[theano.tensor.fmatrix], infer_shape=infer_shape_numpy_add_sub)
def numpy_sub(a, b):
return numpy.sub(a, b)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论