【TensorFlow】占位符:tf.placeholder,与feed_dict

Tensorflow中的placeholder和feed_dict的使用_python_ https://www.jb51.net/article/143407.htm

  • TensorFlow 支持占位符placeholder。占位符并没有初始值,它只会分配必要的内存。在会话中,占位符可以使用 feed_dict 馈送数据
  • feed_dict是一个字典,在字典中需要给出每一个用到的占位符的取值。

在训练神经网络时需要每次提供一个批量的训练样本,如果每次迭代选取的数据要通过常量表示,那么TensorFlow 的计算图会非常大。因为每增加一个常量,TensorFlow 都会在计算图中增加一个结点。所以说拥有几百万次迭代的神经网络会拥有极其庞大的计算图,而占位符却可以解决这一点,它只会拥有占位符这一个结点。

TensorFlow占位符:tf.placeholder_w3cschool https://www.w3cschool.cn/tensorflow_python/tensorflow_python-w7yt2fwc.html

tf.placeholder 函数

插入一个张量的占位符,这个张量将一直被提供.

placeholder(
    dtype,     #数据类型。常用的是tf.float32,tf.float64等数值类型
    shape=None,#数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
    name=None  #名称
)

注意:如果直接计算,该张量将产生一个错误,
其值必须使用 feed_dict 可选参数来进行 session . run()、Tensor.eval() 或 oper.run().

例如:

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.

结果
直接使用第一个print(),将会报错。
注释掉第一个print(),只使用第二个print(),可以得到输出

[[261.73425 255.55272 268.38885 ... 252.50725 255.53036 253.73174]
 [259.19962 251.43718 262.5757  ... 250.7209  250.74828 246.13264]
 [259.62115 258.0193  267.74112 ... 257.23807 256.81686 255.55588]
 ...
 [251.76048 251.21404 260.04114 ... 247.14397 245.91084 252.86714]
 [259.65738 265.2368  270.59677 ... 257.5804  258.19977 259.24487]
 [267.98984 262.7721  274.996   ... 264.392   263.63516 255.82683]]

为什么要用placeholder?

Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。

placeholder有点像在定义函数的时候用到的参数。我们在写函数内部代码的时候,虽然用到了参数,但并不知道参数所代表的值。只有在调用函数的时候,我们才把具体的值传递给参数。

feed_dict() 函数

我们都知道feed_dict的作用:是给使用placeholder创建出来的tensor赋值。
刚学tensorflow的时候,以为feed_dict是和placeholder配对使用的。比如下面的代码,说明了feed_dict的基本用法:

import tensorflow as tf
 
a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
c = tf.add(a, b)
 
with tf.Session() as sess:
    print sess.run(c, feed_dict = {a: 1.0, b: 2.0})

其实feed_dict可以喂东西给其他tensor,不止placeholder这一种。例如,下面的代码:

import tensorflow as tf
 
a = tf.placeholder(dtype=tf.float32)
b = tf.constant(2.0)
c = tf.add(a, b)
 
with tf.Session() as sess:
    print sess.run(c, feed_dict = {a: 1.0, b: 3.0})

运行的结果为4,这里利用feed_dict将3.0送给了tensor b。

总结一下,知道了这种原理,对于模型恢复的理解很有帮助。机器学习系统伴随着tensor的流动(tensorflow的寓意即为此,神经网络等等,其实就是tensor的线性变换和非线性激活),也许,我们只拿到了中间的tensor。
举例而言,你在做图片分类的工作,训练过程中,graph的placeholder为任意size的像素矩阵,但当你恢复模型的时候,已经有预处理完的图片像素tensor,这时就可以直接将其导入对应的tensor中即可,前提是知道对应的tensor的name或者符号,此时或许需要用到tf.get_tensor_by_name这个函数。feed_dict的灵活运用,也能反映出对graph思想理解。

原文:
https://blog.csdn.net/kdongyi/article/details/82343712
https://www.jianshu.com/p/ec261a65e3c9

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值