TensorFlow 中维护的集合列表

在一个计算图中,可以通过集合(collection)来管理不同类别的资源。比如通过 tf.add_to_collection 函数可以将资源加入一个或多个集合中,然后通过 tf.get_collection 获取一个集合里面的所有资源(如张量,变量,或者运行TensorFlow程序所需的队列资源等等)。比如,通过 tf.add_n(tf.get_collection('losses')) 获得总损失。

集合名称 集合内容 使用场景
tf.GraphKeys.VARIABLES 所有变量 持久化 TensorFlow 模型
tf.GraphKeys.TRAINABLE_VARIABLES 可学习的变量(一般指神经网络中的参数) 模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES 日志生成相关的张量 TensorFlow 计算可视化
tf.GraphKeys.QUEUE_RUNNERS 处理输入的 QueueRunner 输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES 所有计算了滑动平均值的变量 计算变量的滑动平均值
  1. TensorFlow中的所有变量都会被自动加入tf.GraphKeys.VARIABLES集合中,通过 tf.global_variables()函数可以拿到当前计算图上的所有变量。拿到计算图上的所有变量有助于持久化整个计算图的运行状态。
  2. 当构建机器学习模型时,比如神经网络,可以通过变量声明函数中的trainable参数来区分需要优化的参数(比如神经网络的参数)和其他参数(比如迭代的轮数,即超参数),若trainable = True,则此变量会被加入tf.GraphKeys.TRAINABLE_VARIABLES集合。然后通过 tf.trainable_variables函数便可得到所有需要优化的参数。TensorFlow中提供的优化算法会将tf.GraphKeys.TRAINABLE_VARIABLES集合中的变量作为 默认的优化对象。

示例

tf.get_collection 的第一个参数是集合的名字,第二个参数是要加入集合的内容:

  1. def get_weight(shape, lambda1):
  2. # 获取一层神经网络边上的权重
  3. var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
  4. # 将这个权重的 L2 正则化损失加入名称为 'losses' 的集合中
  5. tf.add_to_collection('losses',
  6. tf.contrib.layers.l2_regularizer(lambda1)(var))
  7. return var

变量初始化函数

神经网络中的参数是通过 TensorFlow 中的变量来组织、保存和使用的。TensorFlow 中提供了两种变量机制:tf.Variabletf.get_variable.

  1. 变量的类型是不可以改变的。
  2. 变量的维度一般是不能改变的,除非设置参数validate_shape = False(很少去改变它)

随机数初始化函数

函数名 随机数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 满足正态分布的随机值,但若随机值偏离平均值超过2个标准差,则这个数会被重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最大、最小值、取值类型
tf.random_gamma Gramma分布 形状参数alpha、尺度参数beta、取值类型

常量初始化函数

函数名 功能 示例
tf.zeros 产生全0的数组 tf.zeros([2, 3],tf.int32)
tf.ones 产生全1的数组 tf.ones([2, 3],tf.int32)
tf.fill 产生一个全部为给定数组的数组 tf.fill([2,3], 9)
tf.constant 产生一个给定值的常量 tf.constant([2,3,4])

tf.get_variable 变量初始化函数

初始化函数 功能 主要参数
tf.constant_initializer 将变量初始化为给定常数 常数的取值
tf.random_normal_initializer 将变量初始化为满足正态分布的随机值 正态分布的均值和标准差
tf.truncated_normal_initializer 将变量初始化为满足正态分布的随机值,但若随机值偏离平均值超过2个标准差,则这个数会被重新随机 正态分布的均值和标准差
tf.random_uniform_initializer 将变量初始化为满足平均分布的随机值 最大、最小值
tf.uniform_unit_scaling_initializer 将变量初始化为满足平均分布但不影响输出数量级的随机值 factor(产生随机值时乘以的系数)
tf.zeros_initializer 将变量初始化为全0 变量维度
tf.ones_initializer 将变量初始化为全1 变量维度

tf.get_variable 用于创建变量时,它和 tf.Variable 的功能是基本等价的。而 tf.get_variabletf.Variable 的最大的区别在于指定变量名称的参数。

  • 对于 tf.Variable 函数,变量名称是一个可选参数,通过 name='v' 的形式给出;
  • 对于 tf.get_variable 函数,变量名称是一个必填的参数。tf.get_variable 函数会根据这个名字去创建或者获取变量。

详细内容见 变量管理


其他

tf.clip_by_value 函数将张量限定在一定的范围内:

  1. import tensorflow as tf
  2. sess = tf.InteractiveSession()
  3. v = tf.constant([[1., 2., 3.], [4., 5., 6.]])
  4. tf.clip_by_value(v, 2.5, 4.5).eval() # 小于2.5的数值设为2.5,大于4.5的数值设为4.5
  1. array([[2.5, 2.5, 3. ],
  2. [4. , 4.5, 4.5]], dtype=float32)

