Slim下的函数介绍(一)(转)

1、slim.conv2d:二维卷积

2、slim.nets.resnet_utils.conv2d_same():使用“SAME”填充的二维卷积

3、 tf.variable_scope()的original_name_scope 和 name的区别:

4、slim.utils.collect_named_outputs(collections, alias, outputs):为output的tensor添加别名,并将tensor添加到collections的列表中

5、slim.separable_conv2d():实现深度可分离卷积

6、slim.learning.train():开始训练

7、slim.evaluation.evaluation_loop():对模型的预测结果进行评估

8、slim.get_variables_to_restore(include=None, exclude=None):

9、slim.assign_from_checkpoint_fn():

10、tf.contrib.metrics.aggregate_metric_map():

11、Slim.conv2d_transpose():实现反卷积

12、slim.batch_norm():实现批量归一化

13、slim.max_pool2d()、slim.avg_pool2d():实现最大或者均值池化:


参考源码https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/layers/python/layers/layers.py


1、slim.conv2d:二维卷积

  函数原型:


 
 
  1. convolution(inputs,
  2. num_outputs,
  3. kernel_size,
  4. stride= 1,
  5. padding= 'SAME',
  6. data_format= None,
  7. rate= 1,
  8. activation_fn=nn.relu,
  9. normalizer_fn= None,
  10. normalizer_params= None,
  11. weights_initializer=initializers.xavier_initializer(),
  12. weights_regularizer= None,
  13. biases_initializer=init_ops.zeros_initializer(),
  14. biases_regularizer= None,
  15. reuse= None,
  16. variables_collections= None,
  17. outputs_collections= None,
  18. trainable= True,
  19. scope= None):

参数介绍:

    inputs:指需要做卷积的输入图像
    num_outputs:指定卷积核的个数(就是filter的个数)
    kernel_size:N个正整数的序列,指定卷积核的空间维度。 可以是单个整数,则所有空间维度具有相同值。
    stride:一组N个正整数,指定计算输出的stride。 可以是一个整数,则所有空间维具有相同的值。指定任何stride!= 1与指定任何rate!= 1不相容。
    padding:为padding的方式选择,VALID或者SAME
    data_format:是用于指定输入的input的格式
    rate:N个正整数的序列,指定用于萎缩卷积的扩张率。 可以是单个整数,以指定所有空间维度的相同值。 指定任何rate!= 1与指定任何stride!= 1不兼容。
    activation_fn:用于激活函数的指定,默认的为ReLU函数
    normalizer_fn:用于指定正则化函数
    normalizer_params:用于指定正则化函数的参数
    weights_initializer:用于指定权重的初始化程序
    weights_regularizer:为权重可选的正则化程序
    biases_initializer:用于指定biase的初始化程序
    biases_regularizer: biases可选的正则化程序
    reuse:指定是否共享层或者和变量
    variable_collections:指定变量的集合列表或者字典名,变量(weight、biase)会被添加到这个集合中。
    outputs_collections:指定一个列表名,输出(output)会被添加到这个列表。这个(列表名,[output])的键值对位于Graph类的self._collection字典中,如果该字典中没有列表名的关键字,则(列表名,[output])会被创建。
    trainable::卷积层的参数是否可被训练,如果为True,则同样会将变量添加到计算图集合GraphKeys.TRAINABLE_VARIABLES中 
    scope:共享变量所指的variable_scope

2、slim.nets.resnet_utils.conv2d_same():使用“SAME”填充的二维卷积

  函数原型:conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None)
    inputs: 一个4维tensor:[batch, height_in, width_in, channels].
    num_outputs:卷积核的个数
    kernel_size: 卷积核的尺寸
    stride: 输出的stride
    rate: 空洞卷积膨胀率
    scope: Scope.


 
 
  1. net = conv2d_same(inputs, num_outputs, 3, stride=stride)
  2. # 等价于
  3. net = slim.conv2d(inputs, num_outputs, 3, stride= 1, padding= 'SAME')
  4. net = subsample(net, factor=stride)
  5. # 但是和net = slim.conv2d(inputs, num_outputs, 3, stride=stride, padding='SAME')不等价,因为当输入的高度
  6. 或宽度是偶数时,它是不同的,这就是我们添加当前函数的原因。
  7. # subsample的源码为:
  8. def subsample(inputs, factor, scope=None):
  9. """Subsamples the input along the spatial dimensions.
  10. Args:
  11. inputs: A `Tensor` of size [batch, height_in, width_in, channels].
  12. factor: The subsampling factor.
  13. scope: Optional variable_scope.
  14. Returns:
  15. output: A `Tensor` of size [batch, height_out, width_out, channels] with the
  16. input, either intact (if factor == 1) or subsampled (if factor > 1).
  17. """
  18. if factor == 1:
  19. return inputs
  20. else:
  21. return slim.max_pool2d(inputs, [ 1, 1], stride=factor, scope=scope)

