2017-08-14 8 views
0

Auf der Github wird ein OpOutputList wie so initialisiert:Wie benutzt man die OpOutputList von Tensorflow?

OpOutputList outputs; 
OP_REQUIRES_OK(context, context->output_list("output",&outputs)); 

Und Tensoren werden wie folgt hinzugefügt:

Tensor* tensor0 = nullptr; 
Tensor* tensor1 = nullptr; 
long long int sz0 = 3; 
long long int sz1 = 4; 
... 
OP_REQUIRES_OK(context, outputs.allocate(0, TensorShape({sz0}), &tensor0)); 
OP_REQUIRES_OK(context, outputs.allocate(1, TensorShape({sz1}), &tensor1)); 

Ich bin, dass OpOutputList Annahme ist wie OpInputList dass verzweigte Arrays erlaubt sind.

Meine Frage ist, wie funktioniert OpOutputList? Manchmal bekomme ich Segfaults, wo ich nicht auf den ersten Index zugreifen kann, wenn ich Eigen::Tensor::flat() benutze, aber weil ich nicht verstehe, wie die Zuordnung funktioniert, kann ich den Fehler nicht lokalisieren.

Vielen Dank.

Antwort

0

Das OpOutputList-Objekt selbst ist ein sehr einfaches Wertobjekt, das nur zwei Ganzzahlen enthält - die Start- und Endindizes der Op-Ausgaben, die in dieser Liste enthalten sind. Da es sich um einfache Wertobjekte handelt, erstellen Sie diese im Allgemeinen einfach auf dem Stack, es ist keine "Zuweisung" erforderlich.

Sie ordnen die Tensoren, die logisch zu einer OpOutputList gehören, genau wie jeder andere Tensor zu. Im Allgemeinen mit allocate_output(). Hier ist die Implementierung von OpOutputList::allocate:

Status OpOutputList::allocate(int i, const TensorShape& shape, 
           Tensor** output) { 
DCHECK_GE(i, 0); 
DCHECK_LT(i, stop_ - start_); 
return ctx_->allocate_output(start_ + i, shape, output); 
} 

Wie man sieht es prüft nur, dass der Index i ist in der Tat in diesem OpOutputList und allocate_output nennen.