还在用原生Tensorflow吗?试试TF-Slim吧

为什么要用TF-Slim?

tf-slim能够将搭建、训练、评估神经网络变的简单:

通过使用参数域(argument scoping)与更多的高抽象层(layer)与变量,允许用户定义更加紧凑的模型,而不像原生tensorflow那样冗余。这个工具增加了代码的可读性与可维护性,减少像粘贴复制参数产生的错误,简化了参数的使用

通过提供常用的正则化方式使得开发模型变的简单

3.内置了常用的视觉模型(VGG、Alextnet…),你可以把它当做一个黑盒子使用,并且也可以根据自己的需求进行修改

Slim使得扩展复杂的模型变的简单,最令人兴奋的是你可以使用已经存在的checkpoints,去训练模型,做迁移学习

TF-Slim有哪些组件?

arg_scope

data

evaluation

layers

learning

losses

metrics

nets

queues

regularizers

variables

Variables

如果使用原生tensorflow创建一个variables,你需要给它一个预定义值,或者初始化机制(如:在高斯模型中随机取值),而且如果一个变量你想要把它创建在GPU上 ,你需要更加相信的指定。为了解放这个过程,TF-Slim提供了一个包裹函数使得我们更加简单的定义变量

例如:下面这个例子,不仅指定了初始化方式、使用L2正则化方式并且还指定了,这个变量在CPU上生成

在原生tensorflow中有两类变量,局部变量与全局变量,全局变量一旦被创建,就可以通过saver保存到磁盘中,而局部变量只存在session生命周期中,一点session关闭则就会被清除,不能保存到磁盘中。

TF-Slim进一步区分变量类型,定义了模型变量,模型变量指的是模型中的参数。模型变量是学习过程中被训练的或者被微调的,在评估模型与推理模型的时候,能够通过checkpoint文件加载到计算图(Graph)中。例如:slim.fully_connected o(创建全连接函数)与slim.conv2d (卷积操作)创建的变量就是模型变量

如果您有自己的自定义层或变量创建,但仍然想要TF-Slim来管理您的模型变量,那该怎么办呢?

TF-Slim提供了一个简单便利的方式添加到模型变量集合中

Layers

TF-Slim另外一个高度抽象的方法就是Layers组件,如果使用原生tensorflow创建一个:

创建权重与偏置变量

将输入变量与权重做卷积操作

加上偏置

应用激活函数,输出

上面是定义一个卷积层的基础步骤,如果创建多个呢?比如说vgg-16?为了减少重复代码,TF-Slim提供了更简单的方式去定义一个卷积。

为了搭建神经网络,TF-Slim提供了一些标准的实现方式

这里写图片描述

TF-Slim也提供了两个元运算( meta-operations),repeat与stack,这两个函数将会更加的精简代码。比如在搭建vgg网络过程中,会有很多3*3相同的网络结构,你需要这样定义:

但是如果使用slim的话,你只需要这样定义:

在inception网络的Inception-Model中,经常碰到的是相同网络结构,但是参数不同,你可能会这样定义:

如果使用stack方法的话,你只需要这样定义:

Scopes

除了name_scope与variable_scope之外,TF-Slim还新添加了一个新的scoping机制叫做arg_scope。允许用户指定一个或多个操作和一组参数,这些参数将传递给arg_scope中定义的每个操作。比如定义三个卷积层,每层都使用L2正则化方式,权重初始化方式都采用标准差为0.01,从高斯函数中随机取值

不难看出,有很多设置是重复的,所以arg_scope,允许相同范围内采用一直的参数设置,并且局部的参数设置会覆盖全局的参数设置

不仅如此,arg_scope还支持嵌套,如下设置全局的激活函数为relu,在全链接层设置局部激活函数为None

Losses

TF-Slim也内置了损失函数,

Training Loop

Fine-Tuing已经存在的模型

模型被训练完以后,可以使用tf.train.Saver保存模型,也可以利用它从checkpoints文件中加载模型

例如:把变量从checkpoint文件中加载到模型中

checkpoint文件就是模型的元数据文件,里面记载了保存模型的历史与最新模型的名称,通过方法,可以得到最近一次ckpt文件的名称。把变量加载进来,这种方式需要重新运算模型,构造静态图,当然也有一种直接把静态图也加载进来,就不需要模型代码了,通过加载模型元数据可以直接恢复静态图。

恢复部分模型

有的时候模型很大比如说残差网络,动辄几百层,也许你只想观察某一层,而不想把所有的变量都加载进来,那么slim也提供了一个简单的方式

评估 Models

一旦我们训练了一个模型,我们想看看模型在实践中表现得如何。这是通过选择一组评价指标来完成的,这些评价指标将对模型的性能进行评分,而评估代码实际上是加载数据,执行模型,将结果与一组真实值进行比较,并记录评估得分。这个步骤可以进行一次或定期重复。网上大多都是粘贴复制,根本没有进行测试,甚至连代码能不能运行都不知道,也就是翻译一番而已,我的环境是tensoflow1.8,执行一直报错

先以为例,我翻阅了源码具体操作如下,其实就是取绝对值,那么这个可能在评价回归模型比较有用,分类模型就没啥用处了。同理也就是取平方。

对于,我测试一直报错,源码如下:一起分析一下

总结的来说,就是需要设置一个normalizer参数,这个参数要与labels shape相同,如果normalizer为0,则这个label就设置为0,否则就是lable与prediction绝对值与normalizer的商。

这个用法我没体会到哪里会用到。也许当你阅读sllim英文文档时候,会搞不明白他们的含义,经过我们源码讨论一波,你是不是稍微有点感觉了?

最常用的还是,准确率,精准率,召回率,这点slim还是比较良心的

这里写图片描述

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180523G0ULU300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券