TensorFlow 变量保存和恢复

变量(Variables)

当你训练一个模型的时候,我们需要使用变量去存储训练的参数,比如权重和偏差项,超参数,比如学习率,步数等等信息。

但是,最好定义变量的方式是去使用 函数,当我们设计的网络非常深的时候,这个 API 允许去重复使用一些变量。

以下程序,我们定义了这些东西:

定义变量和并且初始化;

定义一个操作 op 去更新这些变量;

显示的初始化变量;

对变量进行检索操作;

保存一个检查点(checkpoint)

在训练期间,我们的变量可以保存到磁盘。然后这些变量可以被重新加载到模型进行训练,也可以被作为一个接口进行使用。

恢复一个检查点(checkpoint)

如果你只想保存模型的其中一些变量,那么你可以如下操作:

定期加载模型并保存检查点

这个实例代码在模型的开始先保存模型,并且在训练的期间定期的保存模型。

可训练与不可训练参数

在迁移学习中,我们可能会从检查点加载模型,但模型的有些部分可能不用训练,所有我们可以通过设置 来进行控制。

在一些问题中,我们可能需要同时训练几个多层的深度网络。针对不同的可训练参数,我们会使用不同的优化器和不同的损失函数。

作用域(scoping)

我们可以使用作用域来创建两个不同的网络层,使得他们有各自不同的参数。比如,CNN1 和 CNN2 有自己的权重 和偏差项 。

变量共享

在研究变量共享之前,我们首先描述 是如何工作的。 总是会创建一个新的变量,即使给定了相同的名称。

如果名称为 已经存在,那么 TensorFlow 会在命名后面添加上 , 等,用来保证命名的唯一性。

因此,当我们调用下面的 affine 方法,我们创建了 2 组不同的权重 w 和偏差项 b,也就是说每个 affine 都有他们自己的权重 w 和偏差项 b。

有时候,在一个复杂的网络中,我们想要共享一个图层或者参数,那么我们如何修改一下刚刚的 affine 函数,使得能共享相同的权重 w 和偏差项 b。

如果一个变量给定的 存在,则 将会返回现在存在的变量,而不会去重新创建一个。

因此,对于第二次调用 affine 函数的时候, 就调用了已经存在的权重 w 和偏差项 b。

重用(Reuse)

但是,TensorFlow 希望开发人员可以自己知道哪些变量已经被使用了。在调用 之前,开发人员需要明确知道是否可以设置 这个标志。在调用 tf.get_varialbe 时,厦门的这两种情况会引发异常:

如果标志 设置为 False 或者 None(默认),且变量已经存在了。

如果标志 设置为 True,但是变量不存在。

如下程序:

对于 标志我们可能需要按照如下使用:

我们可以重新使用作用了,而不是再次去编写作用域的范围:

嵌套范围

警告变量共享

很多的开发者都熟悉使用 和 方法。但是,这些 API 不适合于共享变量。例如,下面的 不会选择从 创建的命名。

为了避免这些问题,我们最好采用如下方法:

不要对共享变量使用 和 ;

总是使用 来定义共享变量的范围;

使用 来创建和检索共享变量;

分配(Assignment)

作者:chen_h

CoderPai 是一个专注于人工智能在量化交易应用的算法实战平台,主要关注人工智能在量化交易上面的应用。如果你对人工智能感兴趣,请快快关注 “CoderPai” 微信号(coderpai)吧。

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

扫码关注云+社区

领取腾讯云代金券