1

Ich versuche, die Transpose-Funktion in Caffe mit einer Python-Ebene zu implementieren. Unten ist der Code für das gleiche.Fehler beim Implementieren von "transpose" Ebene in Caffe

Es wird jedoch den Fehler zu werfen „nach dem Werfen einer Instanz boost::python::error_already_set bei Reshape() Methode namens beenden.

Kann jemand etwas Licht werfen auf das, was ich falsch mache?

import caffe 
import numpy as np 

class transpose(caffe.Layer): 

    def setup(self, bottom, top): 
     assert len(bottom) == 1,   'requires a single layer.bottom' 
     assert bottom[0].data.ndim == 2, 'requires matrix data' 
     assert len(top) == 1,    'requires a single layer.top' 

    def reshape(self, bottom, top): 
     top[0].reshape((bottom[0].data.shape[1], bottom[0].data.shape[0])) 

    def forward(self, bottom, top): 
     top[0].data = np.transpose(bottom[0].data) 

    def backward(self, top, propagate_down, bottom): 
     pass 

Danke, . Vijetha

+1

[This] (https://github.com/BVLC/caffe/issues/3594) ist eine Diskussion über die Permutationsebene. Es kann relevant sein. Der Code für diese Ebene ist verfügbar [hier] (https://github.com/intel/caffe/blob/master/src/caffe/layers/permute_layer.cpp) oder [hier] (https://github.com/ BVLC/caffe/blob/b68695db42aa79e874296071927536363fe1efbf/src/caffe/layers/permute_layer.cpp). –

+0

Was ist mit einem Rückwärtsdurchlauf, der die Gradienten ebenfalls transponiert? – Shai

Antwort

1

ich glaube, Sie reshape falsch ing sind
Versuchen:.

def reshape(self, bottom, top): 
    top[0].reshape(bottom[0].data.shape[1], bottom[0].data.shape[0]) 

shape Argumente für Reshape sind nicht als Tupel gegeben, sondern als separate Argumente.

+1

Das hat funktioniert. Vielen Dank. Ist die Rückwärtsmethode auch korrekt? Ich bin mir auch über diese Methode nicht ganz sicher. Wie Sie kommentiert, sollte ich den vorherigen Verlauf, der von oben übergeben wird, transponieren? –

+1

@ VijethaGattupalli müssen Sie unten [0] .diff mit top. [0] .diff. Sie müssen transponieren ... – Shai

+0

Also wäre es unten [0] .diff = np.transpose (top [0] .diff). Ich glaube, 'pass' würde nur bottom [0] .diff = top [0] .diff machen. Bitte korrigieren Sie mich, wenn ich falsch liege. –