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?
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:
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%Tags und Links python tensorflow rounding precision