t f.constant 和t f.variable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010365819/article/details/88128379

在TensorFlow API中创建常量的函数原型如下所示:

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)

可以看到第一个值value是必须的,可以是一个数值,也可以是一个列表。 
如果是数值:

tensor=tf.constant(1)

为查看结果必须创建一个会话,并用取值函数eval()来查看创建的tensor的值:

sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

结果是:1

而如果value是一个列表:

tensor=tf.constant([1, 2])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

结果是:[1 2]

后面四个参数可写可不写,第二个参数表示数据类型,一般可以是tf.float32, tf.float64等:

tensor=tf.constant([1, 2], dtype=tf.float32)
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

结果是: [1. 2.]

注意到数据类型相比之前发生了改变,因为这次我们指定了数据类型为float32,所以不是1 2,而是1. 2.。

第三个参数表示张量的“形状”,即维数以及每一维的大小。如果指定了第三个参数,当第一个参数value是数字时,张量的所有元素都会用该数字填充:

tensor=tf.constant(-1, shape=[2, 3])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

结果是: [[-1 -1 -1]
         [-1 -1 -1]]

可以看到是一个二维张量,第一维大小为2, 第二维大小为3,全用数字-1填充。

而当第一个参数value是一个列表时,注意列表的长度必须小于等于第三个参数shape的大小(即各维大小的乘积),否则会报错:

tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])

Traceback (most recent call last):
  File "<pyshell#68>", line 1, in <module>
    tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
ValueError: Too many elements provided. Needed at most 6, but received 7

这是因为函数会生成一个shape大小的张量,然后用value这个列表中的值一一填充shape中的元素。这里列表大小为7,而shape大小为2*3=6,无法正确填充,所以发生了错误。 
而如果列表大小小于shape大小,则会用列表的最后一项元素填充剩余的张量元素:

tensor=tf.constant([1, 2], shape=[1, 4, 3])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

结果是: [[[1 2 2]
          [2 2 2]
          [2 2 2]
          [2 2 2]]]

第四个参数name可以是任何内容,主要是字符串就行。 
不输入任何内容时:

tensor=tf.constant([1, 2])
print(tensor)

Tensor("Const_16:0", shape=(2,), dtype=int32)

作为对比:

tensor=tf.constant([1, 2], name="jiayu")
print(tensor)

Tensor("jiayu_1:0", shape=(2,), dtype=int32)

第五个参数verify_shape默认为False,如果修改为True的话表示检查value的形状与shape是否相符,如果不符会报错。

tensor=tf.constant([[1, 2, 3], [4, 5, 6]], shape=[2, 3], verify_shape=True)

以上代码value与shape都是两行三列,检查结果正确。而下面的代码会报错:

tensor=tf.constant([1, 2], shape=[3, 2], verify_shape=True)

Tensorflow 中几个特殊张量: 
- tf.Variable 
- tf.constant 
- tf.placeholder

tf.Variable

  Tensorflow 变量是表示程序处理的共享持久状态的最佳方法。

创建变量

  创建变量的最佳方式是调用 tf.get_variable函数。此函数需要指定变量的名字与形状。

# 创建名为‘variable_a’,形状为[1,2,3]的3维张量
variable_a = tf.get_variable("a",shape=[1,2,3])

  tf.get_variable还可以指定数据类型(默认的是 tf.float32)和初始化器。Tensorflow 提供了许多方便的初始化器,比如

tf.zeros_initializer

初始化为0

variable_b = tf.get_variable("b", shape=[1, 2, 3], dtype=tf.float32,
                             initializer=tf.zeros_initializer)

tf.constant_initializer

初始化为常量

value = np.array([0, 1, 2, 3, 4, 5, 6, 7])
variable_c = tf.get_variable("c", dtype=tf.float32, shape=value.shape,
                             initializer=tf.constant_initializer(value))

tf.truncated_normal_initializer

随机初始化

variable_d = tf.get_variable('d', dtype=tf.float32, shape=[4, 3, 4], initializer=tf.truncated_normal_initializer)

tf.contrib.layers.xavier_initializer

随机初始化

variable_e = tf.get_variable('e', dtype=tf.float32, shape=[4, 3, 4], initializer=xavier_initializer())

  此处介绍几种常见的初始化器,其中在初始化方面使用比较多的是后两种,建议使用xavier_initializer初始化器,之前在用 lstm模型进行文本分类过程中,使用truncated_normal_initializer进行初始化,发现在训练过程中,lstm 模型执行少数batch后就收敛,致使模型在训练集和测试集上的准确率都很低。当然,这个也不绝对,具体还是要根据自己的模型而定。

初始化变量

  变量必须先初始化后才可使用。在低级别的编程中,需要明确初始化,高级别框架下是自动初始化的。此处介绍下低级别编程中初始化的问题。

指定初始化某个变量

sess=tf.Session()
sess.run(tf.initialize_variables([variable_c]))

在变量比较少的模型中,使用上述方法是很 ok 的,但是在变量比较多的情况下,使用上述方法可能会很不爽,至少对我是这样的。

初始化全部变量

sess.run(tf.initialize_all_variables())

tf.constant

  使用tf.constant来创建一个常量。

```
# 创建0维常量
tf.constant(0.2,name='a')
# 创建1维常量
tf.constant([1,2,3,4],name='b')
tf.constant(-1.0, shape=[2, 3], name='b')
```
tf.placeholder

  此函数的作用可以作为 java 方法中的形参,用于定义过程,在方法执行时再赋予具体的值。

a = tf.placeholder(dtype=tf.float32, shape=None, name='a')
b = tf.placeholder(dtype=tf.float32, shape=None, name='b')
with tf.Session() as sess:
    print(sess.run(a + b, feed_dict={a: 1, b: 2}))
 

猜你喜欢

转载自blog.csdn.net/u010365819/article/details/88128379
T
今日推荐