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.
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