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).
例子:
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()