2016-04-21 6 views
1

Ich habe einen 4d Theano Tensor (mit der Form (1, 700, 16, 95000) zum Beispiel) und eine 4D 'Maske' Tensor mit der Form (1, 700, 16, 1024) wie dass jedes Element in der Maske ein Index ist, den ich vom ursprünglichen Tensor benötige. Wie kann ich mit meiner Maske meinen Tensor indizieren? Dinge wie Beispiel [Maske] oder Beispiel [:,:,:, Maske] scheinen nicht wirklich zu funktionieren.Theano/numpy fortgeschritten Indexierung

Ich habe auch versucht, eine binäre Maske zu verwenden, aber da der Tensor ziemlich groß ist, bekomme ich eine 'Gerät nicht genügend Speicher' Ausnahme.

Andere Ideen, wie ich meine Indizes vom Tensor bekommen würde, wären ebenfalls sehr willkommen.

Dank

+0

Enthält 'maske' 1D-Indizes oder 4D-Indizes? Ich meine, 'i = mask [0,0,0,0]' ist ein Integer 'i <1 * 700 * 16 * 95000' oder indexiert nur die letzte Dimension' [0,0,0, i] '? –

+0

Nur Indizes für die letzte Dimension. Also ist jedes Element in der 4. Dimension der Maske ein Index, den ich von der 4. Dimension des Tensors haben möchte. Ich könnte die Maske anders erstellen, wenn es das Problem einfacher macht. (Die Maske wird mit numpy erzeugt, außerhalb des Berechnungsgraphen, auf der CPU => vollständige Freiheit) –

Antwort

0

So in das Fehlen einer Antwort, habe ich beschlossen, die rechenintensive Lösung zu verwenden, die die die Indizes Tensoren sowohl meine Daten entfaltet, das Hinzufügen einer der Indizes versetzt sie global zu bringen Positionen, Indizierung der Daten und Umgestaltung des Originals.

Ich füge hier meinen Testcode hinzu, einschließlich einer (auskommentierten) Lösung für Matrizen.

def theano_convertion(els, inds, offsets): 
    els = T.flatten(els) 
    inds = T.flatten(inds) + offsets 
    return T.reshape(els[inds], (2, 3, 16, 5)) 


if __name__ == '__main__': 
    # command: np.transpose(t[range(2), indices]) 
    # t = np.random.randint(0, 10, (2, 20)) 
    # indices = np.random.randint(0, 10, (5, 2)) 

    t = np.random.randint(0, 10, (2, 3, 16, 20)).astype('int32') 
    indices = np.random.randint(0, 10, (2, 3, 16, 5)).astype('int32') 
    offsets = np.asarray(range(1, 2 * 3 * 16 + 1), dtype='int32') 
    offsets = (offsets * 20) - 20 
    offsets = np.repeat(offsets, 5) 

    offsets_tens = T.ivector('offsets') 
    inds_tens = T.itensor4('inds') 
    t_tens = T.itensor4('t') 

    func = theano.function(
    [t_tens, inds_tens, offsets_tens], 
    [theano_convertion(t_tens, inds_tens, offsets_tens)] 
) 

    shaped_elements = [] 
    flattened_elements = [] 

    [tmp] = func(t, indices, offsets) 

    for i in range(2): 
    for j in range(3): 
     for k in range(16): 
      shaped_elements.append(t[i, j, k, indices[i, j, k, :]]) 
      flattened_elements.append(tmp[i, j, k, :]) 

      print shaped_elements[-1] == flattened_elements[-1]