我第一次开始接触到TensorFlow大概是去年五月份,大三下,如果一年多已过,我却还在写启程。。这进度,实在汗颜。。

一个完整的tensorflow程序可以分为以下几部分:

  • Inputs and Placeholders
  • Build the Graph
    • Inference
    • Loss
  • Training
  • Train the Model
  • Visualize the Status
  • Save a Checkpoint
  • Evaluate the Model
  • Build the Eval Graph
  • Eval Output

Inputs and Placeholders

对于一个完整的网络来说,必定有输入还有输出,而Placeholders就是针对网络输入来的,相当于预先给输入变量占个坑,拿mnist来说,占坑代码可以如下面的例子:

 images_placeholder = tf.placeholder(tf.float32, shape=(batch_size,mnist.IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

上述代码相当于为mnist图片和标签分别占坑,而tf.placeholder参数可以如下面所示:

tf.placeholder(dtype, shape=None, name=None)

即需要提供占坑数据类型dtype,占坑数据shape,当然也可以给它提供一个唯一的name

Build the Graph

因为tf是通过构建图模型来进行网络搭建的,因此搭建网络也就是’Build the Graph’。

Inference

首先就是构建图,利用一系列符号将要表达的操作表达清楚,以用于后续模型的训练。如下面代码:

 with tf.name_scope('hidden1'):
weights = tf.Variable(tf.truncated_normal([IMAGE_PIXELS, hidden1_units],\
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),name='weights') biases = tf.Variable(tf.zeros([hidden1_units]),\
name='biases')

如上述代码,对于一个图的搭建,需要一些变量来支持我们的运算,比如矩阵相乘等,需要通过tf.Variable来声明变量,其参数格式如下:

 tf.Variable(self, initial_value=None, trainable=True, collections=None, validate_shape=True,\
caching_device=None, name=None, variable_def=None, dtype=None)

需要提供变量初始值initial_value, 是否接受训练trainable,对于validate_shape表示该变量是否可以改变,如果形状可以改变,那么应该为False。对于每个变量,可以赋予不同的名字tf.name_scope

Loss

在定义完图结构之后,我们需要有个目标函数,用作更新图结构中的各个变量。

 labels = tf.to_int64(labels)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='xentropy')

如上,通过给定的labels占坑变量,完成手写数字识别的最后交叉熵函数。

Training

在得到目标函数之后,我们就可以对模型进行训练,这里常用梯度下降法。在训练阶段,我们可以通过tf.scalar_summary来实现变量的记录,用作后续的tensorboard的可视化,如:

 tf.scalar_summary(loss.op.name, loss)

然后通过tf.SummaryWriter()来得到对应的提交值。

而对于模型的最优化,这里 tf 提供了很多optimazer,通常在tf.train里面,这里常用的是GradientDenscentOptimizer(lr),然后通过调用:

 train_op = optimizer.minimize(loss, global_step=global_step)

Train the Model

在模型训练时,我们需要打开一个默认的图环境,用作训练,如:

 with tf.Graph().as_default():

以此来打开一个图结构,然后我们需要声明一个会话在所有操作都定义完毕之后,这样我们就可以利用这个session来运行Graph.可以通过如下方法声明:

 with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)

每次我们可以通过sess.run来运行一些操作,进而获取其输出值,

 sess.run(fetches, feed_dict=None, options=None, run_metadata=None)

可以看到,run需要fetches,即操作,feed_dictfetches的输入,即占坑变量与其对应值构成的字典。

Visualize the Status

当然,在运行过程,我们可以通过可视化的操作来看网络运行情况。
在之前的tf.scalar_summary, 我们可以通过:

 summary = tf.merge_all_summaries()

将在图构建阶段的变量收集起来,然后在session创建之后运行如下命令生成可视化的值。

 summary_str = sess.run(summary, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)

其中summary_writer由如下得到:

 summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph)

然后用tensorboard打开对应文件即可。

Save a Chenckpoint

对于模型的保存,可以通过如下代码实现:

 saver = tf.train.Saver()
saver.save(sess, FLAGS.train_dir, global_step=step)

而载入模型可以通过如下的代码来实现:

saver.restore(sess, FLAGS.train_dir)

当然了,模型的估计就类似上述了。

这样简单的模型搭建到运行就完成了。本文主要用到这些函数:

    • tf.placeholder
    • tf.Variable
    • tf.train
      • tf.train.GradientDenscentOptimizer
      • tf.train.SummaryWriter
      • tf.train.Saver
    • tf.session
    • tf.Graph
    • tf.add_summary
    • tf.merge_all_summaries