3、 tf.variable_scope()的original_name_scope 和 name的区别:


 
 
  1. with tf.variable_scope( 'a') as a:
  2. print(a.name)
  3. print(a.original_name_scope)
  4. print(a.original_name_scope)
  5. with tf.variable_scope( 'a') as b:
  6. print(b.name)
  7. print(b.original_name_scope)
  8. 输出:
  9. a
  10. a/
  11. a/
  12. a
  13. a_1/

    foo.name返回scope的名称(String)。 另一方面,foo.original_name_scope返回与foo.name相同的字符串,除非相同的scope被重新创建。 在这种情况下,所有子范围都会根据需要附加一个_#,以便对foo.original_name_scope进行所有调用,为范围的每个实例返回唯一的内容。

4、slim.utils.collect_named_outputs(collections, alias, outputs):为output的tensor添加别名,并将tensor添加到collections的列表中

    如果这个(列表名,列表)键值对存在于Graph的self._collection字典中,则只是在列表上添加,否则会在字典中创建键值对。源码如下:  


 
 
  1. def collect_named_outputs(collections, alias, outputs):
  2. if collections:
  3. append_tensor_alias(outputs, alias)
  4. # 将outputs添加到collections的列表中,这个(collections,[outputs])位于Graph的self._collection中
  5. ops.add_to_collections(collections, outputs)
  6. return outputs
  7. def append_tensor_alias(tensor, alias):
  8. if alias[ -1] == '/':
  9. alias = alias[: -1]
  10. if hasattr(tensor, 'aliases'):
  11. tensor.aliases.append(alias)
  12. else:
  13. tensor.aliases = [alias]
  14. return tensor

5、slim.separable_conv2d():实现深度可分离卷积


 
 
  1. def separable_convolution2d(
  2. inputs,
  3. num_outputs,
  4. kernel_size,
  5. depth_multiplier=1,
  6. stride=1,
  7. padding='SAME',
  8. data_format=DATA_FORMAT_NHWC,
  9. rate=1,
  10. activation_fn=nn.relu,
  11. normalizer_fn=None,
  12. normalizer_params=None,
  13. weights_initializer=initializers.xavier_initializer(),
  14. pointwise_initializer=None,
  15. weights_regularizer=None,
  16. biases_initializer=init_ops.zeros_initializer(),
  17. biases_regularizer=None,
  18. reuse=None,
  19. variables_collections=None,
  20. outputs_collections=None,
  21. trainable=True,
  22. scope=None):
  23. """一个2维的可分离卷积,可以选择是否增加BN层。
  24. 这个操作首先执行逐通道的卷积(每个通道分别执行卷积),创建一个称为depthwise_weights的变量。如果num_outputs
  25. 不为空,它将增加一个pointwise的卷积(混合通道间的信息),创建一个称为pointwise_weights的变量。如果
  26. normalizer_fn为空,它将给结果加上一个偏置,并且创建一个为biases的变量,如果不为空,那么归一化函数将被调用。
  27. 最后再调用一个激活函数然后得到最终的结果。
  28. Args:
  29. inputs: 一个形状为[batch_size, height, width, channels]的tensor
  30. num_outputs: pointwise 卷积的卷积核个数,如果为空,将跳过pointwise卷积的步骤.
  31. kernel_size: 卷积核的尺寸:[kernel_height, kernel_width],如果两个的值相同,则可以为一个整数。
  32. depth_multiplier: 卷积乘子,即每个输入通道经过卷积后的输出通道数。总共的输出通道数将为:
  33. num_filters_in * depth_multiplier。
  34. stride:卷积步长,[stride_height, stride_width],如果两个值相同的话,为一个整数值。
  35. padding: 填充方式,'VALID' 或者 'SAME'.
  36. data_format:数据格式, `NHWC` (默认) 和 `NCHW`
  37. rate: 空洞卷积的膨胀率:[rate_height, rate_width],如果两个值相同的话,可以为整数值。如果这两个值
  38. 任意一个大于1,那么stride的值必须为1.
  39. activation_fn: 激活函数,默认为ReLU。如果设置为None,将跳过。
  40. normalizer_fn: 归一化函数,用来替代biase。如果归一化函数不为空,那么biases_initializer
  41. 和biases_regularizer将被忽略。 biases将不会被创建。如果设为None,将不会有归一化。
  42. normalizer_params: 归一化函数的参数。
  43. weights_initializer: depthwise卷积的权重初始化器
  44. pointwise_initializer: pointwise卷积的权重初始化器。如果设为None,将使用weights_initializer。
  45. weights_regularizer: (可选)权重正则化器。
  46. biases_initializer: 偏置初始化器,如果为None,将跳过偏置。
  47. biases_regularizer: (可选)偏置正则化器。
  48. reuse: 网络层和它的变量是否可以被重用,为了重用,网络层的scope必须被提供。
  49. variables_collections: (可选)所有变量的collection列表,或者是一个关键字为变量值为collection的字典。
  50. outputs_collections: 输出被添加的collection.
  51. trainable: 变量是否可以被训练
  52. scope: (可选)变量的命名空间。
  53. Returns:
  54. 代表这个操作的输出的一个tensor

6、slim.learning.train():开始训练

    slim.learning.train()的源码如下:


 
 
  1. _USE_DEFAULT= 0
  2. def train(train_op,
  3. logdir,
  4. train_step_fn=train_step,
  5. train_step_kwargs=_USE_DEFAULT,
  6. log_every_n_steps=1,
  7. graph=None,
  8. master='',
  9. is_chief=True,
  10. global_step=None,
  11. number_of_steps=None,
  12. init_op=_USE_DEFAULT,
  13. init_feed_dict=None,
  14. local_init_op=_USE_DEFAULT,
  15. init_fn=None,
  16. ready_op=_USE_DEFAULT,
  17. summary_op=_USE_DEFAULT,
  18. save_summaries_secs=600,
  19. summary_writer=_USE_DEFAULT,
  20. startup_delay_steps=0,
  21. saver=None,
  22. save_interval_secs=600,
  23. sync_optimizer=None,
  24. session_config=None,
  25. session_wrapper=None,
  26. trace_every_n_steps=None,
  27. ignore_live_threads=False):
  28. """
  29. 使用TensorFlow 的监督器(supervisor)来运行训练循环。 提供sync_optimizer时,讲同步进行梯度更新,否则将异步进行梯度更新。
  30. args:
  31. train_op: 这是一个`Tensor`,当被执行的时候,将进行梯度更新并返回损失值。,
  32. logdir: 训练损失(trian loss)写入的目录。
  33. train_step_fn: 为了执行单次梯度跟新操作,这个函数将会被调用。这个函数必须有四个参数:session、train_op、 global step、dictionary.
  34. train_step_kwargs: 传给train_step_fn的一个dictionary,默认情况下,两个叫做"should_stop" 和"should_log"的布尔值需要提供。
  35. log_every_n_steps: 多少次迭代保存一次训练损失。
  36. graph: 传递给监督其supervisor的图,如果为空,则使用默认的graph。
  37. master: tensorflow master的地址
  38. is_chief: 指定是否在主要副本上运行training。
  39. global_step: 代表全局step的tensor,如果为空,那么将会调用training_util.get_or_create_global_step(),
  40. number_of_steps: 训练时最大的梯度更新次数,当global step大于这个值时,停止训练。如果这个值为空,则训练不会停止下来。
  41. init_op: 初始化操作,如果为空,则调用tf.global_variables_initializer()初始化
  42. init_feed_dict: 当执行初始化操作时的需要feed进去的一个字典
  43. local_init_op: 局部初始化操作,如果为空,则调用tf.local_variables_initializer()和 tf.tables_initializer()来初始化
  44. init_fn: 在Init_op被执行后,一个可选的调用函数。这个函数需要接受一个参数,即被初始化的session。
  45. ready_op: 检查模型是否准备好了的操作,如果为空,将会调用tf.report_uninitialized_variables()。
  46. summary_op: summary操作。
  47. save_summaries_secs: 多少秒保存一次summaries。
  48. summary_writer: 一个SummaryWriter,如果为None,则不会又summary会被写入。如果没有设置该值,将会自动创建一个SummaryWriter。
  49. startup_delay_steps: 在梯度更新之前需要等待的step数。如果sync_optimizer被提供,则这个值必须为0.
  50. saver: 保存checkpoint文件的saver,如果为None,一个默认的saver将会被创建。
  51. save_interval_secs: 多少秒保存一次模型的checkpoint文件到logdir。
  52. sync_optimizer: tf.train.SyncReplicasOptimizer的一个实例,或者这个实例的一个列表。如果这个参数被更新,则梯度更新操作将同步进行。如果为None,则梯度更新操作将异步进行。
  53. session_config: tf.ConfigProto的一个实例,用于配置Session,如果为None,则将会创建一个默认值。
  54. session_wrapper: 会话包装器,它把tf.Session作为唯一的参数传入,返回一个和tf.Session具有相同方法的包装后的session。如果不为None,则包装后的对象将会在训练中使用。
  55. trace_every_n_steps: 以一种Chrome trace format生成并保存Timeline 保存的频率为trace_every_n_steps,如果为None, 没有任何trace信息将会别保存。
  56. ignore_live_threads: 如果为True,则忽略那些在停止supervisor之后仍然在运行的线程,而不是引发RuntimeError。
  57. Returns:
  58. 训练后的损失函数的值
  59. '''

7、slim.evaluation.evaluation_loop():对模型的预测结果进行评估

    slim.evaluation.evalutation_loop()的源码如下:    


 
 
  1. 通常,如果我们想要评估一个保存在磁盘上的模型的checkpoint文件时,可以在一个机制集合上进行单次或者多次评估。为了评估一个特定的模型,我们需要定义 0或者更多metric和 0或者更多summary,然后调用evaluation_loop。
  2. # 创建模型并获取预测值:
  3. images, labels = LoadData(...)
  4. predictions = MyModel(images)
  5. # 选择需要计算的评估指标
  6. names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({
  7. "accuracy": slim.metrics.accuracy(predictions, labels),
  8. "mse": slim.metrics.mean_squared_error(predictions, labels),
  9. })
  10. # 定义需要写入的summary
  11. for metric_name, metric_value in metrics_to_values.iteritems():
  12. tf.summary.scalar(metric_name, metric_value)
  13. checkpoint_dir = '/tmp/my_model_dir/'
  14. log_dir = '/tmp/my_model_eval/'
  15. # 评估1000个batch
  16. num_evals = 1000
  17. # 每10分钟评估一次
  18. slim.evaluation_loop(
  19. '',
  20. checkpoint_dir,
  21. logdir,
  22. num_evals=num_evals,
  23. eval_op=names_to_updates.values(),
  24. summary_op=tf.contrib.deprecated.merge_summary(summary_ops),
  25. eval_interval_secs= 600)
  26. def evaluation_loop(master,
  27. checkpoint_dir,
  28. logdir,
  29. num_evals=1,
  30. initial_op=None,
  31. initial_op_feed_dict=None,
  32. init_fn=None,
  33. eval_op=None,
  34. eval_op_feed_dict=None,
  35. final_op=None,
  36. final_op_feed_dict=None,
  37. summary_op=_USE_DEFAULT,
  38. summary_op_feed_dict=None,
  39. variables_to_restore=None,
  40. eval_interval_secs=60,
  41. max_number_of_evaluations=None,
  42. session_config=None,
  43. timeout=None,
  44. timeout_fn=None,
  45. hooks=None):
  46. """返回Slim的评估循环
  47. Args:
  48. master:TensorFlow master的BNS地址
  49. checkpoint_dir: checkpoint文件所在的目录
  50. logdir: summaries被写入的目录。
  51. num_evals: 运行eval_op的次数,通常num_eval=num_batch
  52. initial_op: 初始化操作,在evaluation之前运行
  53. initial_op_feed_dict: 当执行初始化操作时的feed dictionary
  54. init_fn: (可选)一个回调函数,在初始化被调用之后执行。这个回调函数必须接受一个参数,即初始化的session。
  55. eval_op: 一个评估操作,总共需要运行num_evals次,即每个batch运行一次
  56. eval_op_feed_dict: 当执行eval_op时所要用的feed dictionary
  57. final_op: 一个最终操作,在所有的eval_op被执行完以后执行,final_op的值被返回
  58. final_op_feed_dict: 当执行final_op时的一个feed dictionary
  59. summary_op: 在运行slim的metric操作后的评估的summary_op,默认情况下,summary_op被设置为tf.summary.merge_all().
  60. summary_op_feed_dict: (可选)当运行summary_op时的一个feed dictionary
  61. variables_to_restore: 在评估期间需要恢复的变量列表,如果为None,那么默认为slim.variables.GetVariablesToRestore()
  62. eval_interval_secs: 两次评估之间的间隔(单位/秒),即多久evaluation一次
  63. max_number_of_evaluations: 评估迭代的最大次数,如果这个值设置为None,那么评估将无限进行。
  64. session_config: 一个tf.ConfigProto的实例,如果为None,则默认的将会别使用。
  65. timeout: 超时时间, The maximum amount of time to wait between checkpoints.如果为None,那么程序将一直等待。
  66. timeout_fn: (可选)在超时之后被调用的函数。如果这个函数返回True,那么意味着没有新的checkpoint文件会被创建,迭代将会被终止,这个函数被调用时没有任何参数。
  67. hooks: 一个额外的SessionRunHook对象的列表,在重复的评估时被传入
  68. Returns:
  69. 如果final_op不为空的话返回final_op执行后的值,如果final_op为空的话,则返回None。
  70. """
  71. if summary_op == _USE_DEFAULT:
  72. summary_op = summary.merge_all()
  73. all_hooks = [evaluation.StopAfterNEvalsHook(num_evals),]
  74. if summary_op is not None:
  75. all_hooks.append(evaluation.SummaryAtEndHook(
  76. log_dir=logdir, summary_op=summary_op, feed_dict=summary_op_feed_dict))
  77. if hooks is not None:
  78. # Add custom hooks if provided.
  79. all_hooks.extend(hooks)
  80. saver = None
  81. if variables_to_restore is not None:
  82. saver = tf_saver.Saver(variables_to_restore)
  83. return evaluation.evaluate_repeatedly(
  84. checkpoint_dir,
  85. master=master,
  86. scaffold=monitored_session.Scaffold(
  87. init_op=initial_op, init_feed_dict=initial_op_feed_dict,
  88. init_fn=init_fn, saver=saver),
  89. eval_ops=eval_op,
  90. feed_dict=eval_op_feed_dict,
  91. final_ops=final_op,
  92. final_ops_feed_dict=final_op_feed_dict,
  93. eval_interval_secs=eval_interval_secs,
  94. hooks=all_hooks,
  95. config=session_config,
  96. max_number_of_evaluations=max_number_of_evaluations,
  97. timeout=timeout,
  98. timeout_fn=timeout_fn)

8、slim.get_variables_to_restore(include=None, exclude=None):

  获取所有变量,包括模型变量(如权重和参数)和常规变量(如global step),可以传入scope进行过滤,源码如下


 
 
  1. def get_variables_to_restore(include=None, exclude=None):
  2. """Gets the list of the variables to restore.
  3. Args:
  4. include:一个可选的scope的列表或者元组,用来过滤来自VARIABLES collection中的变量。如果为None,则包含所有的变量。
  5. exclude: 一个可选的scope的列表或者元组,用来用来过滤来自VARIABLES collection中的变量。如果为None,则过滤掉所有的变量。
  6. Returns:
  7. 变量列表
  8. """
  9. if include is None:
  10. # 包含所有变量,包括model_variable和regular_variable
  11. vars_to_include = get_variables()
  12. else:
  13. if not isinstance(include, (list, tuple)):
  14. raise TypeError( 'include is provided but is not a list or a tuple.')
  15. vars_to_include = []
  16. for scope in include:
  17. vars_to_include += get_variables(scope)
  18. vars_to_exclude = set()
  19. if exclude is not None:
  20. if not isinstance(exclude, (list, tuple)):
  21. raise TypeError( 'exclude is provided but is not a list or a tuple.')
  22. for scope in exclude:
  23. vars_to_exclude |= set(get_variables(scope))
  24. # Exclude the variables in vars_to_exclude
  25. return [v for v in vars_to_include if v not in vars_to_exclude]

9、slim.assign_from_checkpoint_fn():

     返回一个函数,它从checkpoint文件读取变量值并分配给给特定变量。如果ignore_missing_vars为True,并且在检查点中找不到变量,则返回None。函数的源码如下


 
 
  1. def assign_from_checkpoint_fn(model_path, var_list, ignore_missing_vars=False,
  2. reshape_variables=False):
  3. """
  4. Args:
  5. model_path: 模型的checkpoint文件的绝对路径。为了得到最新的checkpoint文件,可以使用:model_path = tf.train.latest_checkpoint(checkpoint_dir)
  6. var_list: A list of `Variable` objects or a dictionary mapping names in the
  7. checkpoint to the corresponding variables to initialize. If empty or
  8. `None`, it would return `no_op(), None`.
  9. ignore_missing_vars: Bool型,如果为True,它将忽略在checkpoint文件中缺失的那些变量,。
  10. reshape_variables: Bool型, 如果为真,那么那些与checkpoint文件中的变量有不同形状的变量将会自动被reshape。
  11. Returns:
  12. 一个只需要一个参数(tf.Session)函数,它作用是进行赋值操作。如果在checkpoint文件中没有找到任何匹配的变量,那么将会返回None
  13. """
  14. if not var_list:
  15. raise ValueError( 'var_list cannot be empty')
  16. if ignore_missing_vars:
  17. reader = pywrap_tensorflow.NewCheckpointReader(model_path)
  18. if isinstance(var_list, dict):
  19. var_dict = var_list
  20. else:
  21. var_dict = {var.op.name: var for var in var_list}
  22. available_vars = {}
  23. for var in var_dict:
  24. if reader.has_tensor(var):
  25. available_vars[var] = var_dict[var]
  26. else:
  27. logging.warning(
  28. 'Variable %s missing in checkpoint %s', var, model_path)
  29. var_list = available_vars
  30. if var_list:
  31. saver = tf_saver.Saver(var_list, reshape=reshape_variables)
  32. def callback(session):
  33. saver.restore(session, model_path)
  34. return callback
  35. else:
  36. logging.warning( 'No Variables to restore')
  37. return None

10、tf.contrib.metrics.aggregate_metric_map():

    将{metric_name:(value_tensor, update_op)}的字典转为两个字典:{metric_name:value_tensor}和{metric_name:update_op},其中(value_tensor, update_op)由tf.metric.xxx函数产生。当metric列表的长度很长的话,将metric_name和与之相关的value_tensor和update_op配对是非常有效的。   


 
 
  1. Args:
  2. names_to_tuples: 一个metric_name到tuples的映射。每个tuple包含metric数据流的键值对:(value_tensor, update_op)
  3. Returns:
  4. 返回两个字典,一个是包含metric_name到value_tensor的映射,另一个包含metric_name到update_op的映射。
  5. Example:
  6. metrics_to_values, metrics_to_updates = slim.metrics.aggregate_metric_map({
  7. 'Mean Absolute Error': new_slim.metrics.streaming_mean_absolute_error(
  8. predictions, labels, weights),
  9. 'Mean Relative Error': new_slim.metrics.streaming_mean_relative_error(
  10. predictions, labels, labels, weights),
  11. 'RMSE Linear': new_slim.metrics.streaming_root_mean_squared_error(
  12. predictions, labels, weights),
  13. 'RMSE Log': new_slim.metrics.streaming_root_mean_squared_error(
  14. predictions, labels, weights),
  15. })

11、Slim.conv2d_transpose():实现反卷积

   这里反卷积的输出需要根据stride和padding方式进行计算。假设反卷积输入为 [x,x] , 输出为 [y,y],当padding为SAME时,y = x * stride ;当padding为VALID时, ( y - kernel_size ) /  stride  + 1 =  x ,根据x可以求出y。更详细的理解参考这里


 
 
  1. def convolution2d_transpose(
  2. inputs,
  3. num_outputs,
  4. kernel_size,
  5. stride=1,
  6. padding='SAME',
  7. data_format=DATA_FORMAT_NHWC,
  8. activation_fn=nn.relu,
  9. normalizer_fn=None,
  10. normalizer_params=None,
  11. weights_initializer=initializers.xavier_initializer(),
  12. weights_regularizer=None,
  13. biases_initializer=init_ops.zeros_initializer(),
  14. biases_regularizer=None,
  15. reuse=None,
  16. variables_collections=None,
  17. outputs_collections=None,
  18. trainable=True,
  19. scope=None):
  20. """
  21. 增加一个带BN的反卷积层,这个函数创建一个weights变量代表卷积核,与输入进行卷积。如果normalizer_fn为None,第二个biase变量将会被创建,加在卷积后的结果上面。
  22. Args:
  23. inputs: 一个四维Tensor,形状为:[batch, height, width, in_channels]
  24. num_outputs: 整数,卷积核的个数.
  25. kernel_size: 卷积核大小,形状为[kernel_height, kernel_width],如果高和宽相同的话也可以是一个整数.
  26. stride: 卷积步长[stride_height, stride_width].如果高和宽相同的话也可以是一个整数.
  27. padding: 填充方式: 'VALID' 或者 'SAME'.
  28. data_format: 数据格式: `NHWC` (默认) 和 `NCHW`
  29. activation_fn: 激活函数,默认为ReLU。如果设置为None,则不使用激活函数。
  30. normalizer_fn: 归一化函数,用于代替biase的,如果归一化函数不为空,那么`biases_initializer`和`biases_regularizer` 将会被忽略,而且`biases`不会被添加到卷积结果。默认设置为None.
  31. normalizer_params: 归一化函数的参数
  32. weights_initializer: 权重初始化器,默认为xavier_initializer()
  33. weights_regularizer:权重正则化器,默认为None。
  34. biases_initializer: 偏置初始化器,默认是0初始化。如果设置为None,则跳过。
  35. biases_regularizer: 偏置正则化器,默认为None。
  36. reuse: 是否重用该网络层机器变量,如果重用网络层,那么必须提供scope
  37. variables_collections: 变量集合,即把所有变量添加到这个集合中,默认为None.
  38. outputs_collections: 输出结果集合,把结果添加到这个集合中,默认为None
  39. trainable: 变量是否可训练,默认为True。
  40. scope: 变量的variable_scope
  41. Returns:
  42. A tensor representing the output of the operation.

12、slim.batch_norm():实现批量归一化


 
 
  1. def batch_norm(inputs,
  2. decay=0.999,
  3. center=True,
  4. scale=False,
  5. epsilon=0.001,
  6. activation_fn=None,
  7. param_initializers=None,
  8. param_regularizers=None,
  9. updates_collections=ops.GraphKeys.UPDATE_OPS,
  10. is_training=True,
  11. reuse=None,
  12. variables_collections=None,
  13. outputs_collections=None,
  14. trainable=True,
  15. batch_weights=None,
  16. fused=None,
  17. data_format=DATA_FORMAT_NHWC,
  18. zero_debias_moving_mean=False,
  19. scope=None,
  20. renorm=False,
  21. renorm_clipping=None,
  22. renorm_decay=0.99,
  23. adjustment=None):
  24. """
  25. 添加一个BN层,对于conv2d和fully_connected而言,BN层相当于一个归一化函数。对于CNN中的一个batch而言,
  26. 对所有样本的同一位置的所有特征图进行归一化,如第一个样本的第一个特征图、第二个样本的第一个特征图......、
  27. 第m个样本的第一个特征图进行归一化,它们共享均值、方差、beta、gamma。每个特征图被当做一个神经元来处理。
  28. 注意: 训练时moving_mean 和 moving_variance 需要被更新,默认情况下,更新操作位于 `tf.GraphKeys.UPDATE_OPS`,
  29. 因此需要把这些更新操作添加到`train_op`的依赖中,比如:
  30. ```
  31. update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  32. with tf.control_dependencies(update_ops):
  33. train_op = optimizer.minimize(loss)
  34. ```
  35. Args:
  36. inputs: 一个四维tensor:[batch_size ,height,width ,channel]
  37. decay: moving average的衰减因子. `decay`的合理值是接近于1. 典型为: 0.999, 0.99, 0.9等。如果模型在训练集上表现很好,但是验证集或者测试集很差,则可以把decay设置为更小的值,比如0.9. 为了改善性能,可以尝试zero_debias_moving_mean=True。
  38. center:如果为true,则对归一化后的tensor添加偏置,如果为false,'beta'将会别忽略。
  39. scale: 如果为true, 则乘以 `gamma`.如果为False, `gamma` 将不被使用. 如果下一层是线性的,比如nn.relu,那么scale将会失效,因为缩放可以被下一层实现。
  40. epsilon: 一个加在方差上的小的浮点数,避免除零错误。
  41. activation_fn: 激活函数,默认为None。
  42. param_initializers: (可选)初始化器,为beta, gamma, moving mean,oving variance进行初始化。
  43. param_regularizers: (可选)参数正则化器,为beta和gamma进行正则化。
  44. updates_collections: 更新操作的集合,这个跟新操作需要和train_op同时执行,如果为None,必须要添加控制依赖,确保更新操作被计算。C
  45. is_training: BN层是否是训练模式,如果是训练模式,将使用指数滑动平均和decay参数计算`moving_mean`和`moving_variance`. 如果不是训练模型,将直接使用`moving_mean`和'moving_variance`.
  46. reuse: 该BN层的变量是否被重用,如果要重用,则需要提供scope。
  47. variables_collections: (可选)变量的集合。
  48. outputs_collections: BN层输出的集合。
  49. trainable: 如果为True,则把变量添加到`GraphKeys.TRAINABLE_VARIABLES`
  50. batch_weights: (可选)一个tensor,形状为:'[batch_size]`,包含一系列batch条目的权重。如果提供,那么BN的归一化过程中将对mean和variance进行加权处理。
  51. fused: 如果为None或者True,则使用一个更快的实现方式。如果为False,那么使用系统推荐的实现方式。
  52. data_format: 数据格式 `NHWC` (default) 或`NCHW`。
  53. zero_debias_moving_mean: 为moving_mean使用zero_debias.它创建了一个新的变量对, 'moving_mean/biased' 和 'moving_mean/local_step'.
  54. scope: (可选)变量的`variable_scope`.
  55. renorm: 是否使用batch重归一化,这在训练时增加了额外的变量,该变量对预测时不影响。
  56. renorm_clipping: 这个重归一化的把'rmax', 'rmin', 'dmax' 映射为`Tensors`一个字典, 用来对重归一化指定范围。`(r, d)` 用于`corrected_value = normalized_value * r + d`,`r` 属于[rmin, rmax], `d`属于 [-dmax, dmax]. 如果没有rmax, rmin, dmax 将被设置为 inf, 0, inf.
  57. renorm_decay: 重归一化的权重衰减。
  58. adjustment: 这是一个调整函数,对输入值进行调整。
  59. Returns:
  60. A `Tensor` representing the output of the operation.

13、slim.max_pool2d()、slim.avg_pool2d():实现最大或者均值池化:


 
 
  1. def max_pool2d(inputs,
  2. kernel_size,
  3. stride=2,
  4. padding='VALID',
  5. data_format=DATA_FORMAT_NHWC,
  6. outputs_collections=None,
  7. scope=None):
  8. """Adds a 2D Max Pooling op.
  9. Args:
  10. inputs: 一个4-D tensor,形状为[batch_size, height, width, channels]或者[batch_size, channels, height, width]
  11. kernel_size: 池化核的尺寸: [kernel_height, kernel_width],如果两个值相同的话可以为一个整数值。
  12. stride: 池化步长 [stride_height, stride_width].如果两个值相同的话可以为一个整数值。
  13. padding: 填充方式,为 'VALID' 或者 'SAME'.
  14. data_format: 数据格式,支持 `NHWC` (default)和 `NCHW`
  15. outputs_collections: 输出被添加到的集合
  16. scope: 可选的name_scope.
  17. Returns:
  18. 返回池化操作后的tensor.
  19. """
  20. def avg_pool2d(inputs,
  21. kernel_size,
  22. stride=2,
  23. padding='VALID',
  24. data_format=DATA_FORMAT_NHWC,
  25. outputs_collections=None,
  26. scope=None):
  27. """Adds a 2D average pooling op.
  28. """Adds a 2D Max Pooling op.
  29. Args:
  30. inputs: 一个 4-D tensor,形状为[batch_size, height, width, channels]或者[batch_size, channels, height, width]
  31. kernel_size: 池化核的尺寸: [kernel_height, kernel_width],如果两个值相同的话可以为一个整数值。
  32. stride: 池化步长 [stride_height, stride_width].如果两个值相同的话可以为一个整数值。
  33. padding: 填充方式,为 'VALID' 或者 'SAME'.
  34. data_format: 数据格式,支持 `NHWC` (default)和 `NCHW`
  35. outputs_collections: 输出被添加到的集合
  36. scope: 可选的name_scope.
  37. Returns:
  38. 返回池化操作后的tensor.
  39. """

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值