Wie simuliert man in TensorFlow Schwebekörper mit reduzierter Präzision?

9

Ich möchte eine Möglichkeit, die Genauigkeit von Floats in TensorFlow (ungefähr: die Mantisse abzusenken) auf eine beliebige Anzahl von Bits innerhalb eines definierten vollen Bereichs reduzieren. Ich muss den Code nicht vollständig in reduzierter Präzision schreiben (wie tf.float16), sondern vielmehr mit einer Reihe von Operationen, die die Genauigkeit eines Tensors verringern und gleichzeitig den ursprünglichen Typ beibehalten (zB tf.float32).

Wenn beispielsweise der gesamte Bereich 0 bis 1 ist und die Genauigkeit 8 Bit beträgt, wird 0,1234 rund (0,1234 * 256) / 256 = 0,125. Dies verwendet eine einfache Rundung.

Ich würde auch gerne statistische Rundungen durchführen, bei denen die Wahrscheinlichkeit der Rundung in jeder Richtung proportional dazu ist, wie weit der Wert davon entfernt ist. Beispiel: 0,1234 * 256 = 31,5904, was in 59% der Fälle auf 32/256 und in 41% der Fälle auf 31/256 aufrundet.

Zusätzliche Frage: Wie man einen vorhandenen Graphen nimmt und ihn modifiziert, um nach jeder Faltung eine Rundung hinzuzufügen?

    
Alex I 23.03.2017, 00:14
quelle

1 Antwort

2

Der einzige schwierige Teil besteht darin, die Verläufe für die Rundungsoperation bereitzustellen. Das bereits implementierte tf.round hat keinen Gradienten implementiert. Aber Sie können Ihren eigenen Rundungsvorgang (statistisches oder einfaches Runden beider Arbeiten) wie hier gezeigt implementieren: Tensorflow: Wie schreibe ich op mit Farbverlauf in Python ?

Wo können Sie einfach verwenden:

%Vor%

Sobald Sie Ihre personalisierte round -Operation haben, die Farbverläufe überträgt, können Sie einfach Folgendes tun:

%Vor%

Und für die stochastische Rundung können Sie eine einfache numpy Funktion wie

erstellen %Vor%

und dann straffen Sie es wie in Wie mache ich eine benutzerdefinierte Aktivierungsfunktion mit nur Python in Tensorflow?

Hier können Sie die Gradient-Operation als

definieren %Vor%     
patapouf_ai 26.03.2017, 01:41
quelle