tf.log 对张量所有元素进行对数运算

  1. tf.log(v).eval()
  1. array([[0. , 0.6931472, 1.0986123],
  2. [1.3862944, 1.609438 , 1.7917595]], dtype=float32)

tf.greater,比较这两个张量中的每一个元素,并返回比较结果

  • 输入是两个张量
  • 当输入维度不一致时会进行广播(broadcasting)
  1. v1 = tf.constant([1., 2., 3., 4.])
  2. v2 = tf.constant([4., 3., 2., 1.])
  3. f = tf.greater(v1, v2)
  4. f.eval()
  1. array([False, False, True, True])

tf.where 比较函数

函数有三个参数:

  • 第一个选择条件根据,当选择条件为True时,会选择第二个参数中的值,否则使用第三个参数中的值:
  1. tf.where(f, v1, v2).eval()
  1. array([4., 3., 3., 4.], dtype=float32)

指数衰减学习率

tf.train.exponential_decay 函数指数衰减学习率。

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)

  • learning_rate :事先设定的初始学习率
  • decay_steps: 衰减速度,staircase = True时代表了完整的使用一遍训练数据所需要的迭代轮数(= 总训练样本数/每个batch中的训练样本数)
  • decay_rate: 衰减系数
  • staircase: 默认为False,此时学习率随迭代轮数的变化是连续的(指数函数);为 True 时,global_step/decay_steps 会转化为整数,此时学习率便是阶梯函数

示例:

  1. TRAINING_STEPS = 100
  2. global_step = tf.Variable(0)
  3. LEARNING_RATE = tf.train.exponential_decay(
  4. 0.1, global_step, 1, 0.96, staircase=True)
  5. x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x")
  6. y = tf.square(x)
  7. train_op = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(
  8. y, global_step=global_step)
  9. with tf.Session() as sess:
  10. sess.run(tf.global_variables_initializer())
  11. for i in range(TRAINING_STEPS):
  12. sess.run(train_op)
  13. if i % 10 == 0:
  14. LEARNING_RATE_value = sess.run(LEARNING_RATE)
  15. x_value = sess.run(x)
  16. print("After %s iteration(s): x%s is %f, learning rate is %f." %
  17. (i + 1, i + 1, x_value, LEARNING_RATE_value))
  1. After 1 iteration(s): x1 is 4.000000, learning rate is 0.096000.
  2. After 11 iteration(s): x11 is 0.690561, learning rate is 0.063824.
  3. After 21 iteration(s): x21 is 0.222583, learning rate is 0.042432.
  4. After 31 iteration(s): x31 is 0.106405, learning rate is 0.028210.
  5. After 41 iteration(s): x41 is 0.065548, learning rate is 0.018755.
  6. After 51 iteration(s): x51 is 0.047625, learning rate is 0.012469.
  7. After 61 iteration(s): x61 is 0.038558, learning rate is 0.008290.
  8. After 71 iteration(s): x71 is 0.033523, learning rate is 0.005511.
  9. After 81 iteration(s): x81 is 0.030553, learning rate is 0.003664.
  10. After 91 iteration(s): x91 is 0.028727, learning rate is 0.002436.

正则化

  1. w = tf.constant([[1., -2.], [-3, 4]])
  2. with tf.Session() as sess:
  3. print(sess.run(tf.contrib.layers.l1_regularizer(.5)(w))) # 0.5 为正则化权重
  4. print(sess.run(tf.contrib.layers.l2_regularizer(.5)(w)))
  1. 5.0
  2. 7.5

滑动平均模型

滑动平均模型会将每一轮迭代得到的模型综合起来,从而使得最终得到的模型在测试数据上更加健壮(robust)。

tf.train.ExponentialMovingAverage 需要提供一个衰减率(decay)来控制模型更新的速度。

ExponentialMovingAverage 对每一个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:

\[\text{shadow_variable} = \text{decay} \times \text{shadow_variable} + (1 - \text{decay}) \times \text{variable}
\]

  • shadow_variable 为影子变量,
  • variable 为待更新变量
  • decay 为衰减率,它越大模型越趋于稳定,在实际应用中decay一般会设置为接近 1 的数。

还可以使用 num_updates参数来动态设置decay的大小:

\[\text{decay} = \min\begin{Bmatrix} \text{decay}, \frac{1 + \text{num_updates}}{10 + \text{num_updates}}\end{Bmatrix}
\]

定义变量及滑动平均类

  1. import tensorflow as tf
  1. # 定义一个变量用来计算滑动平均,且其初始值为0,类型必须为实数
  2. v1 = tf.Variable(0, dtype=tf.float32)
  3. # step变量模拟神经网络中迭代的轮数,可用于动态控制衰减率
  4. step = tf.Variable(0, trainable=False)
  5. # 定义一个滑动平均的类(class)。初始化时给定了衰减率为0.99和控制衰减率的变量step
  6. ema = tf.train.ExponentialMovingAverage(0.99, step)
  7. # 定义一个更新变量滑动平均的操作。这里需要给定一个列表,每次执行这个操作时,此列表中的变量都会被更新。
  8. maintain_averages_op = ema.apply([v1])

