由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中
建立模型
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中构建新计算的人来说,它可能是首选的启动模式。
閱讀更多 不靠譜的貓 的文章