通过阅读代码来学习,一向时最直接快速的。本章将讲解slim的第一层目录tensorflow/tensorflow/contrib/slim/python/slim的代码。

本层代码主要包括learning.py, evaluation.py, summary.py, queue.py和model_analyzer.py,分别对应模型的训练,测试,日志记录,队列管理和模型分析部分。

让巴默索泪来带你由易到难来阅读下这些代码吧。以下内容基本按照难度排序。

1. 模型分析模块 model_analyzer.py

这段代码提供了分析Tensorflow图中的运算和变量的工具。

  #To analyze the operations in a graph:

  images, labels = LoadData(...)  
  predictions = MyModel(images)

  slim.model_analyzer.analyze_ops(tf.get_default_graph(), print_info=True)

  #To analyze the model variables in a graph:

  variables = tf.model_variables()  

  slim.model_analyzer.analyze_vars(variables, print_info=False)

2. queue.py提供了队列内容管理代码

3. summaries.py 包括了生成日至纪录的辅助函数, summaries_test.py是它的一个测试,使用例子见下:

  import tensorflow as tf
  slim = tf.contrib.slim

  slim.summaries.add_histogram_summaries(slim.variables.get_model_variables())
  slim.summaries.add_scalar_summary(total_loss, 'Total Loss')
  slim.summaries.add_scalar_summary(learning_rate, 'Learning Rate')
  slim.summaries.add_histogram_summaries(my_tensors)
  slim.summaries.add_zero_fraction_summaries(my_tensors)

4.  evaluation.py一般不会使用slim的代码,故忽略。

5. 最重要的训练模型的代码在learning.py中,其中learning_test.py是一个测试例子

learning.py中包括训练模型所需的多个函数,包括操作梯度,生成一个训练操作(train_op, 一个计算loss并应用梯度的操作)以及训练的循环函数。训练循环要求用户传入train_op就可以进行优化。注意在这里训练循环使用了tf.train.Supervisor以及在它代码实现中的managed_session,这可以保证机器可以从运行失败中恢复训练。Supervisor是对负责训练程序的Coordinator,Saver和SessionManager的封装。下面是一个简单的例子:

  # Load data and create the model:

  images, labels = LoadData(...)
  predictions = MyModel(images)

  # Define the loss:
  slim.losses.log_loss(predictions, labels)
  total_loss = slim.losses.get_total_loss()

  # Define the optimizer:
  optimizer = tf.train.MomentumOptimizer(FLAGS.learning_rate, FLAGS.momentum)

  # Create the train_op
  train_op = slim.learning.create_train_op(total_loss, optimizer)

  # Run training.
  slim.learning.train(train_op, my_log_dir)

训练必须首先定义一个 train_op, 它的作用包括:(1)计算损失(2)将梯度运用于参数的更新(3)返回损失值

train_op有时还必须在训练时,执行额外的非梯度更新的操作,比如batch_norm。batch_norm在训练时需要执行一系列非梯度的更新操作。slim.learning.create_train_op允许用户同时将update_ops的列表以及梯度更新操作同时传递给函数。

  train_op = slim.learning.create_train_op(total_loss, optimizer, update_ops)  

默认情况下,slim.learning.create_train_op包括了所有在tf.GraphKeys.UPDATE_OPS集合中的更新操作。而且,slim的slim.batch_norm函数将moving mean和moving variance的更新加入了这个集合。因此,使用slim.batch_norm的用户不用考虑任务多余的步骤就能保证moving mean 和moving variance的更新会被正确的计算。如果用户需要加入额外的更新操作,可以使用下面的代码:

  # Force TF-Slim NOT to use ANY update_ops:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=[])

  # Use an alternative set of update ops:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=my_other_update_ops)

  # Use an alternative set of update ops in addition to the default updates:
  tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, my_update0)
  tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, my_update1)

  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer)

  # Which is the same as:
  train_op = slim.learning.create_train_op(
  total_loss,
  optimizer,
  update_ops=tf.get_collection(tf.GraphKeys.UPDATE_OPS))

learning训练最重要的有两个函数:create_train_op以及train

(1)def create_train_op(total_loss,
                     optimizer,
                                 global_step=_USE_GLOBAL_STEP,
                                       update_ops=None,
                                       variables_to_train=None,
                                       clip_gradient_norm=0,
                                       summarize_gradients=False,
                                       gate_gradients=tf_optimizer.Optimizer.GATE_OP,
                                       aggregation_method=None,
                                       colocate_gradients_with_ops=False,
                                       gradient_multipliers=None,
                                       check_numerics=True)

