tensorflow简记

tensorflow简记
上一篇主目录 下一篇

前言


1 什么是tensorflow

TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点代表数学运算,而图中的边则代表在这些节点之间传递的多维数组(张量),用于进行机器学习和深度神经网络研究,但它是一个非常基础的系统,因此也可以应用于众多其他领域。

2 Tensorflow应用例子

tensorflow playground
星际争霸

3 tensorflow关键部分

3.1 tensor和op

定义两个tensorflow下的数a,b,称之为 tensor
Tensor? Flow?tensor是张量的意思,顾名思义,是一个能够存储多维数组的tensorflow数据结构,它的元素可以是int类型,float类型,bool类型,还有string类型等等.flow是流动的意思,tensor为什么可以flow呢?我们通过官网的例子来一探究竟.上面这段代码看上去非常简单,从结果上来看是在计算一个数学表达式32+10的值,却也完整展示了tensorflow运行的基本构架.首先,第一行a = tf.constant(32)定义了一个常量tensor,它的值为32,第二行也是类似.在我们运行tensorflow程序的时候,任何数据都必须转换成tensor类型才能够进入这个系统,我们先牢记这一点,之后会对它进行优缺点分析.那么现在我们就有了两个常量tensor.但是仅仅定义了两个用于存储数据的tensor毫无用处,我们希望能够实现的是这两个数的加法运算.

a=tf.constant(32)
b=tf.constant(10)

在这里插入图片描述
通过加法运算将这两个数生成一个新的数c

c=tf.add(a,b)

在这里插入图片描述
以上成为构造图
这张图揭示了加法运算的过程,通过+这个符号将两个数连接起来,并生成了一个新的数.这正是tensorflow致力于实现的目标,通过tf.add()这个函数,将两个tensor连接起来并生成了一个新的tensor:c.实际上,定义在一个或者多个tensor上的函数在tensorflow中被封装成operator的概念.还可以发现,加法只是一个关于两个数和一个操作的关系,对于输入的数据是1,2还是32,10完全不会有任何本质改变. 因此, 整个计算图以符号计算的定义方式, 被封装成了Graph,也就是图的概念.到这里, 我们通过构建两个tensor以及一个operation完成了一个Graph的创建. 这些是我们运行tensorflow程序的标准步骤, 但还并没有结束. .
在这里插入图片描述
此时相信我们中的大部分都会心里产生巨大的疑惑, 怎么会输出这么一堆看不懂的东西, 我只是想让它像定义时那样输出32, 10, 42就好了啊, 难道我的print函数坏掉了?无论你如何进行尝试, 你会发现都没有出现你想要的结果, 因为就像刚才说的, 在tensorflow下, 所有的tensor都是一种符号, 用来构建整个Graph的, 它是什么值并不重要, 所以就无法在构建图之后进行打印看它的值了.但这显然不是我们想要看到的, 如何才能正确打印这些值呢? 事实上, tensorflow将构建图和执行图分成了两个独立的步骤, 也就是说你要先构建一个完整的计算图, 此时你无法获取图的具体信息, 但是随后你可以开始进入图的执行过程, 这样你就可以获得图执行时每个tensor的具体值了. 怎样进入图的执行呢?
需要用 session去运行图中的tensor

3.2 Session会话

开启Session(会话):简单的sess = tf.Session()就可以搞定. 开启会话后, 我们就可以执行图中的各个tensor了, 用的正是sess.run()这个语句.现在我们可以试试下面这些命令了:我们可以将执行图的结果保存到正常的变量中, tensorflow称这个过程为fetch.

import tensorflow as tf #导入TensorFlow库,取别名tf
a = tf.Variable(5, name="input_a")#定义节点a,创建常量Op,接收单个张量值5,输出给连接节点,以             input_a标识。
b = tf.constant(3, name="input_b")#定义节点b,创建常量Op,接收单个张量值3,输出给连接节点,以input_b标识。
c = tf.multiply(a,b, name="mul_c")#定义节点c,创建乘法Op,接收两个输入,输出乘积,以mul_c标识。
d = tf.add(a,b, name="add_d")#定义节点d,创建加法Op,接收两个输入,输出求和,以add_d标识。
e = tf.add(c,d, name="add_e")#定义节点e,创建加法Op,接收两个输入,输出求和,以add_e标识。

init=tf.global_variables_initializer()#初始化全部变量
with tf.Session() as sess:
    sess.run(init)
    output=sess.run(e)#fetch
    print(output)
    sess.close()#关闭Session对象

每个变量都有一个initializer的函数, 规定这个变量的初始值是什么. 因此, 在执行图的过程中必须要先初始化变量后才能够使用. 可以通过下面的这些方法进行初始化:

#一次性初始化所有的变量
init = tf.global_variables_initializer()

3.3 placeholder

tensorflow引入了一个占位符.(placeholder)的概念. 字如其面, 它只是占着构建图的一个位置,没有具体数值, 但必须要有具体的类型以及形状. 我们来看看这个古怪的东西是如何定义的吧.

##定义一个占位符
tf.placeholder(dtype, shape=None, name=None)
# 定义一个`float32`型的占位符,它是一个⻓为3的向量
a = tf.placeholder(tf.float32, shape=[3])
# 定义一个`bool`型的占位符, 它是一个`1x2`的矩阵
b = tf.placeholder(tf.bool, shape=[1, 2])

如果我们还像之前那样企图用a.eval()的话, 就会体会到placeholder的特别之处, 因为它真的没有任何值! 实际上,在执行图的过程中, 我们必须要用字典的方式给placeholder喂入具体值, 这个过程称为**feed.**表现在程序中, 就是我们在获取一个占位符的值的时候, 需要给run()增加一个feed_dict的参数, 这个参数是一个dict, 它的key是占位符的变量名, 它的val是需要喂入的具体值. 当然, 这个字典可以有很多个key, 也就是说可以一次喂入很多个占位

print(sess.run(a, feed_dict={a: [1, 2, 3]}))
print(sess.run([a, b], feed_dict={a: [1, 2, 3], b: [[True, False]]}))

3.4 graph

如何才能获得这个完整的图呢

g = tf.get_default_graph()
print(g)

好了, 得到这个图之后, 我们当然可以往前回溯我们创建过的图的每一个节点, 通过g.get_operations()就可以查到所有的节点. 我们还可以通过g.get_tensor_by_name()获得对应name的tensor
生成新图
上面介绍了tensorflow运行程序时的默认图, 那么我们可以构造有别于默认图的新图吗? 当然可以的, 通过g1=tf.Graph()就可以办到. 但这并没有结束, 我们需要将这个图设置为我们构造tensor以及op的默认图, 让程序能够理解我们将要定义的tensor到底在哪个图里定义, 因此我们还需要通过python的with语句来确立图的作用范围.然后我们可以通过变量的.graph属性来确定它在哪个图中

##定义一个新图, 注意它和之前的g有什么不同
g1 = tf.Graph()
print('g1: ', g1)
##将这个新图作为默认图,注意前后默认图有没有不同
print('default_graph: ',tf.get_default_graph())
g1.as_default()print('default_graph: ',tf.get_default_graph())
##在这个新图后面定义新的`tensor`
a1 = tf.constant(32, name='a1')
with g1. as_default():
	a2 = tf.constant(32, name='a2')
##查看`tensor`从属的图
print('a.graph: ', a.graph)
print('a1.graph: ', a1.graph)
print('a2.graph: ', a2.graph)withtf.Session() 

3.5 图的可视化

完整代码:

import tensorflow as tf #导入TensorFlow库,取别名tf
a = tf.Variable(5, name="input_a")#定义节点a,创建常量Op,接收单个张量值5,输出给连接节点,以             input_a标识。
b = tf.constant(3, name="input_b")#定义节点b,创建常量Op,接收单个张量值3,输出给连接节点,以input_b标识。
c = tf.multiply(a,b, name="mul_c")#定义节点c,创建乘法Op,接收两个输入,输出乘积,以mul_c标识。
d = tf.add(a,b, name="add_d")#定义节点d,创建加法Op,接收两个输入,输出求和,以add_d标识。
e = tf.add(c,d, name="add_e")#定义节点e,创建加法Op,接收两个输入,输出求和,以add_e标识。

init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    output=sess.run(e)
    writer = tf.summary.FileWriter('.', sess.graph)#创建并启动summary.FileWriter对象,接收两个参数,一是数据流图磁盘存放路径;二是Session对象graph属性。
    writer.close()#关闭summary.FileWriter对象
    sess.close()#关闭Session对象

首先我们需要将我们想要可视化的图导入到tensorboard可以解析的文件中

with tf.Session() assess:
	graph_writer = tf.summary.FileWriter('.', sess.graph)

这个时候在当前目录中你就会多一个events.*的文件, 这个就是需要的文件.然后我们在当前目录打开终端(一般来说是右键, 点击Open in New Terminal或者是在终端中打开),键入以下命令

tensorboard -logdir=.

然后就会有一个这样的输出

在这里插入图片描述

然后我们打开浏览器, 输入at后面的链接http://USERNAME:6006,进入.你就会发现这样的界面

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值