二者的主要区别在于
Variable:主要是用于训练变量(trainable variables)之类的。比如我们经常使用的网络权重,偏置。
值得注意的是Variable在声明是必须赋予初始值。在训练过程中该值很可能会进行不断的加减操作变化。
名称的真实含义,在于变量,也即在真实训练时,其值是会改变的,自然事先需要指定初始值;
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1./math.sqrt(float(IMAGE_PIXELS)), name='weights')
)
biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')
- 声明时,若设定参数trainable=False,那么参数不会被改变,默认trainable=True;
placeholder: 用于得到传递进来的真实的训练样本
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
- 不必指定初始值,可在运行时,通过 Session.run 的函数的 feed_dict 参数指定;
- 也是用于存储数据,但是主要用于feed_dict的配合,接收输入数据用于训练模型等。placeholder值在训练过程中会不断地被赋予新的值,用于批训练,基本上其值是不会轻易进行加减操作。
placeholder在命名时是不会需要赋予值得,其被赋予值得时间实在feed_dict时。其命名的原因所在,仅仅作为一种占位符;
tf.placeholder(dtype, shape=None, name=None)
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
参数:
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定
name:名称。
images_placeholder = tf.placeholder(tf.float32, shape=[batch_size, IMAGE_PIXELS])
labels_placeholder = tf.placeholder(tf.int32, shape=[batch_size])