2017-01-22 20 views
3

例えば、Kerasの実装Adagradがされています:AdagradはどのようにKerasに侵入しましたか? Keras Optimizerでself.weightsの意味は何ですか?

class Adagrad(Optimizer): 
"""Adagrad optimizer. 
It is recommended to leave the parameters of this optimizer 
at their default values. 
# Arguments 
    lr: float >= 0. Learning rate. 
    epsilon: float >= 0. 
    decay: float >= 0. Learning rate decay over each update. 
# References 
    - [Adaptive Subgradient Methods for Online Learning and Stochastic Optimization](http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf) 
""" 

def __init__(self, lr=0.01, epsilon=1e-8, decay=0., **kwargs): 
    super(Adagrad, self).__init__(**kwargs) 
    self.lr = K.variable(lr) 
    self.epsilon = epsilon 
    self.decay = K.variable(decay) 
    self.initial_decay = decay 
    self.iterations = K.variable(0.) 

def get_updates(self, params, constraints, loss): 
    grads = self.get_gradients(loss, params) 
    shapes = [K.get_variable_shape(p) for p in params] 
    accumulators = [K.zeros(shape) for shape in shapes] 
    self.weights = accumulators 
    self.updates = [] 

    lr = self.lr 
    if self.initial_decay > 0: 
     lr *= (1./(1. + self.decay * self.iterations)) 
     self.updates.append(K.update_add(self.iterations, 1)) 

    for p, g, a in zip(params, grads, accumulators): 
     new_a = a + K.square(g) # update accumulator 
     self.updates.append(K.update(a, new_a)) 
     new_p = p - lr * g/(K.sqrt(new_a) + self.epsilon) 
     # apply constraints 
     if p in constraints: 
      c = constraints[p] 
      new_p = c(new_p) 
     self.updates.append(K.update(p, new_p)) 
    return self.updates 

と機能 'get_update()' 1回の段階の更新がそうです。しかし、アキュムレータは履歴情報を保存する必要がありますか?なぜ各ステップでゼロに初期化されたのですか?どのように全体のトレーニングプロセスを通じてアキュムレータになることができますか?

この行は何をしますか?

self.weights = accumulators 

これはもう見られません。

答えて

2

Kerasのすべてのオプティマイザで正しいです。get_updates()は、テンソルロジックを1段階の更新に実装しています。この関数はmodel.fit()からそれぞれ_make_train_function()hereで1回呼び出され、更新ルールをupdate=hereとして渡してテンソル関数を作成します。この更新ルールは、モデルパラメータや他のパラメータを更新する反復処理に使用されます。

self.weightsは、内部パラメータです。これはトレーニングには使用されません。私は理解してそれはちょうどオプティマイザ(パラメータ/アキュムレータテンソルへのポインタのリスト)の状態を維持するために機能し、model.saveが呼び出されたとき、彼らはまた、get_weights()hereを呼び出すことによって保存され、model.loadset_weights()here

+1

によって呼び出されたときにバックロードされ、 。どうもありがとうございました。 – Chris

関連する問題