函数说明
tf.placeholder(
dtype,
shape=None,
name=None
)
dtype:数据类型。例如tf.float32,tf.float64等
shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
name:名称
Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。
所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。
如果每一个tensor值在graph上都是一个op,当我们将train数据分成一个个minibatch然后传入网络进行训练时,每一个minibatch都将是一个op,这样的话,一副graph上的op未免太多,也会产生巨大的开销。
tf.placeholder()
我们每次可以将 一个minibatch传入到x = tf.placeholder(tf.float32,[None,32])上,下一次传入的x都替换掉上一次传入的x,这样就对于所有传入的minibatch x就只会产生一个op。不会产生其他多余的op,进而减少了graph的开销。
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, shape=(3, 3))
y = tf.matmul(x, x)
with tf.Session() as sess:
rand_array = np.random.rand(3, 3)
print(sess.run(y, feed_dict={x: rand_array}))
[[0.6031188 0.14761916 0.20704076]
[0.3772217 0.21644452 0.22377962]
[0.43431318 0.14390106 0.18814996]]