Ich verwende slim.batch_norm
von layers und versuche, den Code-Flow in meinem Anwendungsfall zu verstehen. Es sieht für mich wie die Logik aus, die entscheidet, ob _fused_batch_norm()
zu verwenden ist, oder die Basisklasse wird nur die _fused_batch_norm()
in meinem Fall verwenden, wenn der Eingabe-Rang 2 ist. Die Codebeschreibung klingt wie es sollte auch verwendet werden, wenn Rang 4 und die Funktion ist (_fused_batch_norm()) unterstützt Rang 4, aber die Logik scheint es zu verhindern, sie aufzurufen. Unten ist das, was ein Ausschnitt des Codes zeigt, auf meine ich:Welcher Tensorflow-Batch-Normcode wird verwendet, wenn der Eingabe-Rang 4 ist?
# Only use _fused_batch_norm (1) if fused is set True or if it is
# possible to use (currently it doesn't support batch weights,
# renorm, and the case when rank is neither 2 nor 4),
# and (2) if used with zero_debias_moving_mean, or an input shape of rank 2,
# or non-default updates_collections (not implemented in
# normalization_layers.BatchNormalization yet); otherwise use the fused
# implementation in normalization_layers.BatchNormalization.
inputs = ops.convert_to_tensor(inputs)
rank = inputs.get_shape().ndims
feature_supported = batch_weights is None and not renorm and rank in [2, 4]
possible_to_fuse = fused is None and feature_supported
if (fused or possible_to_fuse) and (
zero_debias_moving_mean or rank == 2 or
updates_collections is not ops.GraphKeys.UPDATE_OPS):
return _fused_batch_norm(...)
Für meine Anwendungsfall, ich habe die folgenden Parameter alle auf Standardeinstellungen:
batch_weights=None
fused=False
renorm=False
zero_debias_moving_mean=False
updates_collections=ops.GraphKeys.UPDATE_OPS
Wenn mein Eingang ist Rang 4, es sieht aus wie der Code wird die fusionierte Implementierung in normalization_layers.BatchNormalization
verwenden Ist mein Verständnis der Logik korrekt?
Ist das das erwartete und richtige Verhalten? Ich frage mich, ob die Bedingung rank==2
eigentlich rank in [2,4]
sein sollte? Wenn letzteres korrekt ist, wäre dies ein potenzieller Fehler. Wenn das Original korrekt ist, warum dann rank in [2,4]
für die Bestimmung feature_supported
?