自学内容网 自学内容网

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,使得模型能够较好地拟合一组给定的数据点。读者可以从这个简单的案例学会此优化器使用方法.

#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 是一种基于准牛顿法的优化算法,适用于大规模无约束或有边界约束的优化问题。
下面这个简单的案例教你使用此优化器:

#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)
        

运行结果:

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学习框架中的作用:

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)}))

运行结果:

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

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


原文地址:https://blog.csdn.net/qq_39538718/article/details/140646776

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!