Tensorow slim
TensorFlow-Slim
TF-Slim 是一个用于定义、训练、和评估复杂模型的 TensorFlow 高级库。tf-slim 能与原生 tensorow 和其他高层框架(如
tf.contrib.learn 等)混合使用。
使用 Tf-Slim
import tensorow as tf
import tensorow.contrib.slim as slim
为什么使用 tf-slim?
TF-Slim 是一个能够简化神经网络的构建、训练和评估流程的高级库 :
通过消除模板化代码,使得用户定义模板的过程变得更加简洁。这是通过参数的作用域和大量高级网络层和变量的定
义来实现的。这些工具能够增加代码的可读性、稳定性,减少超参复制粘贴过程中出错的可能性,同时简化了超参的
调节过层。
提供内置的正则化选项,使得模型开发更加简单
已经实现好的几个常见图像模型(如 VGG,AlexNet 等)。一方面用户可以吧这些模型当作黑匣子来使用,另一方
面,通过在不同的中间层加"multiple heads",这些模型能以多种方式进行扩展。
通过调用预训练的参数,缩短训练时间,Slim 能够轻松地实现复杂的模型。
Tf-slim 包含那些组件?
Tf-Slim 包含多个独立的组成部件,主要包括:
arg_scope:在该参数作用域内,用户可以为特定操作类型定义默认参数。
data:保含了 tf-slim 对于数据集的定义、数据提供者、并行读取和解码工具。
evaluation:包含了模型的评估模板
layers:包含了经过封装的高级网络层,用于构建 tensorow 模型。
learning:包含了模型的训练模板
losses:包含了常用的损失函数
metrics:包含了常用的评估指标
nets:包含了常用的网络模型如 VGG、AlexNet 等等
quenes:包含一个上下文管理机制,用于安全地开启和关闭 QueueRunners
regularizers:包含了正则化选项
variables:包含一些装饰器,用于构造和处理变量
定义模型
通过对变量、网络层和作用域进行组合,tf-slim 能成功构建神经网络模型。不同组件的定义如下。
变量
在原生 tensorow 代码中,创建一个变量需要一个初始化机制(如高斯分布、均匀分布等),或者一个已经定义过的变量。
此外,变量使用的硬件(GPU 或 CPU)必须被明确指定。为了简化创建变量的代码,tf-slim 在文件 variables.py 中提供了
一系列的装饰函数。例如,创建一个权重变量,用 truncated normal distribution 来初始化,并添加 L2 正则化项,且指
定其在 CPU 上运行,我们只需要如下代码:
weights=slim.variable('weights', shape=[10,10,3,3],
initializer=tf.truncated_normal_initializer(stddev=0.1),
regularizer=slim.l2_regularizer(0.05),
device='/CPU:0')
值得注意的是,在原生 tensorow 中,有两种变量:常规变量和局部(临时)变量。其中大部分变量都是常规变量:一旦
创建,这些变量就能通过 savar 存储到磁盘中。局部变量则只存在于会话(session)期间,无法被保存。
tf-slim 通过定义表示模型参数的模型变量(model variables),进一步对变量进行了区分。模型变量在训练过层中被调
整,在评估和推断过层中通过加载点(checkpoint)来加载。模型变量包括由 slim.fully_connected 或 slim.conv2d 创建
的变量等。非模型变量则只是在训练和评估过层中被使用,在实际推断过层中则不使用。例如,global_step 就是一个非模
型变量,只是用于对模型的训练,但它不属于最终模型的组成部分。同样地,moving average variables(滑动平均相关
的变量)会影响模型变量的取值,但他们本身不属于模型变量。
这两种变量在都能在 tf-slim 中被创建和检索:
#model variables
model_weights = slim.model_variable('model_weights', shape=[10,10,3,3],
initializer=tf.truncated_normal_initializer(stddev=0.1),
regularizer=slim.l2_regularizer(0.05),
device='/CPU:0')
#regular variables
model_variables=slim.get_model_variables()
my_var = slim.variable('my_var', shape=[20,1],
initializer=tf.zeros_initializer())
regular_variables_and_model_variables = slim.get_variables()
这是如何运作的呢?当你通过 tf-slim 的 layers 或者 slim.model_variable 函数创建一个模型变量时,tf-slim 自动将该变
量加入集合 tf.GraphKeys.MODEL_VARIABLES 中。如果你想自定义 layers 或者变量,但是仍然希望 tf-slim 管理这些模
型变量,应该怎么做呢?tf.slim 提供了简单的函数用于将自定义变量加入模型变量集合:
评论0
最新资源