TensorFlow中的Eager Execution:建立模型的更多Pythonic方式

TensorFlow中的Eager Execution:建立模型的更多Pythonic方式

由Google Brain team创建的TensorFlow是一个流行的用于数值计算和大规模机器学习的开源库。在构建TensorFlow时,谷歌的工程师选择了静态计算图的方法来构建机器学习模型,即在TF中,在模型运行之前静态地定义图,所有与外部世界的通信都通过tf.Session对象和tf.Placeholder执行,这些是张量在运行时将被外部数据替换。

另一方面,另一个受欢迎的机器学习库“PyTorch”使用动态计算图方法,由Facebook开发和维护。在PyTorch中,您可以在运行时定义、更改和执行节点,不需要特殊的会话接口或占位符。PyTorch的性能几乎可以与TF媲美,并且具有直观/容易学习的API,因此它很快在研究社区中成名。

谷歌意识到了这一点,并在v1.7中推出了TensorFlow中的“Eager Execution”。

Enter Eager Execution

什么是Eager Execution?

“一个类似NumPy的数值计算库,支持GPU加速和自动微分,以及灵活的机器学习研究和实验平台。”

Eager Execution的特点?

  • 它与本机Python调试工具兼容
  • Error logging 是立即的
  • 本机Python控制流即循环和递归
  • Eager Execution简化了您的代码
  • 反向传播内置于Eager Execution中
TensorFlow中的Eager Execution:建立模型的更多Pythonic方式

EE禁用

TensorFlow中的Eager Execution:建立模型的更多Pythonic方式

EE启用

建立模型

1、导入stuff 并启用Eager Execution,Python代码如下:

import tensorflow as tf

tf.enable_eager_execution()

tfe = tf.contrib.eager

2.设计模型和损失函数,Python代码如下:

class Model():

def __init__(self, input_shape, output_shape):

self.input_shape = input_shape

self.output_shape = output_shape

self.W = tfe.Variable( tf.random_normal( [self.input_shape, self.output_shape] ) )

self.B = tfe.Variable( tf.random_normal( [self.output_shape] ) )

self.variables = [ self.W, self.B ]

def frwrd_pass(self,X_train):

out = tf.matmul( X_train, self.W ) + self.B

return out

def loss(predicted_y, desired_y):

return tf.reduce_mean(tf.square(predicted_y - desired_y))

注意使用tfe.Variable而不是tf.Variable。“ tf.contrib.eager"模块包含可供eager和图执行环境使用的符号,对于编写代码以使用图非常有用

3.训练循环

def train(X_train, Y_train, epochs):

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1)

for i in range(epochs):

with tf.GradientTape() as tape:

predicted = model.frwrd_pass( X_train )

curr_loss = loss(predicted, Y_train)

grads = tape.gradient( curr_loss, model.variables )

optimizer.apply_gradients(zip(grads, model.variables),

global_step=tf.train.get_or_create_global_step())

print("Loss at step {:d}: {:.3f}".format(i, loss(model.frwrd_pass( X_train ), Y_train)))

这里tf.GradientTape记录forward pass中的所有操作以便稍后应用梯度。tape.gradient函数返回相对于权重和偏差的损失的导数。然后将此传递给optimizer.apply_gradients 完成应用梯度下降的过程。

结论

TF中的这种执行模式使得原型设计变得更加容易。对于任何在TF中构建新计算的人来说,它可能是首选的启动模式。


分享到:


相關文章: