天道酬勤,学无止境

如何在 Keras 中设置自适应学习率(How to Setup Adaptive Learning Rate in Keras)

问题

下面是我的代码:

model = Sequential([
    Dense(32, input_shape=(32,), activation = 'relu'),
    Dense(100, activation='relu'),
    Dense(65, input_shape=(65,), activation='softmax')
])

model.summary()
model.compile(SGD(lr=.1), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_samples, train_labels, batch_size=1000, epochs=1000,shuffle = True, verbose=2)

我将如何设置模型的自适应学习率?

回答1

您不需要像其他答案建议的那样重新编译模型。 Keras带有可用于此任务的callbacks 。 更准确地说,您可以使用LearningRateScheduler回调并向其传递一些函数,该函数将根据当前时期索引调整学习率。

假设您希望您的学习率是 epoch index 的某个倍数(可能不是最好的主意,但易于理解)

def adapt_learning_rate(epoch):
    return 0.001 * epoch

现在我们有了我们的功能,我们可以创建一个学习调度程序,负责计算每个 epoch 开始时的学习率。

my_lr_scheduler = keras.callbacks.LearningRateScheduler(adapt_learning_rate)

最后要做的是将此回调传递给fit方法。

model.fit(X, y, ..., callbacks=[my_lr_scheduler])
回答2

您可以使用解决方法。

对于 range(0, MaxEpoch) 中的 each_iteration:

  1. 指定您自己的学习率函数,该函数输出相对于每个 epoch 的学习率 lr。 然后将 lr 传递给 your_optimiser

  2. 运行 model.compile(...optimizer=your_optimizer...)

  3. 运行 model.fit(...epochs = 1...)

  4. 在 ONE 纪元之后,使用 model.save_weights(...)

  5. 通过 model.load_weights(...) 为下一次迭代加载权重。 有关详细信息,请参见此处 https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

事实上,#4 和#5 可以让你进行迁移学习

回答3

这里需要更换SGD

model.compile(SGD(lr=.1), loss='binary_crossentropy', metrics=['accuracy'])

使用提供的优化器之一,例如 Adam:

model.compile(Adam(lr=.1), loss='binary_crossentropy', metrics=['accuracy'])

