TensorFlow的自动求导机制
tensorflow提供了强大的自动求导机制,在编程时,不用再一步一步的去写如何计算偏导数的代码了,即使你不会求偏导数,也可以使用tensorflow轻松实现梯度下降法。
我们知道在tensorflow中所有的运算都是在张量中完成的,张量由tensor对象来实现。
除此之外,tensorflow还提供了Variable对象。
- 它是对tensor对象的进一步封装
- 它能够在模型训练的过程中自动记录梯度信息,并且由算法自动调整和优化
- 它的取值是一种能够被自动训练的变量
- 因此在机器学习中可以作为模型参数来使用
tf.Variable(initial_value, dtype)
参数initial_value用来指定张量的初始值,他可以是数字,python列表也可以是numpy数组或者tensor对象。
创建可训练变量变量
例如这是使用数字作为参数,这个tf.Variable()表示这是tensorflow的Variable对象,这分别是它的形状,数据类型和取值
tf.Variable(3)
# <tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>
这是使用列表作为Variable对象的初始值
tf.Variable([1, 2])
# <tf.Variable 'Variable:0' shape=(2,) dtype=int32, numpy=array([1, 2])>
这是使用numpy数组作为Variable对象的初始值
tf.Variable(np.array([1, 2]))
# <tf.Variable 'Variable:0' shape=(2,) dtype=int32, numpy=array([1, 2])>
在这几个例子中初始值都是以整数的形式给出的,tensorflow中默认的整数类型是32位整数
这里将初始值修改为小数的形式。
tf.Variable(3.)
# <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=3.0>
tf.Variable([1, 2], dtype=tf.float64)
#<tf.Variable 'Variable:0' shape=(2,) dtype=float64, numpy=array([1., 2.])>
tensorflow中默认的浮点数类型是32位浮点数,也可以使用Variable函数中的dtype参数,指定数据类型,这里指定为64位浮点数,不过一般情况下机器学习中的参数使用32位浮点数就足够了,使用64位浮点数反而会降低程序的执行效率。
将张量封装为可训练变量
tf.Variable函数的初始值还可以是张量,我们之前学习过的所有创建张亮的函数所创建出的张量都可以被封装成可训练的变量。
tf.Variable(tf.constant([[1, 2], [3, 4]]))
<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32, numpy=
array([[1, 2],
[3, 4]])>
tf.Variable(tf.zeros([2, 3]))
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy=
array([[0., 0., 0.],
[0., 0., 0.]], dtype=float32)>
tf.Variable(tf.random.normal([2, 2]))
<tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[ 1.50841 , 0.3587348 ],
[ 0.14759514, -0.8701149 ]], dtype=float32)>
使用变量名
也可以把可训练变量赋值给一个Python变量,然后使用这个变量名来访问它。
x = tf.Variable([1, 2])
x
# <tf.Variable 'Variable:0' shape=(2,) dtype=int32, numpy=array([1, 2])>
print(x.shape, x.dtype)
# (2,) <dtype: 'int32'>
print(x.numpy())
# [1 2]
这里将这个可训练变量赋值给x,下面就可以使用x来访问它。这是使用变量名来访问它的属性。也可以使用这个变量的numpy方法来读取它的取值。
trainable属性
Valuable对象,还有一个属性trainable,表示它是一个可以被训练的变量,它的值能够被算法自动的训练
x.trainable
# True
使用type函数显示x的类型可以看到,它由ResourceValuable来实现的
type(x)
# <class 'tensorflow.python.ops.resource_variable_ops.ResourceVariable'>
可训练变量赋值
变量.assign()
例如,首先创建可训练变量x,然后使用它的assign方法,把它的值修改为(3, 4)
x = tf.Variable([1, 2])
x.assign([3, 4])
# <tf.Variable 'UnreadVariable' shape=(2,) dtype=int32, numpy=array([3, 4])>
还可以使用变量对象的assign_add()
或者assign_sub()
的方法实现加法赋值和减法赋值
x.assign_add([1, 1])
# <tf.Variable 'UnreadVariable' shape=(2,) dtype=int32, numpy=array([4, 5])>
x.assign_add([1, 1])
# <tf.Variable 'UnreadVariable' shape=(2,) dtype=int32, numpy=array([5, 6])>
例如这是变量加法赋值运算变量的值,从(3, 4)变成了(4, 5)
tensor对象是没有这两个属性的
可以用isinstance()方法来判断他们的类型