def resnet_arg_scope(weight_decay=0.0001,
is_training=True,
batch_norm_decay=0.997,
batch_norm_epsilon=1e-5,
batch_norm_scale=True,
activation_fn=tf.nn.relu,
use_batch_norm=True):
"""Defines the default ResNet arg scope.
TODO(gpapan): The batch-normalization related default values above are
appropriate for use in conjunction with the reference ResNet models
released at https://github.com/KaimingHe/deep-residual-networks. When
training ResNets from scratch, they might need to be tuned.
Args:
weight_decay: The weight decay to use for regularizing the model.
batch_norm_decay: The moving average decay when estimating layer activation
statistics in batch normalization.
batch_norm_epsilon: Small constant to prevent division by zero when
normalizing activations by their variance in batch normalization.
batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the
activations in the batch normalization layer.
activation_fn: The activation function which is used in ResNet.
use_batch_norm: Whether or not to use batch normalization.
Returns:
An `arg_scope` to use for the resnet models.
"""
batch_norm_params = {
'decay': batch_norm_decay,
'epsilon': batch_norm_epsilon,
'scale': batch_norm_scale,
'updates_collections': None,
'is_training': is_training,
'fused': True, # Use fused batch norm if possible.
}
with slim.arg_scope( #1
[slim.conv2d],
weights_regularizer=slim.l2_regularizer(weight_decay),
weights_initializer=slim.variance_scaling_initializer(),
activation_fn=activation_fn,
normalizer_fn=slim.batch_norm if use_batch_norm else None,
normalizer_params=batch_norm_params):
with slim.arg_scope([slim.batch_norm], **batch_norm_params): #2
# The following implies padding='SAME' for pool1, which makes feature
# alignment easier for dense prediction tasks. This is also used in
# https://github.com/facebook/fb.resnet.torch. However the accompanying
# code of 'Deep Residual Learning for Image Recognition' uses
# padding='VALID' for pool1. You can switch to that choice by setting
# slim.arg_scope([slim.max_pool2d], padding='VALID')
with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: #23
return arg_sc
#1 第一个 slim.arg_scope [slim.conv2d] 就是 给[] 里面的所有的 op,传递后面默认的参数
# 2 第二个 slim.arg_scope 假设 现在增加一个[slim.batch_norm,slim.conv2d] 然后 第一个arg_scope的参数
weights_regularizer=slim.l2_regularizer(weight_decay),
weights_initializer=slim.variance_scaling_initializer(),
activation_fn=activation_fn,
normalizer_fn=slim.batch_norm if use_batch_norm else None,
normalizer_params=batch_norm_params 以及 第二个arg_scope的 参数 batch_norm_params 都会传递给conv2d
#3 第三个 slim.arg_scope 的arg_sc 其实包含了 上面三个scope的 list 里面的op 机器对应的参数
resnet_arg_scope = resnet_utils.resnet_arg_scope
resnet_arg_scope ()返回
{
'
'weights_initializer':
'activation_fn':
'normalizer_fn':
'normalizer_params': {'decay': 0.997, 'epsilon': 1e-05, 'scale': True, 'updates_collections': None, 'is_training': True, 'fused': True}},
'
'
}