专栏首页share ai happinessMNIST数据集 — 前期准备

MNIST数据集 — 前期准备

前言

持续两个星期关于深度学习基础方面的更新,非常感谢我们这个小编为大家的总结分享。

前面都是基础零碎的知识,需要通过一个栗子来为大家把整个流程走一遍,从整体上对TensorFlow进行一个把握,大概分为四篇文章来说明吧(前期准备、前馈计算、模型训练、模型评价)。

变量管理

# get_variable
emb = tf.get_variable(name=“emb”, # 变量名称(必填)
        shape # 词向量维度
        initializer) # 词向量矩阵,训练好的
# Variable
emb = tf.Variable(initializer, # 词向量矩阵,训练好的
         name=“emb” # 变量名称(可选)

上一篇文章说过声明变量的方法分为两种get_variable()和variable()方法,get_variable()其实是通过变量名来管理变量的方法,根据变量名称直接获取,如果不存在就创建一个新的。Variable()方法,创建一个新的变量,用具体的值初始化,变量名称可选。

Variable + name_scope

通过组合可以简化命名参数,合理组织参数,在Tensorboard可视化展示过程中更加清晰结构逻辑。

使用name_scope进行空间命名,使用variable进行初始化。下面再定义一个名为conv2的空间,分别打印名称。

# 在conv1命名空间下定义变量
with tf.name_scope('conv1') as scope: 
  weights1 = tf.Variable([1.0, 2.0], name='weights') 
  bias1 = tf.Variable([0.3], name='bias') 

# 在conv2命名空间下定义变量
with tf.name_scope('conv2') as scope: 
  weights2 = tf.Variable([4.0, 2.0], name='weights') 
  bias2 = tf.Variable([0.33], name='bias') 

print (weights1.name) # conv1/weights
print (weights2.name) # conv2/weights

get_variable + variable_scope

主要用于实现参数共享。

使用variable_scope创建变量名为s1的空间,通过get_variable获取方法。

# 根据变量名称直接获取,如果不存在就创建一个新的
with tf.variable_scope(“s1”):
  v = get_variable(“v”, shape1, initializer1)
  # 创建失败,由于变量名“v”已经存在
  v1 = get_variable(“v”, shape1)

# 如果已经存在,直接返回当前变量
with tf.variable_scope(“s1”,reuse=True):
  v2 = get_variable(“v”, shape1)
# 输出 True, 都是s1/v
print(v==v2)
# 变量空间s1下创建变量v
with tf.variable_scope(“s1”):
  v = get_variable(“v”, shape1, initializer1) 
  print (v) # 输出 s1/v:0

# 变量空间s2下创建变量v
with tf.variable_scope(“s2”):
  v = get_variable(“v”, shape1) 
  print (v) # 输出 s2/v:0

# 变量空间s2下创建变量v
v = get_variable(“s1/v”, shape1) 

variable_scope vs. name_scope

# 在name_scope下调用get_variable
with tf.name_scope(“s1”):
  v = get_variable(“v”, shape1, initializer1) 
  print (v) # 输出 v:0

# 在variable_scope下调用Variable
with tf.variable_scope(“s2”):
  v = tf.Variable(“v”, shape1) 
  print (v) # 输出 s2/v:0

variable_scope和name_scope区别是什么?Name_scope和get_variable一起使用的时候,name_scope是不起任何作用的,variable_scope和Variable使用是有对应的作用的, get_variable是不受name_scope的限制的。

代码持久化管理

保存

# 前续TensorFlow代码
  …………
# 用于保存模型参数
saver = tf.train.Saver()

With tf.Session() as sess:
  …………
  # 保存模型到制定路径下
  saver.save(sess, “path/to/model/model.ckpt”)

我们把一个模型训练结束,一般是要把它保存下来,后期如果想用这个模型,会把这个模型导入进来,进行预测,这个就是持久化的过程,将内存中的模型导入到磁盘里边生成一个文件。持久化包括:保存和导入。TensorFlow里边怎么进行持久管理呢?前面我们说了很多进行模型训练,这里使用tf.train中的saver()保存。创建saver对象,在session中训练好模型,然后调用saver的save方法,指定路径进行保存。

保存为三个文件:

model.ckpt.meta, 计算图结构,模型结构

model.ckpt,模型参数

checkpoint,所有模型文件列表

导入

# 前续TensorFlow代码
  …………
# 用于保存模型参数
saver = tf.train.Saver()

With tf.Session() as sess:
  …………
  # 导入指定路径下的模型
  saver.restore(sess, “path/to/model/model.ckpt”)

然后需要进行导入,和保存的代码差不多,在session里边调用restore方法,指定路径。

前面的方法是直接重写一个模型结构再把参数导进来,这里是声明saver的时候,直接先把保存好的模型结构先导进来,然后把参数导进来。

前面的方法是直接重写一个模型结构再把参数导进来,这里是声明saver的时候,直接先把保存好的模型结构先导进来,然后把参数导进来。

# 直接加载计算结构图
saver = tf.train.import_meta_graph(
    “path/to/model/model.ckpt/model.ckpt.meta”)

With tf.Session() as sess:
  …………
  # 导入指定路径下的模型
  saver.restore(sess, “path/to/model/model.ckpt”)

部分保存

# 前续TensorFlow代码
  …………
# 用于保存模型参数,通过词典给出要保存的参数列表
saver = tf.train.Saver({“v1”:v1, “v2”:v2})

With tf.Session() as sess:
  …………
  # 保存模型到制定路径下
  saver.save(sess, “path/to/model/model.ckpt”)

持久化部分参数,如果需要针对性的导出,对每个参数进行命名,按照词典的方式进行参数名称对应参数值,用这个词典初始化saver类。

滑动平均模型

滑动平均模型可以使模型在测试数据上更健壮,适合基于梯度下降算法训练神经网络的过程。在TensorFlow中提供了该模型:tf.train.ExponentialMovingAverage。

# 定义一个变量
v1 = tf.Variable(0, dtype=tf.float32)
# num_updates 变量更新次数
step = tf.Variable(0, trainable=False)
# 定义一个滑动平均模型,给出decay和num_updates
ema=tf.train.ExponentialMovingAverage(0.99, step)
# 定义一个滑动平均计算操作,给出要维护的变量列表
maintain_averages_op = ema.apply([v1])

With tf.Session() as sess:
  …………
  sess.run(maintain_averages_op) # 运行滑动平均模型

学习速率衰减

学习速率不是一个固定的值,训练前期使用较大的学习率加速,让模型快速收敛,训练过程中主键减小学习速率,到训练后期使用较小的学习率,使模型在训练后期更稳定。

TensorFlow支持的学习速率衰减策略

  • exponential_decay
  • inverse_time_decay
  • natural_exp_decay
  • piecewise_constant
  • polynomial_decay
tf.train.exponential_decay(
    learning_rate, # 初始学习率
    global_step, # 当前迭代次数
    decay_steps, # 衰减速度,在迭代到该次数时衰减
    decay_rate # 学习率衰减系数,通常介于0-1之间
)

有时需要同时维护多套参数。例如,使用滑动平均模型时除了模型参数,还需要维护模型参数对应的影子变量。这个时候可以通过group和control_dependencies完成。

# group,参数为需要维护的
tf.group(train_part1, train_part2) 
# control_denendencies
With tf.control_dependencies([train_p1, train_p2]):
  train_op = tf.no_op(name=“train”)

小结

  • 变量管理
  • 代码持久化管理
  • 滑动平均模型
  • 学习速率衰减
  • 多目标优化,优化方向有多个时候怎么进行维护
  • 滑动平均模型 和学习速率衰减可以使模型更加健壮。

本文分享自微信公众号 - 1001次重燃(smile765999),作者:木野归郎

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图像 | 文本怎么输入到模型 ?

    这个是一个手写数字识别的问题。左边是一个图像,右边是一个二维矩阵(14*14),每一个矩阵对应的位置是一个像素值,在这里白色代表。那左边那个Y={0 1 0 0...

    木野归郎
  • 拿美团offer,Hive进阶篇

    https://blog.csdn.net/weixin_38754799/article/details/104306898

    木野归郎
  • 消息中间件工作队列 — RabbitMQ

    工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源、时间的操作。当我们把任务(Task)当作消息发送到队列中,一个运行在后台的工...

    木野归郎
  • tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别

    在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型)、或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共...

    郭耀华
  • What's the difference of name scope and a variable scope in tensorflow?

    Let’s begin by a short introduction to variable sharing. It is a mechanism in Te...

    GavinZhou
  • task8 GAN text-to-image

    https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization https:...

    平凡的学生族
  • tensorflow学习笔记(十五): variable scope

    tensorflow 为了更好的管理变量,提供了variable scope机制 官方解释: Variable scope object to carr...

    ke1th
  • 【tensorflow】tf.name_scope与tf.variable_scope区别

    但是,tf.Variable() 每次都会新建变量。 如果希望重用(共享)一些变量,必须用到get_variable(),它会去搜索变量名,有就直接用,没有再...

    JNingWei
  • Spring 常见问题与解决方法

    本文节选自《Netkiller Java 手札》 地址 http://www.netkiller.cn/java/spring/ 下面是日志中常见的异常与解决方...

    netkiller old
  • tensorflow学习笔记(十七):name&variable scope

    在tensorflow中,有两个scope, 一个是name_scope一个是variable_scope,这两个scope到底有什么区别呢? 先看第一个程序...

    ke1th

扫码关注云+社区

领取腾讯云代金券