Tensorflow中Placeholder用法

Placeholder的中文意思就是占位符,用于在会话运行时动态提供输入数据。Placeholder相当于定义了一个位置在这个位置上的数据在程序运行时再指定。
在以后的编程中我们可能会遇到这样的情况:在训练神经网络时需要每次提供一个批量的训练样本如果每次迭代选取的数据要通过常量表示,那么TensorFlow 的计算图会非常大。因为每增加一个常量,TensorFlow 都会在计算图中增加一个结点,所以说拥有几百万次迭代的神经网络会拥有极其庞大的计算图,而占位符却可以解决这一点,它只会拥有占位符这一个结点,Placeholder机制的出现就是为了解决这个问题,我们在编程的时候只需要把数据通过placeholder传入tensorflow计算图即可,我们通过下面的代码演示来这个方法:

import tensorflow as tf

a = tf.placeholder(tf.float32, shape=(2), name="a")
b = tf.placeholder(tf.float32, shape=(2), name="b")

output = tf.add(a, b)

with tf.Session() as sess:
    print(sess.run(output, feed_dict={a: [7.0, 1.0], b: [2.0, 3.0]}))

# output:
# [9. 4.]

我们可以看到上面就是两个数组相加的结果。此外我们在定义placeholder时这个位置上的数据类型(dtype参数)是需要指定的而且数据类型是不可以改变的,比如有(tf.float16,tf.float32)。Placeholder中shape参数就是数据维度信息对于不确定的维度,可以填入None。
在上面定义的a和b是变量,这里把他们定义为一个placeholder,因此我们在运行Session.run()函数时,我们注意到一个feed_dict函数,这个函数的用法是用来提供a和b的取值feed_dict是一个字典,在字典中需要给出每个用到的占位符的取值,如果参与运算的placeholder没有被指定取值,那么程序就会报错。
Placeholder的目的是为了解决如何在有校的输入节点上实现高效地接受大量数据的问题。在上面的例子中如果把b从长度为2改为大小为n*2的矩阵,矩阵的每一行为一个样例数据,这样向量相加之后的结果为n*2的矩阵,也就是n个向量相加的结果了,矩阵的每一行就代表了一个向量相加的结果,下面我们展示一下n=3的例子:

import tensorflow as tf

a = tf.placeholder(tf.float32, shape=(2), name="a")
b = tf.placeholder(tf.float32, shape=(3, 2), name="b")
c = a + b
print(c)

with tf.Session() as sess:
    print(sess.run(c, feed_dict={a: [7.0, 1.0], b: [[5.0, 2.0], [6.0, 5.0], [2.0, 3.0]]}))

# 输出结果:
# Tensor("add:0", shape=(3, 2), dtype=float32)
# [[12.  3.]
#  [13.  6.]
#  [ 9.  4.]]

从上面的样例中我们可以看到a+b的输出就是一个3x2的矩阵,最后得到的c的大小就是每一个向量相加的之后的值。
变量、常量和占位符之间的区别:

常量在运行过程中值不会改变的单元,在TensorFlow中无须进行初始化操作

创建语句constant_ name =tf.constant(value)

变量:在运行过程中值会改变的单元,在TensorFlow中须进行初始化操作

创建语句name_variable =tf.Variable(value, name)

占位符:TensorFlow中的Variable变量类型,在定义时需要初始化,但有些变量定义时并不知道其数值,只有当真正开始运行程序时,才由外部输入,比如训练数据,这时候需要用到占位符。占位变量是一种TensorFlow用来解决读取大量训练数据问题的机制,它允许你现在不用给它赋值,随着训练的开始,再把训练数据传送给训练网络学习。

其参数为数据的Type和Shape占位符Placeholder的函数接口如下:tf.placeholder(dtype, shape=None, name=None)

区别:常量不能改变,变量可以改变,且变量比常量增加了一个init初始化变量,并调用会话的run命令对参数进行初始化,使用了Variable变量类型,不进行初始化数值会出现运行错误。另外,常量存储在计算图的定义中,每次加载图时都会加载相关变量。即它们是占用内存的。另一方面,变量又是分开存储的。它们可以存储在参数服务器上。占位符不包含任何数据,因此不需要初始化。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值