初识TensorFlow,看了几天教程后有些无聊,决定写些东西,来夯实一下基础,提供些前进动力。session
1、Session.run()和Tensor.eval()的区别:
最主要的区别就是可使用sess.run()一步获取多个Tensor值,而tensor.eval()只能获取当前tensor值。
好比:
labels = [1,2,3]
x = tf.expand_dims(labels, 0)
y = tf.expand_dims(labels, 1)
z = tf.expand_dims(labels, -1)
print(sess.run([x,y,z]))
注:对于tensor t,在使用t.eval()时,等价于:tf.get_default_session().run(t)。
此外,还有一个用法,operation.run(),等价于:tf.get_default_session().run(op)。operation是什么呢,就是计算图中的一个计算节点,定义一个计算的公式。分布式
好比:
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
train_step.run(feed_dict={x:batch_xs,y_:batch_ys,keep_prob:0.5})
注:调用operation.run()和Tensor.eval()时,其参数是session,但该参数可选,默认是None,标示进程中默认的Session。那么如何设置默认session呢?两种方式:
一、with tf.Session():
二、 sess = tf.Session()
with sess.as_default():
print(sess.run([x,y,z]))
sess.close()函数
此外,还能够设置默认图
graph = tf.Graph()学习
with graph.as_default():教程
2、graph和session的必要性进程
Python的计算效率比较低,而深度学习须要大量的迭代计算。因此,一般会使用函数库,如Numpy,把相似矩阵乘法这样的复杂运算使用其余外部语言(好比C++)来实现。但计算完成后从外部切换回Python仍然开销很大。因此,先把全部的计算操做公式定义好(这个用图描述,只是初级都用默认图),而后所有一次性在Python外运行计算(这个在定义的会话session中完成)。这是graph和session的由来及用处。get
session有三种定义方式:
一、该方式须要调用sess.close()来关掉sess。
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)深度学习
sess.close()it
二、该方式建立context,当上下文退出时自动释放,不须要手动关掉session。
with tf.Session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
三、该方式能够在sess中定义operation。
sess = tf.InteractiveSession()io
session能够有多个,graph也能够有多个,具体以下:
Session类的构造函数:tf.Session.__init__(target='',graph=None,config=None)
若是建立Session时没有指定Graph,则Session会加载默认的Graph。若是在一个进程中建立了多个Graph(这是会的,可能有多层,多个结构,或分布式处理),则须要建立不一样的Session来加载每一个Graph,而每一个Graph也能够加载在多个Session中进行计算。一个session中只能有一个图,而一个图能够放在多个session中。
g1 = tf.Graph()
with g1.as_default():
c1 = tf.constant([1.0,1.0])
with tf.Graph().as_default() as g2:
c2 = tf.constant([2.0,2.0])
with tf.Session(graph=g1) as sess1:
print sess1.run(c1)
with tf.Session(graph=g2) as sess2:
print sess2.run(c2)
Graph中的operation定义好以后,看sess.run()要运行哪一个,运行哪一个就触发哪一个。