查看不同迭代中变量取值的变化。

  1. with tf.Session() as sess:
  2. # 初始化
  3. init_op = tf.global_variables_initializer()
  4. sess.run(init_op)
  5. # 通过ema.average(v1)获取滑动平均后的变量取值。在初始化之后变量v1的值和v1 的滑动平均均为0
  6. print(sess.run([v1, ema.average(v1)]))
  7. # 更新变量v1的取值
  8. sess.run(tf.assign(v1, 5))
  9. sess.run(maintain_averages_op)
  10. print(sess.run([v1, ema.average(v1)]))
  11. # 更新step和v1的取值
  12. sess.run(tf.assign(step, 10000))
  13. sess.run(tf.assign(v1, 10))
  14. sess.run(maintain_averages_op)
  15. print(sess.run([v1, ema.average(v1)]))
  16. # 更新一次v1的滑动平均值
  17. sess.run(maintain_averages_op)
  18. print(sess.run([v1, ema.average(v1)]))
  1. [0.0, 0.0]
  2. [5.0, 4.5]
  3. [10.0, 4.555]
  4. [10.0, 4.60945]

  • 裁剪多余维度: tf.squeeze

TensorFlow 常用的函数的更多相关文章

  1. TensorFlow常用的函数

    TensorFlow中维护的集合列表 在一个计算图中,可以通过集合(collection)来管理不同类别的资源.比如通过 tf.add_to_collection 函数可以将资源加入一个 或多个集合中 ...

  2. Tensorflow常用的函数:tf.cast

    1.tf.cast(x,dtype,name) 此函数的目的是为了将x数据,准换为dtype所表示的类型,例如tf.float32,tf.bool,tf.uint8等 example:  import ...

  3. 深度学习TensorFlow常用函数

    tensorflow常用函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, Tensor ...

  4. TensorFlow常用Python扩展包

    TensorFlow常用Python扩展包 TensorFlow 能够实现大部分神经网络的功能.但是,这还是不够的.对于预处理任务.序列化甚至绘图任务,还需要更多的 Python 包. 下面列出了一些 ...

  5. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  6. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  7. php常用数组函数回顾一

    数组对于程序开发来说是一个必不可少的工具,我根据网上的常用数组函数,结合个人的使用情况,进行数组系列的总结复习.里面当然不只是数组的基本用法,还有相似函数的不同用法的简单实例,力求用最简单的实例,记住 ...

  8. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  9. WordPress主题模板层次和常用模板函数

    首页: home.php index.php 文章页: single-{post_type}.php – 如果文章类型是videos(即视频),WordPress就会去查找single-videos. ...

随机推荐

  1. dfs(通过控制点的编号来得出每个点的坐标)

    题目链接:https://cn.vjudge.net/contest/234497#problem/A #include<iostream> #include<string> ...

  2. ubuntu下安装搜狗输入法以及出现不能输入中文的解决办法

    1. 官网下载安装包 http://pinyin.sogou.com/linux/?r=pinyin 下载你需要的版本,这里选择64位版. 2. 进入软件中心安装 3. 修改ibus为fcitx im ...

  3. Generative Adversarial Nets(原生GAN学习)

    学习总结于国立台湾大学 :李宏毅老师 Author: Ian Goodfellow • Paper: https://arxiv.org/abs/1701.00160 • Video: https:/ ...

  4. SciPy模块应用

    1.图像模糊  图像的高斯模糊是非常经典的图像卷积例子.本质上,图像模糊就是将(灰度)图像I 和一个高斯核进行卷积操作:,其中是标准差为σ的二维高斯核.高斯模糊通常是其他图像处理操作的一部分,比如图像 ...

  5. JDK8 Lambda表达式对代码的简化

    只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...

  6. C# 实现UDP打洞通信(一)

    最近研究了一下网络打洞的相关技术,TCP的方式据说可行性不高,各种困难,因此决定采用UDP(UDP是什么就不解释了)的方式. 原理: 我们都知道局域网内的主机想要访问外网的服务器是比较容易的,比如浏览 ...

  7. C/C++杂记:虚函数的实现的基本原理

    1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: 其中: B的虚函数表中存放着B::foo和B ...

  8. 配置vCenter Server Appliance 6.7

    =============================================== 2019/4/14_第1次修改                       ccb_warlock == ...

  9. 50个常用的sql语句

    50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...

  10. Ex 5_32 一台服务器当前有n个等待服务的顾客...第八次作业

    设第i个客户需要等待的时间为ti,则n个客户需要总的等待时间为 ,因此,要使T最小,则要使 即可,所以,对所有的ti按升序进行排序和服务将得到最小的等待时间. package org.xiu68.ch ...