赞
踩
在我的系列专栏:深度学习求解PDE 的多数文章中将用到TensoFlow 优化器及其计算图学习框架,那么本篇文章就 将解释 如何在 TensorFlow 中使用 Adam 和 L-BFGS-B 优化器进行优化,并介绍了 TensorFlow 会话的框架。
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 是一种基于准牛顿法的优化算法,适用于大规模无约束或有边界约束的优化问题。
下面这个简单的案例教你使用此优化器:
#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,但提供了许多其他有效的优化算法。
在 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
今天的基础知识就讲到这里!请持续关注~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。