在tf里,placeholder方法可以说是最常见,用的最多的一个api了,这里就介绍一下这个api的具体使用情况。
通常placeholder的作用理解为是占位符,不过占位符这个概念似乎有些抽象,字面意思其实就是它的作用 — 占个位置,那啥东西是占个位置啊,大家只要写过函数就知道,形参就是占位置嘛。就像java或者C++里定义一个函数,会有形参,用来代替实际参数,在实际调用该方法的时候传入实参。
注意:占位符并没有初始值,它只会分配必要的内存
1、基本信息
先看一下方法的基本定义:
tf.placeholder(
dtype,
shape=None,
name=None
)
输入参数共有三个:dtype,shape,name
- dtype:表示输入的张量数据类型,常用的有float32,int32,float64等
- shape:表示输入的张量大小,默认是None,也可以表示多维,如 (2, 3) 表示2行3列,(None, 4) 表示4列但行数不确定,这种写法非常常见
- name:表示输入张量的名称
2、样例
看一下官网给的demo
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
print(sess.run(y)) # ERROR: will fail because x was not fed.
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.
解释一下上面的样例,首先定义了一个占位符 x,传入的张量数据类型是float32,大小是1024*1024,然后定义了一个张量运算,x * x,将结果返回给 y,就这么简单。
我们可以看到,第5行代码打印了 y 的运行结果,但是这样的写法是不对的,因为这个时候,x是没有被赋值初始化的,会报错。
必须按照第7,8两行的写法,先初始化一个对应 x 大小的张量,再把这个初始化张量通过 feed_dict 赋值给 x,在计算 y 的时候 x 就是已经初始化了
注意:feed_dict是一个字典,在字典中需要给出每一个用到的占位符的取值
demo 1
x = tf.placeholder(tf.float32, shape=(2, 2))
y = tf.matmul(x, x)
with tf.Session() as sess:
rand_array = np.random.rand(2, 2)
print(rand_array)
print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.
" 运行结果:"
# rand_array
[[0.08920081 0.76900946]
[0.45190084 0.96919868]]
# y
[[0.3554728 0.81391925]
[0.47829163 1.2868621 ]]
demo 2
# 定义两个占位符,在feed_dict里就要传入两个占位符的取值
x1 = tf.placeholder(tf.float32, shape=(2, 3))
x2 = tf.placeholder(tf.float32, shape=(3, 2))
y = tf.matmul(x1, x2)
with tf.Session() as sess:
ra1 = np.random.rand(2, 3)
ra2 = np.random.rand(3, 2)
print('ra1: ', ra1)
print('ra2: ', ra2)
print('y: ', sess.run(y, feed_dict={x1: ra1, x2: ra2})) # Will succeed.
'运行结果:'
ra1: [[0.29002803 0.79811589 0.14638663]
[0.78678378 0.98518073 0.15522269]]
ra2: [[0.39635025 0.65686898]
[0.61683618 0.48875637]
[0.20795447 0.93733294]]
y: [[0.6377012 0.71780765]
[0.9518163 1.1438226 ]]