Tensorflow的大致运行模式(思想)和占位符

为什么说是大致呢?作为一个初学者刚看TensorFlow没几天,所以也就是根据自己的理解来说说,所以只能是大致,并且很有可能还是错的,只是目前为止的个人见解。

1. 运行模式

TensorFlow翻译成中文就是张量流,所以TensorFlow至少代表着两个概念:“张量”和“流”。这儿不过多的追究张量,可以简单的把它理解成变量;关键要说的是“流”。

怎么来说明这个“流”呢?我们先来看一段用python写的普通代码:

a=1
print("a=",a) # a = 1
b=2
print("b=",b) # b = 2
c=a+b
print("c=",c) # c = 3
d=b+2
print("d=",d) # d = 4
e=c*d
print("e=",e) # e = 13

似乎看起来也没啥很平常,当然也确实没啥。之所以这么认为是因为没有对比,所谓没有对比就没有伤害。下面我们用TensorFlow框架再来把这段程序写一遍

import tensorflow as tf
a=tf.constant([1],dtype=tf.int32,name='iama')
print(a)
b=tf.constant([2],dtype=tf.int32,name='iamb')
print(b)
c=a+b
print(c)
d=b+2
print(d)
e=c*d
print(e)

结果:
Tensor("iama:0", shape=(1,), dtype=int32)
Tensor("iamb:0", shape=(1,), dtype=int32)
Tensor("add:0", shape=(1,), dtype=int32)
Tensor("add_1:0", shape=(1,), dtype=int32)
Tensor("mul:0", shape=(1,), dtype=int32)

发现没有,居然和我们想象中的结果不一样,输出来的只是每个变量的信息。那这么样才能得到我们想象说得结果呢?

在第18号后面加上如下几句代码即可:

with tf.Session() as sess:
    print(sess.run(a))
    print(sess.run(b))
    print(sess.run(c))
    print(sess.run(d))
    print(sess.run(e))

结果
[1]
[2]
[3]
[4]
[12]

从上面的两个例子可以发现:
(1)传统方式写的程序,对于任意一个变量,我们随时都可以输出其结果;
(2)用TensorFlow框架写的程序,对于每一个变量,我们必须run()一下才能得到其对应的结果;

为什么会这样呢?根据上面的程序,我们可以大致画出如下一个计算图:

这里写图片描述

里面的每一个节点,表示的仅仅只是其对应的结构信息(形状,类型,操作等),并不是代表其真实值。例如a节点表示"iama:0", shape=(1,), dtype=int32;c节点表示Tensor("add:0", shape=(1,), dtype=int32),其中’add’是指c这个变量是通过加法操作得到的。

每一条边表示各个变量之间的依赖关系。如c依赖于a,b;a,b不依赖于任何变量。当执行run()的时候,就对应执行每个节点所对应的操作,并且返回这个操作后的结果,这就是TensorFlow的设计理念。

例如:
在执行run(a)时,就对应把1赋值给常量a;
在执行run(c)时,就对应先把1赋值给常量a,再把2赋值给常量b,最后把a+b这个操作后的结果赋值给c;
在执行run(e)时,就对应把图中所有的操作都执行一遍,TensorFlow会根据图中的依赖关系自动处理;

由此我们可以知道:run(node)的本质就是执行所有node所依赖的节点对应的操作,并且返回node节点对应操作后的值

所以,利用TensorFlow框架写程序时定义的每一变量、常量,其实都只是在计算图上生成了一个对应的节点。

2. tf.placeholder()

刚开始接触TensorFlow的时候,总会被这个placeholder()占位符所困惑。有了上面对于TensorFlow理念的理解,再来看这个占位符就会一目了然了。

TensorFlow写网络的时候,训练前我们往往不知道x和y的具体大小,但在写前项传播时又不得不先在计算图中定义这么一个节点,因为其他变量会依赖它。此时,我们就可以先在网络中给这些变量留(占)一个位置,等到训练的时候根据batch的尺寸就能确定x,y的大小了。而用来占位置的东西,我们就称之为占位符,先把茅坑占着。

这里写图片描述

3. 实例

TensoFlow全连接网络MNIST数字识别与计算图

猜你喜欢

转载自blog.csdn.net/The_lastest/article/details/81052658