2017-11-28 2 views
0

In TensorFlow möchte ich eine der "falschen" Quantisierungsfunktionen auf einen meiner Tensoren anwenden. Konkret bin ich daran interessiert, mit this Funktion:Verwenden Sie den Tensor-Wert, um einen anderen Tensor zur Laufzeit zu ändern

fake_quant_with_min_max_args(
    inputs, 
    min=-6, 
    max=6, 
    num_bits=8, 
    narrow_range=False, 
    name=None 
    ) 

Es aus der Box ganz gut funktioniert. Idealerweise möchte ich die Argumente min und max abhängig vom Eingangstensor anpassen. Konkret möchte ich die 99.7% rule verwenden, um diesen Bereich zu definieren. Mit anderen Worten, ich möchte den Wertebereich verwenden, der, wenn er den Eingangstensor als 1-dimensionalen Vektor darstellt, 99,7% seiner Elemente zwischen dem [Mittelwert-3 * Standard, Mittelwert + 3 * Standard] liegt Angebot.

Zu diesem Zweck mir folgend:

def smartFakeQuantization(tensor): 
    # Convert the input tensor to a 1-d tensor 
    t_1d_data = tf.reshape(tensor,[tf.size(tensor), 1]) 
    # get the moments of that tensor. Now mean and var have shape (1,) 
    mean, var = tf.nn.moments(t_1d_data, axes=[0]) 
    # get a tensor containing the std 
    std = tf.sqrt(var) 

    < some code to get the values of those tensors at run-time> 

    clip_range = np.round([mean_val - 3*std_val, mean_val + 3*stdstd_val], decimals=3) 
    return tf.fake_quant_with_min_max_args(tensor, min=clip_range[0], max=clip_range[1]) 

Ich weiß, dass ich jeden Tensor in der grafischen Darstellung, indem Sie bewerten könnte: myTensor.eval() oder mySession.run(myTensor) aber wenn ich diese Art von Linien in der Seite meine Funktion darüber hinzufügen wird beim Ausführen des Graphen abstürzen. Ich erhalte einen Fehler des Formulars:

Tensor < ...> wurde als nicht erreichbar markiert.

Wahrscheinlich Schritte, die ich folgen, sind nicht die richtigen für die "Graph" Natur von TensorFlow. Irgendwelche Ideen wie das gemacht werden könnte? Zusammenfassend möchte ich den Wert eines Tensors zur Laufzeit verwenden, um einen anderen Tensor zu modifizieren. Ich würde sagen, dieses Problem ist komplexer als das, was mit tf.cond() getan werden kann.

+0

Ich denke, ich habe ein bisschen das Problem eingegrenzt. Es scheint, dass ich diesen Fehler bekomme, weil der Graph noch nicht initialisiert wurde ... daher wird .eval() abstürzen. – karl71

Antwort

1

Ich glaube nicht, dass es eine einfache Möglichkeit gibt, das zu tun, was Sie wollen. Die min und max Argumente zu fake_quant_with_min_max_args werden in Operationsattribute konvertiert und im zugrunde liegenden Kernel construction verwendet. Sie können zur Laufzeit nicht geändert werden. Es gibt einige (scheinbar nicht Teil der öffentlichen API) ops (siehe LastValueQuantize und MovingAvgQuantize), die ihre Intervalle abhängig von den Daten anpassen, die sie sehen, aber sie tun nicht ganz, was Sie wollen.

Sie können Ihre eigene benutzerdefinierte Op schreiben oder wenn Sie glauben, dass dies etwas allgemein Wert ist, eine Feature-Anforderung auf GitHub.

Verwandte Themen