TensorFlow学习关于sess.run()的理解

TensorFlow学习关于sess.run()的理解

1.函数原型

tf.Session.run(fetches, feed_dict=None)

2.函数功能

Runs the operations and evaluates the tensors in fetches.

3.函数参数
参数

fetches: A single graph element, or a list of graph elements (described above).
feed_dict: A dictionary that maps graph elements to values (described above).

返回值

Either a single value if fetches is a single graph element, or a list of values if fetches is a list (described above).
  • 在一个sess.run()环境中, 一个大图里面的节点只会计算一次,哪怕有c->a->b这种依赖关系,运行sess.run([a,b])这种时候,a也只会被执行一次。其内部的机制是:先查看图中的依赖关系,得到本次sess.run()需要计算图中那些节点,然后进行一次计算,返回计算的a,b的值。
  • 如果是多次调用sess.run()那么就会计算多次。

例子:

import tensorflow as tf
"""
a、初始化一个常量(已分配内存)
b、定义一个变量 还没有初始化
"""
a = tf.constant(1)
"""
Variable:作为存储节点的变量(Variable)不是一个简单的节点,而是一副由四个子节点构成的子图:
        (1)变量的初始值——initial_value。
        (2)更新变量值的操作op——Assign。
        (3)读取变量值的操作op——read
        (4)变量操作——(a)
上述四个步骤即:首先,将initial_value赋值(Assign)给节点,存储在(a)当中,当需要读取该变量时,调用read函数取值即可
"""
b = tf.Variable(1)
"""
tf.assign(a, b) 把b的值赋值给a
"""
addop = tf.assign(b, b + 3)
c = addop + a
with tf.Session() as sess:
    """
     用来初始化 计算图中 所有global variable的 op
    """
    tf.global_variables_initializer().run()
    # 执行
    cc, bb = sess.run([addop, c])
    print(cc, bb)
    bb = sess.run(addop)
    print(bb)
Answer:
4 5
7

feed_dict 参数的作用是替换图中的tensor的值。例如

a = tf.add(2, 5)
b = tf.multiply(a, 3)
with tf.Session() as sess:
    print(sess.run(b))
    """
    替换a的值
    """
    replace_dict = {a:15}
    print(sess.run(b, feed_dict=replace_dict))
Answer:
21
45

这样做的好处是在某些情况下尅避免一些不必要的计算,除此之外,feed_dict还可以用来设置graph的输入值,这就引入了。

x = tf.placeholder(tf.float32, shape=(1, 2))
"""
就是按照正态分布初始化权重,
mean是正态分布的平均值,
stddev是正态分布的标准差(standard deviation),
seed是作为分布的random seed(随机种子,我百度了一下,跟什么伪随机数发生器还有关,就是产生随机数的)
"""
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
"""
matmul矩阵相乘
"""
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y, feed_dict={x: [[0.7, 0.5]]}))
Answer:
[[3.0904665]]

或者多输入:

x = tf.placeholder(tf.float32, shape=(None, 2))
"""
就是按照正态分布初始化权重,
mean是正态分布的平均值,
stddev是正态分布的标准差(standard deviation),
seed是作为分布的random seed(随机种子,我百度了一下,跟什么伪随机数发生器还有关,就是产生随机数的)
"""
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
"""
matmul矩阵相乘
"""
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print("矩阵计算结果")
    print(sess.run(y, feed_dict={x: [[0.7, 0.5], [0.2, 0.3], [0.3, 0.4]]}))
    print("w1结果")
    print(sess.run(w1))
    print("w2结果")
    print(sess.run(w2))
Answer:
矩阵计算结果
[[3.0904665]
 [1.2236414]
 [1.7270732]]
w1结果
[[-0.8113182   1.4845988   0.06532937]
 [-2.4427042   0.0992484   0.5912243 ]]
w2结果
[[-0.8113182 ]
 [ 1.4845988 ]
 [ 0.06532937]]

注意:

此时的a不是一个tensor,而是一个placeholder。我们定义了它的type和shape,但是并没有具体的值。在后面定义graph的代码中,placeholder看上去和普通的tensor对象一样。在运行程序的时候我们用feed_dict的方式把具体的值提供给placeholder,达到了给graph提供input的目的。
placeholder有点像在定义函数的时候用到的参数

这个例子使用TensorFlow构建一个简单的计算图:

# 使用tensorflow在默认的图中创建节点,这个节点是一个变量,命名为“counter”
state = tf.Variable(0, name="counter")

# 创建一个常量
one = tf.constant(10)

# 对常量与变量进行简单的加法操作,这点需要说明的是: 在TensoorFlow中,
# 所有的操作op和变量都视为节点,tf.add() 的意思就是在tf的默认图中添加一个op,这个op是用来做加法操作的。
new_value = tf.add(state, one)

# 赋值操作。将new_value的值赋值给update变量
update = tf.assign(state, new_value)

# 此处用于初始化变量。但是这句话仍然不会立即执行。需要通过sess来将数据流动起来 。如果有Variable,一定需要写这句话
init = tf.initialize_all_variables()

# 切记:所有的运算都应该在session中进行,即 with tf.Session() as sess
with tf.Session() as sess:
    # 对变量进行初始化,执行(run)init语句
    sess.run(init)
    # 循环3次,并且打印输出。
    for _ in range(3):
        sess.run(update)
        # 打印变量时也需要用sess.run
        print(sess.run(state))
Answer:
10
20
30

参考:
https://www.jianshu.com/p/e4cc63523b6c
sess.run()

你可能感兴趣的:(TensorFlow学习)