前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MNIST数据集 — 前期准备

MNIST数据集 — 前期准备

作者头像
木野归郎
发布于 2020-10-30 06:45:38
发布于 2020-10-30 06:45:38
52000
代码可运行
举报
文章被收录于专栏:share ai happinessshare ai happiness
运行总次数:0
代码可运行

前言

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

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

变量管理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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的空间,分别打印名称。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在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获取方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据变量名称直接获取,如果不存在就创建一个新的
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)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 变量空间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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在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的限制的。

代码持久化管理

保存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 前续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,所有模型文件列表

导入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 前续TensorFlow代码
  …………
# 用于保存模型参数
saver = tf.train.Saver()

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 直接加载计算结构图
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”)

部分保存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 前续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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 定义一个变量
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf.train.exponential_decay(
    learning_rate, # 初始学习率
    global_step, # 当前迭代次数
    decay_steps, # 衰减速度,在迭代到该次数时衰减
    decay_rate # 学习率衰减系数,通常介于0-1之间
)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# group,参数为需要维护的
tf.group(train_part1, train_part2) 
# control_denendencies
With tf.control_dependencies([train_p1, train_p2]):
  train_op = tf.no_op(name=“train”)

小结

  • 变量管理
  • 代码持久化管理
  • 滑动平均模型
  • 学习速率衰减
  • 多目标优化,优化方向有多个时候怎么进行维护
  • 滑动平均模型 和学习速率衰减可以使模型更加健壮。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OnlyCoding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于tensorflow的MNIST数字识别
MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会作为深度学习的入门样例。下面大致介绍这个数据集的基本情况,并介绍temsorflow对MNIST数据集做的封装。tensorflow的封装让使用MNIST数据集变得更加方便。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。在MNIST数据集中的每一张图片都代表了0~9中的一个数字。图片的大小都为28*28,且数字都会出现在图片的正中间。
狼啸风云
2019/03/01
3K0
TensorFlow-实战Google深度学习框架 笔记(上)
TensorFlow 是一种采用数据流图(data flow graphs),用于数值计算的开源软件库。在 Tensorflow 中,所有不同的变量和运算都是储存在计算图,所以在我们构建完模型所需要的图之后,还需要打开一个会话(Session)来运行整个计算图 通常使用import tensorflow as tf来载入TensorFlow 在TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。除了使用默认的计算图,可以使用tf.Graph函数来生成新的计算图,不同计算图上的张量和运算不会共享 在TensorFlow程序中,所有数据都通过张量的形式表示,张量可以简单的理解为多维数组,而张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。即在张量中没有真正保存数字,而是如何得到这些数字的计算过程 如果对变量进行赋值的时候不指定类型,TensorFlow会给出默认的类型,同时在进行运算的时候,不会进行自动类型转换 会话(session)拥有并管理TensorFlow程序运行时的所有资源,所有计算完成之后需要关闭会话来帮助系统回收资源,否则可能会出现资源泄漏问题 一个简单的计算过程:
范中豪
2019/09/10
6440
TensorFlow-实战Google深度学习框架 笔记(上)
3.1 学习率(learning rate)的选择
版权声明:本文为博主原创文章,未经博主允许不得转载。python版本为python3,实例都是经过实际验证。 https://blog.csdn.net/jinxiaonian11/article/details/83105439
锦小年
2019/05/28
1.4K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
输入层数据为维度(1, 784),其中1表示数据数量,因为网络一次只处理一张图片,所以为1,784是图像数据维度,将$28\times 28 \times1$的数据处理成一个列向量,便于存储,若向显示,则需要将其回复到源尺寸,参见博客MNIST手写字体数据集解析.
xdq101
2019/05/31
1.2K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
持久化的基于 L2 正则化和平均滑动模型的 MNIST 手写数字识别模型
[1]Tensorflow实战Google深度学习框架: https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.4.0
演化计算与人工智能
2020/08/14
4250
猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型
猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型
公众号guangcity
2019/09/20
1.2K0
猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型
美还是丑?这有一个CNN开发的颜值评分器 | 实战
在人工智能的发展越来越火热的今天,其中智能应用也在伴随着我们的生活,其中最具有代表性的便是图像识别,并且其中的应用比比皆是,如车站的人脸识别系统,交通的智能监控车牌号系统等等。而卷积神经网络作为图像识别的首选算法,对于图像的特征提取具有很好的效果,而TensorFlow作为Google的开源框架具有很好的结构化特征,而本篇文章将利用卷积神经网络算法对图像识别进行应用,开发出颜值评分器的功能。
AI科技大本营
2019/11/12
1.2K0
什么是TensorBoard?
这篇文章主要讲讲TensorBoard的基本使用以及name_scope和variable_scope的区别
Java3y
2019/05/08
4260
什么是TensorBoard?
Tensorflow 实战笔记
tf.Variable(tf.random_normal([2,3],stddev=2)) 通过满足正态分布的随机数来初始化神经网络中的参数是一个常用方法。
微风、掠过
2018/10/09
5000
Tensorflow 实战笔记
TensorFlow-CIFAR10 CNN代码分析
想了解更多信息请参考CIFAR-10 page,以及Alex Krizhevsky写的技术报告
百川AI
2021/10/19
6820
tensorflow的模型持久化
tensorflow提供了一个非常简单的API来保存和还原一个神经网络模型。这个API就是tf.train.Saver类。以下代码给出了保存tensorflow计算图的方法。
狼啸风云
2019/03/06
1.9K0
一看就懂的Tensorflow实战(模型的保存与读取)
首先,我们从一个直观的例子,讲解如何实现Tensorflow模型参数的保存以及保存后模型的读取。 然后,我们在之前多层感知机的基础上进行模型的参数保存,以及参数的读取。该项技术可以用于Tensorflow分段训练模型以及对经典模型进行fine tuning(微调)
AI异构
2020/07/29
8240
TensorFlow - TF-Slim 使用总览
虽然这里是采用 TF-Slim 处理图像分类问题,还需要安装 TF-Slim 图像模型库 tensorflow/models/research/slim. 假设该库的安装路径为 TF_MODELS. 添加 TF_MODELS/research/slim 到 python path.
狼啸风云
2019/07/08
2.9K0
tensorflow学习笔记(十七):name&variable scope
水平有限,如有错误,请指正! 在tensorflow中,有两个scope, 一个是name_scope一个是variable_scope,这两个scope到底有什么区别呢? 先看第一个程序: wit
ke1th
2019/05/26
1.1K0
(二)Tensorflow搭建卷积神经网络实现MNIST手写字体识别及预测
1 搭建卷积神经网络 1.0 网络结构 [图1.0 卷积网络结构 ] 1.2 网络分析 序号 网络层 描述 1 卷积层 一张原始图像(28, 28, 1),batch=1,经过卷积处理,得到图像特征(28, 28, 32) 2 下采样 即池化层,最大池化后图像特征(14, 14, 32) 3 卷积层 将池化特征(14, 14, 32)卷积处理后,得到图像特征(14, 14, 64) 4 下采样 最大池化,得到图像特征(7, 7, 64) 5 全连接层 将上一层即池化层的图像特征经过矩阵内积计算,拉成一个向量
xdq101
2019/06/02
7720
(二)Tensorflow搭建卷积神经网络实现MNIST手写字体识别及预测
用 Python 可以实现侧脸转正脸?我也要试一下!
作者 | 李秋键、出品丨AI科技大本营 近几年来GAN图像生成应用越来越广泛,其中主要得益于GAN 在博弈下不断提高建模能力,最终实现以假乱真的图像生成。GAN 由两个神经网络组成,一个生成器和一个判别器组成,其中生成器试图产生欺骗判别器的真实样本,而判别器试图区分真实样本和生成样本。这种对抗博弈下使得生成器和判别器不断提高性能,在达到纳什平衡后生成器可以实现以假乱真的输出。 其中GAN 在图像生成应用最为突出,当然在计算机视觉中还有许多其他应用,如图像绘画,图像标注,物体检测和语义分割。在自然语言处理中应
博文视点Broadview
2023/05/19
9550
用 Python 可以实现侧脸转正脸?我也要试一下!
在C#下使用TensorFlow.NET训练自己的数据集
今天,我结合代码来详细介绍如何使用 SciSharp STACK 的 TensorFlow.NET 来训练CNN模型,该模型主要实现 图像的分类 ,可以直接移植该代码在 CPU 或 GPU 下使用,并针对你们自己本地的图像数据集进行训练和推理。TensorFlow.NET是基于 .NET Standard 框架的完整实现的TensorFlow,可以支持 .NET Framework 或 .NET CORE , TensorFlow.NET 为广大.NET开发者提供了完美的机器学习框架选择。
Enjoy233
2021/12/23
1.6K0
在C#下使用TensorFlow.NET训练自己的数据集
TF入门05-实验过程管理
TensorBoard中Word2Vec模型计算图表示如图,如果模型更复杂,计算图也越来越乱,我们可以使用name scope将相关的结点放到一个组里来方便运算图的理解。tf.name_scope使用如下:
公众号-不为谁写的歌
2020/07/23
8630
《Scikit-Learn与TensorFlow机器学习实用指南》第9章 启动并运行TensorFlow
第9章 启动并运行TensorFlow 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:@akonwang @WilsonQu 校对:@Lis
ApacheCN_飞龙
2018/05/16
2K0
基于TensorFlow卷积神经网络与MNIST数据集设计手写数字识别算法
TensorFlow是一个基于Python和基于数据流编程的机器学习框架,由谷歌基于DistBelief进行研发,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用。2015年11月9日,TensorFlow依据Apache 2.0 开源协议开放源代码。
润森
2022/09/22
7600
基于TensorFlow卷积神经网络与MNIST数据集设计手写数字识别算法
推荐阅读
相关推荐
基于tensorflow的MNIST数字识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验