Tensorflow学习笔记(一):常量的运算并用tensorboard输出

一、前言

·  本来想看一些培训机构的教程,发现讲的是真的烂,10分钟一个案例就过去了。谁都知道tensorflow是一个机器学习的框架,讲这些案例真的啥也学不到。然后我就去寻找大佬写的教程了,发现有个叫astorfi老哥讲的不错,所以我就准备跟着他的课程教案一路学下来,最近时间太紧了,没什么时间学,争取能在10月中旬把这些教案都学完,算是给tensorflow入个门。
astorifi老哥的github地址:tensorflow课程
本人肯定没有这个老哥厉害,写这个博客只是让自己一边学一边记,各位如果有幸看到这篇文章,还是建议去跟着楼上老哥学哦!

二、Welcome to Tensorflow

·  本节主要用一个案例来走进Tensorflow的世界。Tensorflow本质上就是一张大图,里面的每一个变量,常量包括计算操作都是一个个的节点。这些节点之间的联系是我们自己定义的,当我们构建好这个图后,要运行这个图,这些节点才会真正操作起来。 因为这种设计模式的特殊性,我们不能像以前以前定义一个常量或者变量,而需要用tensoflow自定义的方法去定义一个个节点。
·  本节用tensorflow提供的可视化工具tensorboard来可视化两个常量之间的加和除结构,以此来给读者展示一下,tensorflow一个简单的图结构。

2.1 环境准备

import tensorflow as tf
import os

2.2 指定tensorboard输出文件的文件夹

# The default path for saving event files is the same folder of this python file.
tf.app.flags.DEFINE_string(
'log_dir', os.path.dirname(os.path.abspath(__file__)) + '/logs',
'Directory where event logs are written to.')

# Store all elements in FLAG structure!
FLAGS = tf.app.flags.FLAGS
  • os模块的两个函数不用多说了,这里获得了当前文件的绝对路径。注意:在jupyter下没法使用__file__,因为无法识别,请使用sys.argv[0]。
  • 这里主要讲一下tf.app.flags:这个包中有一个变量FLAGS,是用来接收命令行传递的参数。其中tf.app.flags.DEFINE_基本类型这个函数则是用来指定命令行参数的名称和默认值。由上面的例子可知,这个函数接收三个参数:命令行参数名、参数默认值和参数说明。当我们要取这个参数值的时候,直接FLAGS.参数名就可以了。
    这里给出一个例子:
# coding: utf-8
import tensorflow as tf
#tf.app.flags.DEFINE_string('f','','kernel')
tf.app.flags.DEFINE_string('testString','untiledString','stringDesc')
tf.app.flags.DEFINE_integer('testInteger',0,'integerDesc')
tf.app.flags.DEFINE_float('testFloat',0.0,'floatDesc')
FLAGS = tf.app.flags.FLAGS
print("String被传入的参数为:", FLAGS.testString)
print("Integer被传入的参数为:", FLAGS.testInteger)
print("Float被传入的参数为:", FLAGS.testFloat)

输出结果:

String被传入的参数为: untiledString
Integer被传入的参数为: 0
Float被传入的参数为: 0.0

·  注意:在jupyter下,需要把tf.app.flags.DEFINE_string(‘f’,’’,‘kernel’) 的注释解开,否则会出现错误:UnrecognizedFlagError: Unknown command line flag 'f’,我是在这个tensorflow的githubissue里面找到解决的方法的:Unknown f 解决方法。
如果,我们要用命令行参数去改变默认的值,则需要这么输入:

python tf_app_flag_Test.py --testString "修改" --testInteger 1 --testFloat 1.0

可以看到输出就变成了:

String被传入的参数为: 修改
Integer被传入的参数为: 1
Float被传入的参数为: 1.0

可以说,tf.app.flag提供了一个可用命令行修改的变量,但是这个变量和tensorflow的图结构是没有关系的,因为它不是一个节点。

2.3 两个常量之间的加和除

# Defining some constant values
a = tf.constant(5.0, name="a")
b = tf.constant(10.0, name="b")

# Some basic operations
x = tf.add(a, b, name="add")
y = tf.divide(a, b, name="divide")

·  这里就可以很明显的看出来,tensorflow定义常量的方式和我们的习惯完全不同。这里的a, b, x, y只是一个个节点,每个节点都履行了不同的职责,等到后面可视化的时候就能很明显看出来。这里有个细节:我们自定义节点的时候,会指定一个name值,这有何必要呢?因为这里的name指的是tensorflow内部节点的名称,可以被永久存储在图里,而外面的变量名只是个引用而已,这个引用可以随时指向其他的变量,因此,当我们需要保存或者恢复节点的时候,只能使用name的值来找到某个节点。还要一点需要提及:常量是不会被改变的。

2.4 Run the Experiment

# Run the session
with tf.Session() as sess:
    writer = tf.summary.FileWriter(os.path.expanduser(FLAGS.log_dir), sess.graph)
    print("output: ", sess.run([a,b,x,y]))
# Closing the writer.
writer.close()
#sess.close()
  • tensorflow如果要运行某个节点的话,就需要用到其与用户交互的session接口,这个接口通过tf.Session()打开,然后用这个接口去run某个节点就可以把对应节点的所保存的值给输出了
  • 至于with…as…是python的知识,就不讲了,用这种方式的话,会自动帮我们关闭session,否则得手动关闭。
  • 这里os.path.expanduser()是用于把路径中的"~“和” ~user"转换成用户目录,不写也可以。因为那位老哥就是这么写的,我尽量不改他的代码,除非他用的函数过时了。
  • tf.summary.FileWriter(path, sess.graph) 就是把tensorflow的图保存到指定的文件夹中。

注意:在jupyter中运行是不会输出图文件的,只会输出运行结果,如果要输出图文件必须要在命令行中运行py文件。.ipynb怎么转.py这里就不讲了。

  • 运行的输出结果为:
output: [5.0, 10.0, 15.0, 0.5]

如果要看保存的图文件,就在命令行输入:

tensorboard --logdir="保存图文件的文件夹绝对路径"

如果出现以下的内容,表明打开成功了:

(tensorflow_cpu) I:\Master\Lab\EMCManagement\code\testFolder>tensorboard --logdir="I:\Master\Lab\EMCManagement\code\testFolder\logs"
TensorBoard 1.14.0 at http://DESKTOP-6FNPC4N:6006/ (Press CTRL+C to quit)

然后在浏览器输入:http://DESKTOP-6FNPC4N:6006/或者http://localhost:6006/就可以看到图啦!!!

在这里插入图片描述
·  可以看到,这些所谓的“常量”和“操作”就是tensorflow图中的一个个节点。

三、总结

·  第一章的入门程序已经结束,下篇笔记不定期更新,至少把tensorflow中的变量写完,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值