首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在训练中改变learning_rate --流动优化器

不能在训练中改变learning_rate --流动优化器
EN

Stack Overflow用户
提问于 2021-01-04 14:24:42
回答 1查看 69关注 0票数 0

有人能解释我为什么在训练中不能改变learningrate吗?在老的优化器中,我可以用self.updates.append(K.update(self.learning_rate, new_learning_rate))来改变它,但是不能再做了,self._set_hyper("learning_rate", new_learning_rate)不能工作了,它告诉我:TypeError:__array__() takes 1 positional argument but 2 were given

代码语言:javascript
复制
class SGD(keras.optimizers.Optimizer):
    def __init__(self, learning_rate=0.01, name="SGD", **kwargs):
        """Call super().__init__() and use _set_hyper() to store hyperparameters"""
        super().__init__(name, **kwargs)
        self._set_hyper("learning_rate", kwargs.get("lr", learning_rate)) # handle lr=learning_rate
        
    @tf.function
    def _resource_apply_dense(self, grad, var):
        learning_rate = self._get_hyper("learning_rate")
        new_learning_rate = learning_rate * 0.001
        new_var_m = var - grad * new_learning_rate
        self._set_hyper("learning_rate", new_learning_rate) #dont work
        var.assign(new_var)

    def _resource_apply_sparse(self, grad, var):
        raise NotImplementedError

    def get_config(self):
        base_config = super().get_config()
        return {
            **base_config,
            "learning_rate": self._serialize_hyperparameter("learning_rate"),
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 15:04:29

作为一种解决方法,您可以使用_set_hyper直接访问属性集,如文档中提到的那样:

可以通过用户代码覆盖超级参数

由于它是一个tf.Variable,因此可以使用assign来使用tf.Tensor设置一个新值:

代码语言:javascript
复制
class SGD(keras.optimizers.Optimizer):
    def __init__(self, learning_rate=0.01, name="SGD", **kwargs):
        """Call super().__init__() and use _set_hyper() to store hyperparameters"""
        super().__init__(name, **kwargs)
        self._set_hyper("learning_rate", kwargs.get("lr", learning_rate)) # handle lr=learning_rate
        
    @tf.function
    def _resource_apply_dense(self, grad, var):
        learning_rate = self._get_hyper("learning_rate")
        new_learning_rate = learning_rate * 0.001
        new_var_m = var - grad * new_learning_rate
        self.learning_rate.assign(new_learning_rate)
        var.assign(new_var_m)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65564295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档