TensorFlow 入门指南:Eager Execution 模式实战
概述
本文基于 Google Cloud Platform 的机器学习课程内容,重点讲解 TensorFlow 的 Eager Execution 模式。我们将通过实际代码示例,帮助读者理解 TensorFlow 的两种执行模式差异,并掌握在 Eager 模式下进行张量操作和自动微分的基本技能。
TensorFlow 执行模式对比
Eager Execution(即时执行模式)
Eager 模式是 TensorFlow 2.0 的默认执行方式,其特点是:
- 操作立即执行并返回具体值
- 代码直观,易于调试
- 适合快速原型开发
- 减少了样板代码量
启用方式简单,只需在代码开头添加 tf.enable_eager_execution()
即可。
Graph Execution(图执行模式)
图模式是 TensorFlow 1.x 的默认执行方式,特点是:
- 操作构建符号计算图,不立即执行
- 需要在
tf.Session()
上下文中运行 - 代码相对不直观
- 能进行性能优化
- 适合分布式训练和生产环境
基础张量操作
张量创建与加法
import tensorflow as tf
tf.enable_eager_execution()
a = tf.constant([5, 3, 8], dtype=tf.int32)
b = tf.constant([3, -1, 2], dtype=tf.int32)
c = tf.add(a, b) # 显式加法操作
print(c) # 输出张量值、形状和数据类型
运算符重载
TensorFlow 重载了基本运算符,使代码更简洁:
c = a + b # 等价于 tf.add(a,b)
print(c)
NumPy 互操作性
TensorFlow 操作可以接受 Python 原生类型和 NumPy 数组作为输入:
import numpy as np
# 不同类型输入示例
a_py = [1,2] # Python 列表
b_py = [3,4]
a_np = np.array([1,2]) # NumPy 数组
b_np = np.array([3,4])
a_tf = tf.constant([1,2], dtype=tf.int32) # TF 张量
b_tf = tf.constant([3,4], dtype=tf.int32)
# 转换示例
print(a_tf.numpy()) # 将TF张量转为NumPy数组
线性回归实战
数据集准备
我们模拟线性函数 y = 2x + 10:
X = tf.constant([1,2,3,4,5,6,7,8,9,10], dtype=tf.float32)
Y = 2 * X + 10
损失函数实现
使用均方误差(MSE)作为损失函数:
def loss_mse(X, Y, w0, w1):
Y_hat = w0 * X + w1
return tf.reduce_mean((Y_hat - Y)**2)
自动微分
TensorFlow 的自动微分功能简化了梯度计算:
grad_f = tf.contrib.eager.gradients_function(loss_mse, params=[2, 3])
训练循环
完整训练过程示例:
STEPS = 1000
LEARNING_RATE = .02
# 初始化权重
w0 = tf.constant(0.0, dtype=tf.float32)
w1 = tf.constant(0.0, dtype=tf.float32)
for step in range(STEPS):
# 1. 计算梯度
d_w0, d_w1 = grad_f(X, Y, w0, w1)
# 2. 更新权重
w0 = w0 - LEARNING_RATE * d_w0
w1 = w1 - LEARNING_RATE * d_w1
# 3. 定期打印损失
if step % 100 == 0:
print(f"STEP: {step} MSE: {loss_mse(X, Y, w0, w1)}")
# 输出最终结果
print(f"w0: {float(w0):.4f}, w1: {float(w1):.4f}")
进阶:非线性函数拟合
尝试拟合更复杂的非线性函数,如 y = xe^{-x^2}:
X = tf.constant(np.linspace(0,2,1000), dtype=tf.float32)
Y = X * np.exp(-X**2)
# 构建特征
def make_features(X):
features = [X, tf.ones_like(X)] # 线性特征
features.append(X**2) # 添加二次项
features.append(X**3) # 添加三次项
return tf.stack(features, axis=1)
# 训练过程类似线性回归,但使用更多特征
总结
本文介绍了 TensorFlow Eager Execution 模式的核心概念和基本用法,通过线性回归和非线性函数拟合的实例,展示了如何利用 TensorFlow 的自动微分功能实现模型训练。Eager 模式降低了 TensorFlow 的学习门槛,使开发者能够更直观地构建和调试模型。
对于生产环境,当性能成为关键考量时,可以考虑切换到 Graph 模式以获得更好的优化效果。但随着 TensorFlow 2.0 的推出,Eager 模式已成为默认选择,并在性能上做了大量优化,使其在大多数场景下都能满足需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考