• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

如何在keras中添加自己的优化器(如adam等)

python 搞代码 4年前 (2022-01-09) 22次浏览 已收录 0个评论

本文主要讨论windows下基于tensorflow的keras

1、找到tensorflow的根目录

如果安装时使用anaconda且使用默认安装路径,则在 C:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages\tensorflow处可以找到(此处为GPU版本),cpu版本可在C:\ProgramData\Anaconda3\Lib\site-packages\tensorflow处找到。若并非使用默认安装路径,可参照根目录查看找到。

2、找到keras在tensorflow下的根目录

需要特别注意的是找到keras在tensorflow下的根目录而不是找到keras的根目录。一般来说,完成tensorflo来2源gaodaima#com搞(代@码&网w以及keras的配置后即可在tensorflow目录下的python目录中找到keras目录,以GPU为例keras在tensorflow下的根目录为C:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages\tensorflow\python\keras

3、找到keras目录下的optimizers.py文件并添加自己的优化器

找到optimizers.py中的adam等优化器类并在后面添加自己的优化器类

以本文来说,我在第718行添加如下代码

@tf_export('keras.optimizers.adamsss')
class Adamsss(Optimizer):

 def __init__(self,
    lr=0.002,
    beta_1=0.9,
    beta_2=0.999,
    epsilon=None,
    schedule_decay=0.004,
    **kwargs):
 super(Adamsss, self).__init__(**kwargs)
 with K.name_scope(self.__class__.__name__):
  self.iterations = K.variable(0, dtype='int64', name='iterations')
  self.m_schedule = K.variable(1., name='m_schedule')
  self.lr = K.variable(lr, name='lr')
  self.beta_1 = K.variable(beta_1, name='beta_1')
  self.beta_2 = K.variable(beta_2, name='beta_2')
 if epsilon is None:
  epsilon = K.epsilon()
 self.epsilon = epsilon
 self.schedule_decay = schedule_decay

 def get_updates(self, loss, params):
 grads = self.get_gradients(loss, params)
 self.updates = [state_ops.assign_add(self.iterations, 1)]

 t = math_ops.cast(self.iterations, K.floatx()) + 1

 # Due to the recommendations in [2], i.e. warming momentum schedule
 momentum_cache_t = self.beta_1 * (
  1. - 0.5 *
  (math_ops.pow(K.cast_to_floatx(0.96), t * self.schedule_decay)))
 momentum_cache_t_1 = self.beta_1 * (
  1. - 0.5 *
  (math_ops.pow(K.cast_to_floatx(0.96), (t + 1) * self.schedule_decay)))
 m_schedule_new = self.m_schedule * momentum_cache_t
 m_schedule_next = self.m_schedule * momentum_cache_t * momentum_cache_t_1
 self.updates.append((self.m_schedule, m_schedule_new))

 shapes = [K.int_shape(p) for p in params]
 ms = [K.zeros(shape) for shape in shapes]
 vs = [K.zeros(shape) for shape in shapes]

 self.weights = [self.iterations] + ms + vs

 for p, g, m, v in zip(params, grads, ms, vs):
  # the following equations given in [1]
  g_prime = g / (1. - m_schedule_new)
  m_t = self.beta_1 * m + (1. - self.beta_1) * g
  m_t_prime = m_t / (1. - m_schedule_next)
  v_t = self.beta_2 * v + (1. - self.beta_2) * math_ops.square(g)
  v_t_prime = v_t / (1. - math_ops.pow(self.beta_2, t))
  m_t_bar = (
   1. - momentum_cache_t) * g_prime + momentum_cache_t_1 * m_t_prime

  self.updates.append(state_ops.assign(m, m_t))
  self.updates.append(state_ops.assign(v, v_t))

  p_t = p - self.lr * m_t_bar / (K.sqrt(v_t_prime) + self.epsilon)
  new_p = p_t

  # Apply constraints.
  if getattr(p, 'constraint', None) is not None:
  new_p = p.constraint(new_p)

  self.updates.append(state_ops.assign(p, new_p))
 return self.updates

 def get_config(self):
 config = {
  'lr': float(K.get_value(self.lr)),
  'beta_1': float(K.get_value(self.beta_1)),
  'beta_2': float(K.get_value(self.beta_2)),
  'epsilon': self.epsilon,
  'schedule_decay': self.schedule_decay
 }
 base_config = super(Adamsss, self).get_config()
 return dict(list(base_config.items()) + list(config.items()))

然后修改之后的优化器调用类添加我自己的优化器adamss


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何在keras中添加自己的优化器(如adam等)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址