变量(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)吧。
领取专属 10元无门槛券
私享最新 技术干货