clip_gradient_norm:当它大于0时,梯度被截止于这个值。

返回值时一个Tensor,它计算了梯度并返回了loss值。

(2)def train(train_op,

logdir,
train_step_fn=train_step,
train_step_kwargs=_USE_DEFAULT,
log_every_n_steps=1,
graph=None,
master='',
is_chief=True,
global_step=None,
number_of_steps=None,
init_op=_USE_DEFAULT,
init_feed_dict=None,
local_init_op=_USE_DEFAULT,
init_fn=None,
ready_op=_USE_DEFAULT,
summary_op=_USE_DEFAULT,
save_summaries_secs=600,
summary_writer=_USE_DEFAULT,
startup_delay_steps=0,
saver=None,
save_interval_secs=600,
sync_optimizer=None,
session_config=None,
trace_every_n_steps=None)

这个函数使用Tensorflow的supervisor运行了一个训练循环。当使用sync_optimizer时,梯度计算是同步进行的。否则,梯度计算是异步进行的。

参数:

log_every_n_steps:损失函数和step的打印频率

master:tensorflow master的地址

is_chief:指定是否训练是有主副本实现的,当进行多副本训练时。

sync_optimizer:   一个tf.SyncReplicasOptimizer 或它们的一个列表。如果提供了这个参数,梯度更新会是同步的,如果使用None,则更新是异步的。

Tensorflow-slim 学习笔记(二)第一层目录代码解读的更多相关文章

  1. SpringMVC学习笔记二第一个小的程序

    首先:我们要用springmvc来写一个helloworld的例子: 首先我们需要导入所需要的架包: /demo1/WebRoot/WEB-INF/lib/commons-logging-1.1.1. ...

  2. Beego 学习笔记二:第一个项目

    第一个MVC项目 1>     使用beego命令,创建一个项目 首先切换到创建项目的位置,输入bee new firstweb命令,创建成功之后会出现一个名为firstweb的文件夹 2> ...

  3. 【linux学习笔记二】常见目录的作用

  4. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  5. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  6. Linux学习笔记(二) 文件管理

    了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...

  7. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  8. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  9. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. mybatis作用、基本使用、小结

    1. MyBatis 1.1. 作用 MyBatis是持久层框架,它是支持JDBC的!简化了持久层开发! 使用MyBatis时,只需要通过接口指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可 ...

  2. 产品相关 做产品VS做项目

    做产品VS做项目 by:授客 QQ:1033553122 相关定义 根据GB/T19000—2008<质量管理体系基础和术语>,有以下定义 过程process 一组将输入转化为输出的相互关 ...

  3. Ubuntu 16.04 小飞机启动失败

    好长时间没用小飞机了,今天打开发现,无法启动了. 查看了日志: Initialising ciphers... AES-256/CFB (aes-256-cfb) initialised. Runni ...

  4. Pig distinct用法举例

    dst = distinct data:   DISTINCT只能对整个记录(整行)去重,不能在字段级别去重.   触发reduce阶段   data = load 'data'; distinct ...

  5. 4.Servlet过滤器

    1.Servlet 编写过滤器 Servlet 过滤器是可用于 Servlet 编程的 Java 类,有以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理 ...

  6. vuejs electron webpack集成使用

    传统的vue SPA页面在浏览器环境中使用,但是有的时候我们还希望能够做成一个类似于桌面的app在PC上使用,希望不仅可以使用所有的浏览器SPA的功能,你也可能外加host os的功能,比如文件的本地 ...

  7. SQL server数据库压缩空间

    SQL server数据库,在手动删除或者自动删除数据后,查看数据库物理文件发现占用空间并没有释放,果断采用万能的重启.(反正是自己用的一个服务器,随便玩.如果不是只有自己用的服务器,还是建议让运维或 ...

  8. C# 输入一个整数,求质因数

    质数,质因数 应该都了解,在这里不过多解释,直接上代码: List<int> results = new List<int>(); int number = Int32.Par ...

  9. 【Excel】如何用SUMIF实现SUMIFS的功能

    如何用SUMIF实现SUMIFS的功能   添加辅助列,辅助列内容为"条件区域1内容+条件区域内容2" 举个例子,我要挑选出"二车间"的"过桥过路费& ...

  10. September 30th 2017 Week 39th Saturday

    The simplest answer is often the correct one. 最简单的答案通常是最正确的答案. Simplest is always best. Sometimes yo ...