正文
print(m)
# The 1x1 matrix [[4.]]
动态模型可以利用 Python 流控制加以构建。以下示例为利用 TensorFlow 的运算操作进行 Collatz 推理:
a = tf.constant(12)
counter = 0
while not tf.equal(a, 1):
if tf.equal(a % 2, 0):
a = a / 2
else:
a = 3 * a + 1
print(a)
在这里,使用 tf.constant(12) Tensor 对象将把所有数学运算转化为张量运算,因此所有返回值皆将为张量。
大多数 TensorFlow 用户对于自动化区分都很感兴趣。这是因为每次调用期间都会发生不同的运算,因此我们需要将全部正向运算记录在磁带之上,而后在计算梯度时再次播放。在梯度计算完成后,我们将丢弃该磁带。
如果大家熟悉 autograd 软件包,那么这里使用的 API 与其非常相似。举例来说:
def square(x):
return tf.multiply(x, x)
grad = tfe.gradients_function(square)
print(square(3.)) # [9.]
print(grad(3.)) # [6.]
这里的 gradients_function 调用会将 Python 函数 square() 视为一项参数,同时返回一个 Python 可调用函数——此函数负责计算出 square() 的偏导数,结果则作为其输入内容。如此一来,为了在 3.0 条件下计算出 square() 导数,这里需要调用 grad(3.0),结果为 6。
同样的 gradients_function 调用亦可用于获取平方的二阶导数:
gradgrad =
tfe.gradients_function(
lambda x: grad(x)[0])
print(gradgrad(3.)) # [2.]
需要强调的是,控制流可能导致不同的运算操作,具体如下例所示。
def abs(x):
return x if x > 0. else -x
grad = tfe.gradients_function(abs)
print(grad(2.0)) # [1.]
print(grad(-2.0)) # [-1.]
用户可能希望在某一运算或者函数中使用自定义梯度。这种处理方式适用于多种场景,具体包括为一系列运算提供更为有效或者数值更为稳定的梯度。
以下示例展示了自定义梯度的使用方式。让我们首先来看函数 log(1 + e x ) ,其通常使用于交叉熵与对数似然性计算当中。