2017-06-28 3 views
1

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?

Antwort

1

Sie haben Recht, es ist ein Fehler. Bei rank=4 und fused=None (oder True) kann und sollte ein optimiertes _fused_batch_norm verwendet werden. Dies stimmt mit tf.nn.fused_batch_norm überein.

Sieht aus wie sie den logischen Ausdruck durcheinander gebracht, die wenn possible_to_fuse=True auslösen sollte, egal was alles andere ist. Außerdem ist feature_supported=True and not fused=False, _fused_batch_norm ebenfalls möglich.

Sie sollten es an tensorflow issue tracker melden.

Verwandte Themen