其实构建一个模型基本就用这些函数,然后就是一些数理计算方法。详情参看tensorflow

Reference:Link

TF启程的更多相关文章

  1. TFS命令tf:undo(强制签入签出文件)

    由于修改计算机名称或不同电脑上操作忘记签入,则需要强制签入文件 具体步骤如下: 1.在命令行中输入"cd  C:\Program Files\Microsoft Visual Studio ...

  2. 制作HP MicroServer Gen8可用的ESXi 5.x SD/TF卡启动盘

    前些日子看到HP公司和京东在搞服务器促销活动,于是就入了一个 ProLiant MicroServer Gen8 的低配版 相比上一代产品,新一代 MicroServer系列微型服务器可更换处理器,还 ...

  3. TF Boys (TensorFlow Boys ) 养成记(六)

    圣诞节玩的有点嗨,差点忘记更新.祝大家昨天圣诞节快乐,再过几天元旦节快乐. 来继续学习,在/home/your_name/TensorFlow/cifar10/ 下新建文件夹cifar10_train ...

  4. TF Boys (TensorFlow Boys ) 养成记(五)

    有了数据,有了网络结构,下面我们就来写 cifar10 的代码. 首先处理输入,在 /home/your_name/TensorFlow/cifar10/ 下建立 cifar10_input.py,输 ...

  5. TF Boys (TensorFlow Boys ) 养成记(四)

    前面基本上把 TensorFlow 的在图像处理上的基础知识介绍完了,下面我们就用 TensorFlow 来搭建一个分类 cifar10 的神经网络. 首先准备数据: cifar10 的数据集共有 6 ...

  6. TF Boys (TensorFlow Boys ) 养成记(三)

    上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...

  7. TF Boys (TensorFlow Boys ) 养成记(二)

    TensorFlow 的 How-Tos,讲解了这么几点: 1. 变量:创建,初始化,保存,加载,共享: 2. TensorFlow 的可视化学习,(r0.12版本后,加入了Embedding Vis ...

  8. TF Boys (TensorFlow Boys ) 养成记(一)

    本资料是在Ubuntu14.0.4版本下进行,用来进行图像处理,所以只介绍关于图像处理部分的内容,并且默认TensorFlow已经配置好,如果没有配置好,请参考官方文档配置安装,推荐用pip安装.关于 ...

  9. ROS TF——learning tf

    在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...

随机推荐

  1. 20190925 - macOS 的包管理工具

    众所周知,macOS 的包管理工具有 MacPorts 和 Homebrew,后者似乎更受欢迎,但前者但包数量更多. 喜欢手冲咖啡,看到 brew 这个词有好感,但可能部分由于网络的问题,部分因为 b ...

  2. Django 1.x版本与2.x版本 区别

    django 1.x版本与2.x版本 URL区别 在django 1.x中的方式 导入的模块是'from django.conf.urls import url',urlpatterns中url对应的 ...

  3. 安装多个版本的TensorFlow

    TensorFlow 2.0测试版在今年春季发布,新版本比1.x版本在易用性上有了很大的提升.但是由于2.0发布还没有多久,现在大部分论文的实现代码都是1.x版本的,所以在学习TensorFlow的过 ...

  4. 【FFMPEG】使用ffmpeg类库打开流媒体

    版权声明:本文为博主原创文章,未经博主允许不得转载. 使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input(). 其中打开网络流的话,前面要加上函 ...

  5. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  6. ZOJ Problem Set - 1004

    1.翻译参考 http://liucw.blog.51cto.com/6751239/1198026 2.代码参考 http://www.cnblogs.com/devymex/archive/201 ...

  7. Java实现链队

    一.分析 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.允许插入的一端称为队尾,允许删除的一端称为队头. 链队是指采用链式存储结构实现的队列,它的基本操作如下: 1.初始 ...

  8. Petya and Construction Set(图的构造) Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)

    题意:https://codeforc.es/contest/1214/problem/E 有2n个点,每个2*i和2*i-1的距离必须是Di(<=n),现在让你构造这个树. 思路: 因为Di小 ...

  9. raspberrypi 树莓派 内核编译

    相关版本信息 硬件:树莓派 2b 目标系统: linux 编译环境:ubuntu 14.4 32bit 用户路径:/home/hi/ 安装交叉编译链 cdmkdir pi/kernelcd pi/ke ...

  10. oracle修改TNSLSNR的端口

    oracle 服务一启动 TNSLSNR.exe 会占用8080端口,这时,如果我们其他程序需要使用8080端口就会比较麻烦,所以需要改一下端口: 用dba账户登录 CMD>sqlplus sy ...