什么是变量
Tensorflow中变量和张量都是计算的基本数据类,在上一章的介绍中,张量是不可改变数值,而变量是可变数值的,在训练的过程中,绝大部分训练参数的是变量,如果是一个参数是变量,误差反向传播的时候就会为其创建梯度,进而更新变量。
创建变量
my_tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
my_variable = tf.Variable(my_tensor)
# 就像张量一样,变量也可以是各种数据类型
bool_variable = tf.Variable([False, False, False, True])
complex_variable = tf.Variable([5 + 4j, 6 + 1j])
张量操作
大部分张量的操作也能用在变量上,但是变量不能reshape
print("A variable:",my_variable)
print("\nViewed as a tensor:", tf.convert_to_tensor(my_variable))
print("\nIndex of highest value:", tf.argmax(my_variable))
# 这会创建一个新的张量,它不会重新创建变量。
print("\nCopying and reshaping: ", tf.reshape(my_variable, ([1,4])))
A variable: <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
[3., 4.]], dtype=float32)>
Viewed as a tensor: tf.Tensor(
[[1. 2.]
[3. 4.]], shape=(2, 2), dtype=float32)
Index of highest value: tf.Tensor([1 1], shape=(2,), dtype=int64)
Copying and reshaping: tf.Tensor([[1. 2. 3. 4.]], shape=(1, 4), dtype=float32)
变量的分配
从之前的例子可以看出,变量对应一个支持向量,计算的时候通过支持向量计算。变量可以通过tf.Variable.assign 重新分配张量,同时如果在运算中像使用张量一样使用变量,那么通常会对支持张量执行运算。从现有变量创建新变量会复制支持张量。两个变量不能共享同一内存空间。
a = tf.Variable([2.0, 3.0])
# Create b based on the value of a
b = tf.Variable(a)
a.assign([5, 6])
# a and b are different
print(a.numpy())
print(b.numpy())
# There are other versions of assign
print(a.assign_add([2,3]).numpy()) # [7. 9.]
print(a.assign_sub([7,9]).numpy()) # [0. 0.]
[5. 6.]
[2. 3.]
[7. 9.]
[0. 0.]
放置变量和张量到不同设备
with tf.device('CPU:0'):#如果是GPU,就修改'CPU:0'
# Create some tensors
a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)
print(c)
tf.Tensor(
[[22. 28.]
[49. 64.]], shape=(2, 2), dtype=float32)
参考链接:https://www.tensorflow.org/guide/variable