[tensorflow] placeholder and Variable 变量定义

tf.placeholer() 与 tf.Variable()的区别:
tf.placeholder 占位符。 主要为真实输入数据和输出标签的输入,用于在 feed_dict中的变量,不需要指定初始值,具体值在feed_dict中的变量给出。

示例代码:

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

#This is how you feed the training examples during the training:

for step in xrange(FLAGS.max_steps):
    feed_dict = {
       images_placeholder: images_feed,
       labels_placeholder: labels_feed,
     }
    _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

tf.Variable 主要用于定义weights bias等可训练会改变的变量,必须指定初始值。

示例代码:

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                    stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')

biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')

1. tf.placeholder函数

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

理解: placeholder – 占位符
placeholder的作用可以理解为占个位置,我并不知道这里将会是什么值,但是知道类型和形状等等一些信息,先把这些信息填进去占个位置,然后以后用feed的方式来把这些数据“填”进去。返回的就是一个用来用来处理feeding一个值的tensor。
那么feed的时候一般就会在你之后session的run()方法中用到feed_dict这个参数了。这个参数的内容就是你要“喂”给那个placeholder的内容:

代码示例:

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.

2.tf.Variable()

代码示例:

import tensorflow as tf

'''
函数原型:
tf.Variable.init(initilizer, trainable=True, collections=None, validate_shape=True, name=None)

1.initilizer是初始化参数,常用的可以有:
  tf.random_normal, tf.constant,也可以直接指定变量的值
2.name就是这个变量的名字

在TensorFlow的世界里,变量的定义和初始化是分开的,
所有关于图变量的赋值和计算都要通过tf.Session的run来进行。

想要将所有图变量进行集体初始化时应该使用tf.global_variables_initializer。
'''

# Variable()只有第一个参数是必填参数
# 用于设置初始化的值
x=tf.Variable(3,name='x')
y=x*5
# 直接打印出来的只是y的类型信息
#print(y)

# 如果要打印出y的值,需要使用如下方式
sess1=tf.InteractiveSession()
sess1.run(tf.global_variables_initializer())
print('y=[%s]' %(sess1.run(y)))

a1 = tf.Variable(tf.random_normal(shape=[3,3], mean=0, stddev=1), name='a1')
a2 = tf.Variable(tf.constant(1), name='a2')
a3 = tf.Variable(tf.ones(shape=[3,3]), name='a3')

with tf.Session() as sess2:
    sess2.run(tf.global_variables_initializer())
    print ("a1=[%s]" %(sess2.run(a1)))
    print ("a2=[%s]" %(sess2.run(a2)))
    print ("a3=[%s]" %(sess2.run(a3)))
    
# TensorFlow的命名空间分为两种,tf.variable_scope和tf.name_scope。
# 用这两个关键字来定义全名空间

输出结果:

y=[15]
a1=[[[ 0.79456246  1.15295    -1.7370982 ]
 [ 1.3414627  -0.55975544 -0.44456488]
 [-0.87240374  2.1628578   0.08264139]]]
a2=[1]
a3=[[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]]

3. tf.get_variable()
tf.get_variable跟tf.Variable都可以用来定义图变量,但是前者的必需参数(即第一个参数)并不是图变量的初始值,而是图变量的名称。
tf.Variable的用法要更丰富一点,当指定名称的图变量已经存在时表示获取它,当指定名称的图变量不存在时表示定义它。

代码示例:

import tensorflow as tf

init = tf.constant_initializer([5])
x=tf.get_variable('x',shape=[1],initializer=init)
sess3=tf.InteractiveSession()
sess3.run(x.initializer)
print ("sess3 x=[%s]" %(sess3.run(x)))

基础概念的介绍可看这篇整理:

http://blog.csdn.net/xierhacker/article/details/53103979

 

Leave a Reply

Your email address will not be published.