输入秩为 4 时使用哪个 tensorflow batch norm 代码?
Which tensorflow batch norm code is used when input rank is 4?
我正在使用 layers 中的 slim.batch_norm
并试图了解我的用例中的代码流。在我看来,如果输入等级为 2,则决定是否使用 _fused_batch_norm()
或基础 class 的逻辑将仅在我的情况下使用 _fused_batch_norm()
。代码描述听起来像如果等级为 4 并且函数本身 (_fused_batch_norm()) 支持等级 4,也应该使用它,但逻辑似乎阻止调用它。下面是显示我所指内容的代码片段:
# 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(...)
对于我的用例,我有以下所有默认设置的参数:
batch_weights=None
fused=False
renorm=False
zero_debias_moving_mean=False
updates_collections=ops.GraphKeys.UPDATE_OPS
如果我的输入是等级 4,看起来代码将使用 normalization_layers.BatchNormalization
中的融合实现,我对逻辑的理解是否正确?
这是预期的正确行为吗?我想知道条件 rank==2
是否实际上应该是 rank in [2,4]
?如果后者是正确的,那么这将是一个潜在的错误。如果原文是正确的,那为什么要有rank in [2,4]
来判断feature_supported
?
你是对的,这是一个错误。当 rank=4
和 fused=None
(或 True
)时,可以而且应该使用优化的 _fused_batch_norm
。这与 tf.nn.fused_batch_norm
.
一致
看起来他们混淆了逻辑表达式,如果 possible_to_fuse=True
应该触发,不管其他是什么。此外,如果feature_supported=True and not fused=False
,_fused_batch_norm
也符合条件。
你应该报告给 tensorflow issue tracker。
我正在使用 layers 中的 slim.batch_norm
并试图了解我的用例中的代码流。在我看来,如果输入等级为 2,则决定是否使用 _fused_batch_norm()
或基础 class 的逻辑将仅在我的情况下使用 _fused_batch_norm()
。代码描述听起来像如果等级为 4 并且函数本身 (_fused_batch_norm()) 支持等级 4,也应该使用它,但逻辑似乎阻止调用它。下面是显示我所指内容的代码片段:
# 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(...)
对于我的用例,我有以下所有默认设置的参数:
batch_weights=None
fused=False
renorm=False
zero_debias_moving_mean=False
updates_collections=ops.GraphKeys.UPDATE_OPS
如果我的输入是等级 4,看起来代码将使用 normalization_layers.BatchNormalization
中的融合实现,我对逻辑的理解是否正确?
这是预期的正确行为吗?我想知道条件 rank==2
是否实际上应该是 rank in [2,4]
?如果后者是正确的,那么这将是一个潜在的错误。如果原文是正确的,那为什么要有rank in [2,4]
来判断feature_supported
?
你是对的,这是一个错误。当 rank=4
和 fused=None
(或 True
)时,可以而且应该使用优化的 _fused_batch_norm
。这与 tf.nn.fused_batch_norm
.
看起来他们混淆了逻辑表达式,如果 possible_to_fuse=True
应该触发,不管其他是什么。此外,如果feature_supported=True and not fused=False
,_fused_batch_norm
也符合条件。
你应该报告给 tensorflow issue tracker。