Python 机器学习求解 PDE 学习项目 基础知识(2)TensorFlow 优化器使用

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提供了必要的控制手段,使得用户能够更精细地管理计算过程,包括指定计算设备、控制资源使用等。

今天的基础知识就讲到这里!请持续关注~

相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar10 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805110 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_10 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机17 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i18 小时前
drf初步梳理
python·django
每日AI新事件18 小时前
python的异步函数
python