Hi,

Unfortunately, it is a requirement that all iterations of scan return a
tensor of the same shape.

You can pad the initial tensor explicitly by using tensor.join, or
allocating zeros and using set_subtensor.


On Thu, Nov 17, 2016, VM wrote:
> I'm trying to slice a 2D array using coordinates given by another array. 
> 
> Example : 
> 
> def example(p, Q):                                               
>     a = T.tensor4('a')                                            
>     q = T.matrix('q')                                             
>                                                                   
>     b = q[:, 0]                                                   
>     c = q[:, 1]                                                   
>                                                                   
>     b_i = T.cast(b, 'int32')                                      
>     c_i = T.cast(c, 'int32')                                      
>                                                                   
>     d, _ = theano.map(lambda pix, x, y : pix[0, x-1:x+2, y-1:y+2],
>         sequences=[a, b_i, c_i])                                  
>                                                                   
>                                                                  
>     f = theano.function([a, q], d, allow_input_downcast=True)     
>     return f(p, Q)                                           
> 
> # test 
> p = np.arange(200).reshape((2, 1, 10, 10))
> Q = np.array([[3, 4], [5, 6]])            
> print p                                   
> answer = example(p, Q)                                     
> print answer                              
> =========================================
> Gives : 
> [[[[  0   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  28  29]
>    [ 30  31  32  33  34  35  36  37  38  39]
>    [ 40  41  42  43  44  45  46  47  48  49]
>    [ 50  51  52  53  54  55  56  57  58  59]
>    [ 60  61  62  63  64  65  66  67  68  69]
>    [ 70  71  72  73  74  75  76  77  78  79]
>    [ 80  81  82  83  84  85  86  87  88  89]
>    [ 90  91  92  93  94  95  96  97  98  99]]]
> 
> 
>  [[[100 101 102 103 104 105 106 107 108 109]
>    [110 111 112 113 114 115 116 117 118 119]
>    [120 121 122 123 124 125 126 127 128 129]
>    [130 131 132 133 134 135 136 137 138 139]
>    [140 141 142 143 144 145 146 147 148 149]
>    [150 151 152 153 154 155 156 157 158 159]
>    [160 161 162 163 164 165 166 167 168 169]
>    [170 171 172 173 174 175 176 177 178 179]
>    [180 181 182 183 184 185 186 187 188 189]
>    [190 191 192 193 194 195 196 197 198 199]]]]
> [[[  23.   24.   25.]
>   [  33.   34.   35.]
>   [  43.   44.   45.]]
> 
>  [[ 145.  146.  147.]
>   [ 155.  156.  157.]
>   [ 165.  166.  167.]]]
> 
> Which is the correct output. 
> However :
> p = np.arange(200).reshape((2, 1, 10, 10))
> Q = np.array([[3, 4], [8, 9]])            
> print p                                   
> answer = example5(p, Q)                   
> print answer                              
> 
> crashes because the coordinate [8, 9] is near the edge of the 10x10 array 
> whereas [3, 4] isn't. So the two iterations in scan give outputs of two 
> different shapes. So it crashes. 
> How can I solve this problem (either by zero-padding somewhere, or wrapping 
> around the slice) ? I'm not too bothered about exactness, I just need a 
> solution that doesn't crash.
> 
> -- 
> 
> --- 
> 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