I load model via keras.models.load_model
that was saved via model.save
Then I'm trying to print optimizer state:
from keras import backend as K
tf_session = K.get_session()
print(model.optimizer.iterations.eval(session=tf_session))
print(model.optimizer.lr.eval(session=tf_session))
Which prints:
<tf.Variable 'Adadelta/iterations:0' shape=() dtype=int64_ref>
<tf.Variable 'Adadelta/lr:0' shape=() dtype=float32_ref>
0
1.0
Or onother way to obtain optimizer parameters:
print(model.optimizer.get_config())
{'lr': 1.0, 'rho': 0.95, 'decay': 0.0, 'epsilon': 1e-07}
So my question is does keras reset optimizer state on model load?
According to this https://github.com/keras-team/keras/blob/master/keras/engine/saving.py#L473 it should save model's optimizer's state.
And here is an actual code that save optimizer state: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/engine/saving.py#L132
Optimizer config: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/engine/saving.py#L146
Optimizer weights: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/engine/saving.py#L157
UPDATE:
What does model.optimizer.weights
contain?
keras.__version__ 2.1.6
print('len(model.get_weights())', len(model.get_weights()))
w1 = model.get_weights()[0]
print('type(w1)', type(w1))
print('w1.shape', w1.shape)
len(model.get_weights()) 86
type(w1) <class 'numpy.ndarray'>
w1.shape (3, 3, 3, 16)
print('len(model.optimizer.get_weights())', len(model.optimizer.get_weights()))
w2 = model.optimizer.get_weights()[0]
print('type(w2)', type(w2))
print('w2.shape', w2.shape)
len(model.optimizer.get_weights()) 116
type(w2) <class 'numpy.ndarray'>
w2.shape (3, 3, 3, 16)
print('max abs diff w1-w2', np.max(np.abs(w1-w2)))
max abs diff w1-w2 0.8932746