TensorFlow 优化器以及会话使用指南
在我的系列专栏:深度学习求解PDE 的多数文章中将用到TensoFlow 优化器及其计算图学习框架,那么本篇文章就 将解释 如何在 TensorFlow 中使用 Adam 和 L-BFGS-B 优化器进行优化,并介绍了 TensorFlow 会话的框架。
优化器简介
Adam 优化器
Adam 优化器是深度学习中常用的一种优化算法,结合了动量法和 RMSProp 的优点。
案例 :使用tf.train.AdamOptimizer 优化线性模型
假设我们有一个简单的线性模型 y=wx+b,其中 w 是权重,b 是偏置,我们希望通过训练来找到最优的 w 和 b,使得模型能够较好地拟合一组给定的数据点。读者可以从这个简单的案例学会此优化器使用方法.
python
#test1
# 步骤 1: 导入必要的库
import tensorflow as tf
import numpy as np
# 步骤 2: 创建数据
#为了简单起见,我们手动创建一些线性数据并添加一些噪声。
# 生成数据
np.random.seed(0)
x_data = np.linspace(-1, 1, 100)[:, np.newaxis] # 100个数据点,形状为[100, 1]
noise = np.random.randn(*x_data.shape) * 0.1 # 添加噪声
y_data = 2 * x_data + 1 + noise # 真实模型为 y = 2x + 1
#步骤 3: 定义模型
# TensorFlow 1.x 风格
x = tf.placeholder(tf.float32, shape=[None, 1])
y = tf.placeholder(tf.float32, shape=[None, 1])
# 定义模型参数
W = tf.Variable(tf.random_normal([1, 1]), name='weight')
b = tf.Variable(tf.zeros([1]), name='bias')
# 定义模型
y_pred = tf.matmul(x, W) + b
#步骤 4: 定义损失函数和优化器
# 定义损失函数
loss = tf.reduce_mean(tf.square(y_pred - y)) # MSE损失
# 定义优化器
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train = optimizer.minimize(loss)
#步骤 5: 训练模型
# 初始化变量
init = tf.global_variables_initializer()
# 启动会话
with tf.Session() as sess:
sess.run(init)
# 训练模型
for epoch in range(1000):
sess.run(train, feed_dict={x: x_data, y: y_data})
if epoch % 100 == 0:
print(f'Epoch {epoch}, Loss: {loss.eval(feed_dict={x: x_data, y: y_data})}')
# 获取训练后的参数
w_value, b_value = sess.run([W, b])
print(f'Trained w: {w_value}, b: {b_value}')
运行结果:
可见拟合效果还是不错的!
注意:从TensorFlow 2.x开始,推荐使用tf.keras.optimizers.Adam而不是tf.train.AdamOptimizer,因为TensorFlow 2.x更强调使用Keras API。
L-BFGS-B
L-BFGS-B 是一种基于准牛顿法的优化算法,适用于大规模无约束或有边界约束的优化问题。
下面这个简单的案例教你使用此优化器:
python
#test2
import tensorflow as tf
import numpy as np
# 定义TensorFlow图
with tf.Graph().as_default():
# 定义变量
x = tf.Variable(0.0, name='x')
# 定义损失函数
loss = (x - 3.0) ** 2 + 2
# 初始化变量
init = tf.global_variables_initializer()
# 创建ScipyOptimizerInterface
train_lbfgs = tf.contrib.opt.ScipyOptimizerInterface(
loss,
var_list=[x],
method="L-BFGS-B",
options={'maxiter': 10000, 'ftol': 1.0 * np.finfo(float).eps}
)
# 启动会话
with tf.Session() as sess:
sess.run(init)
# 运行优化
train_lbfgs.minimize(sess)
# 获取优化后的变量值
optimized_x = x.eval(sess)
print("Optimized x:", optimized_x)
运行结果:
python
INFO:tensorflow:Optimization terminated with:
Message: CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL
Objective function value: 2.000000
Number of iterations: 2
Number of functions evaluations: 3
Optimized x: 3.0
快狠准!
请注意,由于tf.contrib在TensorFlow 2.x中不再可用,如果你正在使用TensorFlow 2.x,并且需要类似的功能, 可能需要考虑使用TensorFlow的tf.keras.optimizers中的优化器,这些优化器虽然不包括L-BFGS-B,但提供了许多其他有效的优化算法。
会话(Session)
在 TensorFlow 中,会话 (Session) 是运行计算图的环境。它负责分配资源(如变量)并执行操作。下面笔者给个例子,帮助读者理解使用 session 在 TF学习框架中的作用:
python
import tensorflow as tf
import numpy as np
# 定义占位符和变量
x = tf.placeholder(tf.float32, shape=[None, 1])
y = tf.placeholder(tf.float32, shape=[None, 1])
# 构建神经网络
layer = tf.layers.dense(x, 10, activation=tf.nn.relu)
output = tf.layers.dense(layer, 1)
# 定义损失函数
loss = tf.reduce_mean(tf.square(output - y))
# 定义优化器
train_adam = tf.train.AdamOptimizer(0.0008).minimize(loss)
train_lbfgs = tf.contrib.opt.ScipyOptimizerInterface(
loss,
method="L-BFGS-B",
options={'maxiter': 10000, 'ftol': 1.0 * np.finfo(float).eps}
)
# 初始化变量
init = tf.global_variables_initializer()
# 创建会话并运行
with tf.Session() as sess:
sess.run(init)
# 使用 Adam 优化器进行训练
for _ in range(1000):
sess.run(train_adam, feed_dict={x: np.random.rand(10, 1), y: np.random.rand(10, 1)})
# 使用 L-BFGS-B 优化器进行训练
train_lbfgs.minimize(sess, feed_dict={x: np.random.rand(10, 1), y: np.random.rand(10, 1)})
# 打印损失值
print("Final loss:", sess.run(loss, feed_dict={x: np.random.rand(10, 1), y: np.random.rand(10, 1)}))
运行结果:
python
INFO:tensorflow:Optimization terminated with:
Message: CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL
Objective function value: 0.080921
Number of iterations: 7
Number of functions evaluations: 10
Final loss: 0.048916824
- Session确保了TensorFlow计算图的正确执行,是获取正确计算结果的关键步骤。没有Session,计算图只是定义在前端系统中的静态结构,无法转化为实际的计算任务。
- 优化资源利用:
通过Session的资源分配和管理功能,TensorFlow能够更高效地利用硬件资源,提高计算效率。这对于大规模的计算任务尤为重要。 - 支持复杂计算任务:
在处理复杂的计算任务时,如深度学习模型的训练,Session提供了必要的控制手段,使得用户能够更精细地管理计算过程,包括指定计算设备、控制资源使用等。
今天的基础知识就讲到这里!请持续关注~