阅读此 https://keras.io/optimizers/

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何为GradientDescentOptimizer设置自适应学习率?(How to set adaptive learning rate for GradientDescentOptimizer?)
    问题 我正在使用TensorFlow训练神经网络。 这就是我初始化GradientDescentOptimizer : init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) mse = tf.reduce_mean(tf.square(out - out_)) train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse) 这里的事情是我不知道如何为学习率设置更新规则或为它设置衰减值。 在这里如何使用自适应学习率? 回答1 首先, tf.train.GradientDescentOptimizer设计为对所有步骤中的所有变量使用恒定的学习率。 TensorFlow还提供了开箱即用的自适应优化器,包括tf.train.AdagradOptimizer和tf.train.AdamOptimizer,它们可以用作替代产品。 但是,如果您希望通过原始的梯度下降来控制学习速率,则可以利用以下事实:tf.train.GradientDescentOptimizer构造函数的learning_rate参数可以是Tensor对象。 这使您可以在每个步骤中为学习率计算一个不同的值,例如: learning_rate = tf
  • 如何使用 Keras 中的 Adam 优化器在每个时期打印学习率?(How can I print the Learning Rate at each epoch with Adam optimizer in Keras?)
    问题 因为当您使用自适应优化器时,在线学习不能很好地与.fit()调用.fit()时学习率计划会重置),我想看看是否可以手动设置它。 然而,为了做到这一点,我需要找出最后一个时期的学习率。 也就是说,我如何打印每个时期的学习率? 我想我可以通过回调来做到这一点,但似乎你每次都必须重新计算它,我不知道如何对亚当做到这一点。 我在另一个线程中找到了这个,但它只适用于 SGD: class SGDLearningRateTracker(Callback): def on_epoch_end(self, epoch, logs={}): optimizer = self.model.optimizer lr = K.eval(optimizer.lr * (1. / (1. + optimizer.decay * optimizer.iterations))) print('\nLR: {:.6f}\n'.format(lr)) 回答1 我发现这个问题非常有帮助。 回答您的问题的最小可行示例是: def get_lr_metric(optimizer): def lr(y_true, y_pred): return optimizer.lr return lr optimizer = keras.optimizers.Adam() lr_metric = get_lr_metric
  • 在 Keras 中设置 LearningRateScheduler(Setting up a LearningRateScheduler in Keras)
    问题 我在 Keras 中设置了一个学习率调度器,使用历史损失作为 self.model.optimizer.lr 的更新器,但是 self.model.optimizer.lr 上的值没有被插入到 SGD 优化器中,优化器是使用 dafault 学习率。 代码是: from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD from keras.wrappers.scikit_learn import KerasRegressor from sklearn.preprocessing import StandardScaler class LossHistory(keras.callbacks.Callback): def on_train_begin(self, logs={}): self.losses = [] self.model.optimizer.lr=3 def on_batch_end(self, batch, logs={}): self.losses.append(logs.get('loss')) self.model.optimizer.lr=lr-10000*self
  • 是否可以根据批次标签 (y_true) 分布更新每个批次的学习率?(Is it possible to update the learning rate, each batch, based on batch label (y_true) distribution?)
    问题 编辑:有关解决方案,请参阅此问题的结尾 TL;DR:我需要找到一种方法来计算每批的标签分布,并更新学习率。 有没有办法访问当前模型的优化器来更新每个批次的 learning_rate? 下面是如何计算标签分布。 它可以在损失函数中完成,因为默认情况下损失是分批计算的。 在哪里可以执行这段代码,它也可以访问模型的优化器? def loss(y_true, y_pred): y = math_ops.argmax(y_true, axis=1) freqs = tf.gather(lf, y) # equal to lf[y] if `lf` and `y` were numpy array's inv_freqs = math_ops.pow(freqs, -1) E = 1 / math_ops.reduce_sum(inv_freqs) # value to use when updating learning rate 更多细节 为了实现学习率计划,如本文所述,我相信我需要一种方法来更新每个批次的训练期间的学习率,该值通过从批次中真实标签的标签分布( y_true as它通常用 keras/tensorflow 表示) 在哪里 ... x模型的输出 y相应的真实标签 Β m 个样本的小批量(例如 64 ) n y地面实况标签 y 的整个训练样本大小 n y -1逆标签频率
  • Adam 优化算法详解
    据牛津字典的定义,优化是指最好或最有效地利用一种情况或资源,或者简单地使自己的事物达到最佳状态的行为。 通常,如果可以对某事进行数学建模,则很有可能可以对其进行优化。 这在深度学习领域起着至关重要的作用(可能是整个人工智能),因为您选择的优化算法可能是在数分钟,数小时或数天(有时甚至是数周)内获得高质量结果的区别。 在这篇文章中,我们将阐述: 什么是Adam Optimizer?在深度学习模型中使用Adam进行优化有什么好处?Adam如何工作? 什么是Adam Optimizer? Adam Optimizer是对SGD的扩展,可以代替经典的随机梯度下降法来更有效地更新网络权重。 请注意,Adam这个名字并不是首字母缩写词,实际上,作者(OpenAI的Diederik P. Kingma和多伦多大学的Jimmy Lei Ba)在论文中指出,该论文首次在ICLR 2015上作为会议论文发表,标题为Adam: A method for Stochastic Optimization, that the name is derived from adaptive moment estimation.。 作者毫不犹豫地列出了将Adam应用于非凸优化问题的许多迷人好处,我将继续分享以下内容: 简单地实现(我们将在本文的稍后部分中实现Adam
  • 复习1: 深度学习优化算法 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 详细解释 + 如何选择优化算法
    深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程。优化器其实就是采用何种方式对损失函数进行迭代优化,也就是有一个卷积参数我们初始化了,之后loss还很大,我们让这个参数根据loss的梯度如何变,每次变多少可以让loss函数在凸曲面上不断变小而找到最优解? 目录 梯度下降相关(GD-miniGD-SGD-SGDM-NAG) Gradient Descent 梯度下降 mini-batch Gradient Descent 小批量梯度下降 Stochastic Gradient Descent 随机梯度下降 (SGD) Stochastic Gradient Descent Momentum 带动量的梯度下降法(SGDM) Nesterov Gradient Descent 带牛顿动量的梯度下降法 (NAG) Adam相关(AdaGrad -AdaDelta -RMSProp-Adam -Nadam) Adaptive Gradient Descent (AdaGrad) AdaDelta RMSprop 加速梯度下降 Adaptive Moment Estimation (Adam) Nadam=Nesterov + Adam 二阶近似的优化算法 总结 总结 Adam那么棒
  • Keras:如何将学习率输出到张量板上(Keras: how to output learning rate onto tensorboard)
    问题 我添加了一个回调来衰减学习率: keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=100, verbose=0, mode='auto',epsilon=0.00002, cooldown=20, min_lr=0) 这是我的张量板回调: keras.callbacks.TensorBoard(log_dir='./graph/rank{}'.format(hvd.rank()), histogram_freq=10, batch_size=FLAGS.batch_size, write_graph=True, write_grads=True, write_images=False) 我想确保它在我的训练期间已经启动,所以我想将学习率输出到 tensoraord。但是我找不到可以设置它的地方。 我还检查了优化器 a​​pi,但没有运气。 keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) 那么如何将学习率输出到 tensorload 呢? 回答1 根据TensorBoard的作者
  • (SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)深度学习优化方法介绍总结
    1.SGD SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即: 其中,是学习率,是梯度 SGD完全依赖于当前batch的梯度,所以 可理解为允许当前batch的梯度多大程度影响参数更新 缺点:(正因为有这些缺点才让这么多大神发展出了后续的各种算法) 选择合适的learning rate比较困难 - 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了 SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点【原来写的是“容易困于鞍点”,经查阅论文发现,其实在合适的初始化和step size的情况下,鞍点的影响并没这么大。】 2.Momentum momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下: 其中,是动量因子 特点: 下降初期时,使用上一次参数更新,下降方向一致,乘上较大的能够进行很好的加速 下降中后期时,在局部最小值来回震荡的时候,, 使得更新幅度增大,跳出陷阱 在梯度改变方向的时候,能够减少更新 总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛 3.Nesterov nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏º
  • tensorflow 2.0 自定义训练循环的学习率(Learning rate of custom training loop for tensorflow 2.0)
    问题 当我使用 tensorflow 2.0 自定义训练循环时,是否有任何函数或方法可以显示学习率? 这是张量流指南的示例: def train_step(images, labels): with tf.GradientTape() as tape: predictions = model(images) loss = loss_object(labels, predictions) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) train_loss(loss) train_accuracy(labels, predictions) 模型训练时如何从优化器中检索当前学习率? 如果您能提供任何帮助,我将不胜感激。 :) 回答1 在 Tensorflow 2.1 中,Optimizer 类有一个未_decayed_lr方法_decayed_lr (请参阅此处的定义),您可以通过提供要转换为的变量类型在训练循环中调用该方法: current_learning_rate = optimizer._decayed_lr(tf.float32) 这里还有一个更完整的
  • 机器学习——梯度下降法&优化器
    目录 梯度下降方法:SGD,Momentum,AdaGrad,RMSProp,Adam 概述 批量梯度下降法(Batch gradient descent) 随机梯度下降法(Stochastic gradient descent) 小批量梯度下降 在线学习 映射化简和数据并行 冲量梯度下降,Momentum: 其他三种经典的梯度下降方法 梯度下降方法:SGD,Momentum,AdaGrad,RMSProp,Adam 参考链接:https://blog.csdn.net/u010089444/article/details/76725843(最重要的链接)、https://zhuanlan.zhihu.com/p/147275344 深度学习入门的神视频:为什么随机梯度下降方法能够收敛? - YJango的回答 - 知乎 https://www.zhihu.com/question/27012077/answer/501362912 梯度的方向就是损失函数之变化最快的方向。 线性回归的梯度下降的例子:https://www.jianshu.com/p/c7e642877b0e 概述 梯度下降算法(Gradient Descent Optimization)是神经网络模型训练最常用的优化算法。对于深度学习模型,基本都是采用梯度下降算法来进行优化训练的。梯度下降算法背后的原理:目标函数
  • 从tf.train.AdamOptimizer获取当前学习率(Getting the current learning rate from a tf.train.AdamOptimizer)
    问题 我想打印出nn的每个训练步骤的学习率。 我知道亚当具有自适应学习率,但是有没有办法我可以看到这一点(用于张量板中的可视化) 回答1 所有优化器都有一个私有变量,用于保存学习率的值。 在adagrad和梯度下降中,它称为self._learning_rate 。 在亚当,它是self._lr 。 因此,您只需要打印sess.run(optimizer._lr)即可获得该值。 需要Sess.run,因为它们是张量。 回答2 Sung Kim的建议对我有用,我的确切步骤是: lr = 0.1 step_rate = 1000 decay = 0.95 global_step = tf.Variable(0, trainable=False) increment_global_step = tf.assign(global_step, global_step + 1) learning_rate = tf.train.exponential_decay(lr, global_step, step_rate, decay, staircase=True) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, epsilon=0.01) trainer = optimizer.minimize(loss
  • 优化器optimizer
    手动指定学习率:SGD,Momentum,Nesterov Momentum, 自动调节学习率:AdaGrad,RMSProp,Adam 梯度下降法变体: 批量梯度下降 BGD------batch gradient descent随机梯度下降法 SGD------stochastic gradient descent小批量梯度下降法 BMGD------mini-batch gradient descent 常用的梯度下降法: MomentumNesterovAdagradAdaDeltaRMSpropAdam 梯度下降法是训练神经网络最常用的优化算法。 梯度下降法是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。 1、BGD------batch gradient descent: 即batch gradient descent. 在训练中,每一步迭代都使用训练集的所有内容. 也就是说,利用现有参数对训练集中的每一个输入生成一个估计输出,然后跟实际输出比较,统计所有误差,求平均以后得到平均误差,以此来作为更新参数的依据. 具体实现: 需要:学习速率 , 初始参数 每步迭代过程: 1. 提取训练集中的所有内容,以及相关的输出 2. 计算梯度和误差并更新参数: 优点
  • 优化器(AdaGrad,AdaDelta,RmsProp,Adam,Nadam,Nesterovs,Sgd,momentum)
    以下来自: https://my.oschina.net/u/2935389/blog/2967242 https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw 另外的一篇关于优化器的文章是(pytorch的十个优化器): https://blog.csdn.net/tototuzuoquan/article/details/113779970 1.5.1.1.AdaGrad(自适应学习率算法) 1.5.1.2.AdaDelta 1.5.1.3.RmsProp 1.5.1.4.Adam 1.5.1.5.AdaMax 1.5.1.6.Nadam 1.5.1.7.AMSGrad 1.5.1.8.Nesterovs(动量的随机梯度下降法) 1.5.1.9.Sgd 1.5.1.10.momentum 1.5.1.11.经验之谈 1.5.1.12.引用 1.5.1.优化器 以下来自: https://my.oschina.net/u/2935389/blog/2967242 https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw 1.5.1.1.AdaGrad(自适应学习率算法) Adagrad其实是对学习率进行了一个约束。即: 再如https://mp.weixin.qq.com/s
  • PyTorch学习之 torch.optim 的6种优化器及优化算法介绍
    内容转自Line_Walker的文章,链接https://blog.csdn.net/qq_36589234/article/details/89330342 记录到自己博客中,以便温故知新 这6种方法分为2大类:一大类方法是SGD及其改进(加Momentum);另外一大类是Per-parameter adaptive learning rate methods(逐参数适应学习率方法),包括AdaGrad、RMSProp、Adam等 1.1 SGD(stochastic gradient descent) 当训练数据N很大时,计算总的cost function来求梯度代价很大,所以一个常用的方法是计算训练集中的小批量(minibatches),这就是SGD。 minibatch的大小是一个超参数,通常使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是2的倍数,那么运算更快。 SGD的缺点: (1)Very slow progress along shallow dimension, jitter along steep direction (2)到local minima 或者 saddle point会导致gradient为0,无法移动。而事实上,saddle point 问题在高维问题中会更加常见。 PyTorch中的SGD: torch.optim.SGD
  • 深度学习——优化器算法Optimizer详解
    深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam) 在机器学习、深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点为了应对这个不足而提出的下一个算法超参数的一般设定值几种算法的效果比较选择哪种算法 0.梯度下降法深入理解 以下为个人总结,如有错误之处,各位前辈请指出。 对于优化算法,优化的目标是网络模型中的参数θ(是一个集合,θ1、θ2、θ3 ......)目标函数为损失函数L = 1/N ∑ Li (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,目标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。那么为何在mini-batch中如果遇到鞍点/局部最小值点就无法进行优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带入训练集全集,导数为零。对于SGD/MBGD而¨
  • How to Setup Adaptive Learning Rate in Keras
    Below is my code: model = Sequential([ Dense(32, input_shape=(32,), activation = 'relu'), Dense(100, activation='relu'), Dense(65, input_shape=(65,), activation='softmax') ]) model.summary() model.compile(SGD(lr=.1), loss='binary_crossentropy', metrics=['accuracy']) model.fit(train_samples, train_labels, batch_size=1000, epochs=1000,shuffle = True, verbose=2) How will I set an adaptive learning rate of my model?
  • 李宏毅——一天搞懂深度学习PPT学习笔记
    李宏毅一天搞懂机器学习PPT,SildeShare链接:https://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3 也可以在csdn下载中下载(资源附学习笔记全文):https://download.csdn.net/download/wozaipermanent/11998637 1 Introduction of Deep Learning 1.1 Three Steps for Deep Learning Step1: define a set of function (Neural Network)Step2: goodness of functionStep3: pick the best function 1.2 Step1: Neural Network 1.2.1 Fully Connect Feedforward Network 1.2.2 Output Layer(Option) Softmax(归一化指数函数):它能将一个含任意实数的k维向量Z“压缩”到另一个k维向量 σ ( Z ) \sigma(Z) σ(Z)中,使得每一个元素的范围都在(0, 1)之间,并且所有元素的和为1。 1.2.3
  • 机器学习_李宏毅笔记简记3
    文章目录 P9 Tips for Deep Learning神经网络的表现(只有在training data上表现好,testing data上表现不好才叫overfitting,在training data上表现好再考虑下一步testing data,分别有不同的处理办法)For training data1. New activation function(新的激活函数)Vanishing Gradient Problem(梯度消失)产生原因:(前面变化慢,后面变化快,前面还是随机的时候后面已经收敛了)利用sigmod激活函数举例:(每通过一次sigmod,衰减就会变小,对后面几乎无影响了) 解决办法:改用新的激活函数ReLU终极解决办法:让network自动学习激活函数:Maxout 2.Adaptive Learning Rate(自适应学习率)AdagradRMSProp(给一个概率α,倾向于相信以前的运动轨迹还是现在的)Adam(RMSProp + Momentum )Momentum For testing data(前提是你已经在training data已经得到了很好的结果了)1. Early Stopping2. RegularizationL2 regularization(成比例下降)L1 regularization: (减去一个固定值) 3
  • 【tensorflow2.0】4.keras模型训练
    本文摘要:model.compile() 、model.fit() 一个完整的神经网络可以分为六部分: 1.import:导入需要的包; 2.data:导入训练所用数据集(训练集、验证集、测试集); 3.model:搭建网络(上节课内容); 4.model.compile:选择损失函数、优化器、评估函数; 5.model.fit:模型训练; 6.model.summary:查看网络结构和参数个数 首先是model.compile(): model.compile()中有三个很重要的参数:损失函数、优化器、评估函数,下面给出常用的参数函数、对应的代码以及适用范围(涉及到的算法公式未给出,大家有兴趣可以自行百度): ''' 1.损失函数 1.1 均方误差(Mean Square Error)是回归问题最常用的损失函数。回归问题解决的是对具体数值的 预测,比如房价预测、销量预测等。这些问题需要预测的不是一个事先定义好的类别,而是一个任意实 数 ''' tf.keras.losses.MeanSquaredError() ''' 1.2 交叉熵损失函数(CrossEntropy Loss)是分类中最常用的损失函数。分类问题解决的是对输出结果的 分类,比如鸢尾花识别、minst数字识别等。这些问题需要预测的是一个事先定义好的类别。 ''' tf.keras.losses.binary
  • 如何在PyTorch 中设定学习率衰减(learning rate decay)?
    很多时候我们要对学习率(learning rate)进行衰减,下面的代码示范了如何每30个epoch按10%的速率衰减: def adjust_learning_rate(optimizer, epoch): """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" lr = args.lr * (0.1 ** (epoch // 30)) for param_group in optimizer.param_groups: param_group['lr'] = lr 什么是param_groups? optimizer通过param_group来管理参数组,.param_group中保存了参数组及其对应的学习率,动量等等.所以我们可以通过更改param_group['lr']的值来更改对应参数组的学习率。 # 有两个`param_group`即,len(optim.param_groups)==2 optim.SGD([ {'params': model.base.parameters()}, {'params': model.classifier.parameters(), 'lr': 1e-3} ], lr=1e-2, momentum=0.9) #一个参数组 optim.SGD