You may need to make the first index a column rather than a vector, for
instance T.arange(X.shape[0])[:, np.newaxis].

I suggest you try to work it out in pure numpy first, and then translate
it to Theano.

On Tue, Nov 01, 2016, Jiří Hron wrote:
> I'm trying to slice a theano.tensor.tensor3d so that every index from the 
> first and the second dimension are selected, and the third dimension is 
> subsetted based on another tensor variable.
> 
> For clarity, I'm trying to generalise something like this:
> 
> import theano
> import theano.tensor as T
> 
> X = T.fmatrix('X')
> y = T.ivector('y')
> 
> rslt = X[T.arange(X.shape[0]), y]
> 
> fn = theano.function([X, y], rslt)
> 
> 
> into something like this:
> 
> import theano
> import theano.tensor as T
> 
> X = T.ftensor3('X')
> y = T.ivector('y')
> 
> rslt = X[T.arange(X.shape[0]), T.arange(X.shape[1]), y]
> 
> fn = theano.function([X, y], rslt)
> 
> 
> but the latter unfortunately throws an error like this:
> 
> Traceback (most recent call last):
>   File 
> "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", 
> line 2885, in run_code
>     exec(code_obj, self.user_global_ns, self.user_ns)
>   File "<ipython-input-73-e2af657671ee>", line 1, in <module>
>     fn(xx3, yy)
>   File 
> "/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.py", 
> line 871, in __call__
>     storage_map=getattr(self.fn, 'storage_map', None))
>   File "/usr/local/lib/python2.7/dist-packages/theano/gof/link.py", line 314, 
> in raise_with_op
>     reraise(exc_type, exc_value, exc_trace)
>   File 
> "/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.py", 
> line 859, in __call__
>     outputs = self.fn()
>   File "/usr/local/lib/python2.7/dist-packages/theano/gof/op.py", line 912, 
> in rval
>     r = p(n, [x[0] for x in i], o)
>   File "/usr/local/lib/python2.7/dist-packages/theano/tensor/subtensor.py", 
> line 2166, in perform
>     out[0] = inputs[0].__getitem__(inputs[1:])
> IndexError: shape mismatch: indexing arrays could not be broadcast together 
> with shapes (2,) (3,) (3,) 
> Apply node that caused the error: AdvancedSubtensor(X, 
> ARange{dtype='int64'}.0, ARange{dtype='int64'}.0, y)
> Toposort index: 4
> Inputs types: [TensorType(float32, 3D), TensorType(int64, vector), 
> TensorType(int64, vector), TensorType(int32, vector)]
> Inputs shapes: [(2, 3, 3), (2,), (3,), (3,)]
> Inputs strides: [(36, 12, 4), (8,), (8,), (4,)]
> Inputs values: ['not shown', array([0, 1]), array([0, 1, 2]), array([0, 1, 
> 2], dtype=int32)]
> Outputs clients: [['output']]
> 
> Backtrace when the node is created(use Theano flag traceback.limit=N to make 
> it longer):
>   File 
> "/home/jirka/.IntelliJIdea2016.2/config/plugins/python/helpers/pydev/pydevconsole.py",
>  line 213, in process_exec_queue
>     more = interpreter.add_exec(code_fragment)
>   File 
> "/home/jirka/.IntelliJIdea2016.2/config/plugins/python/helpers/pydev/_pydev_bundle/pydev_console_utils.py",
>  line 236, in add_exec
>     more = self.do_add_exec(code_fragment)
>   File 
> "/home/jirka/.IntelliJIdea2016.2/config/plugins/python/helpers/pydev/_pydev_bundle/pydev_ipython_console.py",
>  line 42, in do_add_exec
>     res = bool(self.interpreter.add_exec(codeFragment.text))
>   File 
> "/home/jirka/.IntelliJIdea2016.2/config/plugins/python/helpers/pydev/_pydev_bundle/pydev_ipython_console_011.py",
>  line 436, in add_exec
>     self.ipython.run_cell(line, store_history=True)
>   File 
> "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", 
> line 2723, in run_cell
>     interactivity=interactivity, compiler=compiler, result=result)
>   File 
> "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", 
> line 2825, in run_ast_nodes
>     if self.run_code(code, result):
>   File 
> "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", 
> line 2885, in run_code
>     exec(code_obj, self.user_global_ns, self.user_ns)
>   File "<ipython-input-69-d2e570619075>", line 4, in <module>
>     rslt = X[T.arange(X.shape[0]), T.arange(X.shape[1]), y]
> 
> HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and 
> storage map footprint of this apply node.
> 
> 
> My current solution is to convert y to one_hot_encoding, add broadcastable 
> dimension, and doing elementwise multiplication, which does yield the desired 
> result but is inefficient.
> 
> Is there any better solution please?
> 
> 
> -- 
> 
> --- 
> You received this message because you are subscribed to the Google Groups 
> "theano-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.


-- 
Pascal

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to