In [5]:
from clr_callback import *
from keras.optimizers import *
In [10]:
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Input
In [11]:
inp = Input(shape=(15,))
x = Dense(10, activation='relu')(inp)
x = Dense(1, activation='sigmoid')(x)
model = Model(inp, x)
In [12]:
X = np.random.rand(2000000,15)
In [13]:
Y = np.random.randint(0,2,size=2000000)
In [39]:
%matplotlib inline
import matplotlib.pyplot as plt
The following tests callback functionality for each default Keras optimizer.
Tests demonstrate expected cyclical behavior, as well as functionality of resetting the cycles and/or adjusting boundary values.
In [32]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=SGD(0.1), loss='binary_crossentropy', metrics=['accuracy'])
In [33]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[33]:
In [42]:
plt.xlabel('Training Iterations')
plt.ylabel('Learning Rate')
plt.title("CLR - 'triangular' Policy")
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[42]:
In [45]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=SGD(), loss='binary_crossentropy', metrics=['accuracy'])
In [46]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[46]:
In [47]:
clr_triangular._reset()
In [48]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[48]:
In [49]:
plt.xlabel('Training Iterations')
plt.ylabel('Learning Rate')
plt.title("'triangular2' Policy Reset at 20000 Iterations")
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[49]:
In [25]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=SGD(), loss='binary_crossentropy', metrics=['accuracy'])
In [26]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[26]:
In [27]:
plt.xlabel('Training Iterations')
plt.ylabel('Learning Rate')
plt.title("CLR - 'exp_range' Policy")
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[27]:
In [22]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [23]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[23]:
In [24]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[24]:
In [28]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [29]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=SGD(), loss='binary_crossentropy', metrics=['accuracy'])
In [30]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[30]:
In [31]:
plt.xlabel('Training Iterations')
plt.ylabel('Learning Rate')
plt.title("CLR - Custom Sinusoidal Cycle-Policy")
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[31]:
In [50]:
clr = lambda x: 1/(5**(x*0.0001))
In [51]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=SGD(), loss='binary_crossentropy', metrics=['accuracy'])
In [52]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[52]:
In [53]:
plt.xlabel('Training Iterations')
plt.ylabel('Learning Rate')
plt.title("CLR - Custom Iteration-Policy")
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[53]:
In [112]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['accuracy'])
In [113]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[113]:
In [115]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[115]:
In [116]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['accuracy'])
In [117]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[117]:
In [118]:
clr_triangular._reset()
In [119]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[119]:
In [120]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[120]:
In [121]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['accuracy'])
In [122]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[122]:
In [123]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[123]:
In [124]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [125]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[125]:
In [126]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[126]:
In [127]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [128]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['accuracy'])
In [129]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[129]:
In [130]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[130]:
In [131]:
clr = lambda x: 1/(5**(x*0.0001))
In [132]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['accuracy'])
In [133]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[133]:
In [134]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[134]:
In [135]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=Adagrad(), loss='binary_crossentropy', metrics=['accuracy'])
In [136]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[136]:
In [138]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[138]:
In [139]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=Adagrad(), loss='binary_crossentropy', metrics=['accuracy'])
In [140]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[140]:
In [141]:
clr_triangular._reset()
In [142]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[142]:
In [143]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[143]:
In [144]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=Adagrad(), loss='binary_crossentropy', metrics=['accuracy'])
In [145]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[145]:
In [146]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[146]:
In [147]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [148]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[148]:
In [149]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[149]:
In [150]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [151]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=Adagrad(), loss='binary_crossentropy', metrics=['accuracy'])
In [152]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[152]:
In [153]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[153]:
In [154]:
clr = lambda x: 1/(5**(x*0.0001))
In [155]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=Adagrad(), loss='binary_crossentropy', metrics=['accuracy'])
In [156]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[156]:
In [157]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[157]:
In [158]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=Adadelta(), loss='binary_crossentropy', metrics=['accuracy'])
In [159]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[159]:
In [161]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[161]:
In [162]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=Adadelta(), loss='binary_crossentropy', metrics=['accuracy'])
In [163]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[163]:
In [164]:
clr_triangular._reset()
In [165]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[165]:
In [166]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[166]:
In [167]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=Adadelta(), loss='binary_crossentropy', metrics=['accuracy'])
In [168]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[168]:
In [169]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[169]:
In [170]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [171]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[171]:
In [172]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[172]:
In [173]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [174]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=Adadelta(), loss='binary_crossentropy', metrics=['accuracy'])
In [175]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[175]:
In [176]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[176]:
In [177]:
clr = lambda x: 1/(5**(x*0.0001))
In [178]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=Adadelta(), loss='binary_crossentropy', metrics=['accuracy'])
In [179]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[179]:
In [180]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[180]:
In [181]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
In [182]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[182]:
In [184]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[184]:
In [185]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
In [186]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[186]:
In [187]:
clr_triangular._reset()
In [188]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[188]:
In [189]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[189]:
In [190]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
In [191]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[191]:
In [192]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[192]:
In [193]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [194]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[194]:
In [195]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[195]:
In [196]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [197]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
In [198]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[198]:
In [199]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[199]:
In [200]:
clr = lambda x: 1/(5**(x*0.0001))
In [201]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
In [202]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[202]:
In [203]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[203]:
In [54]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=Adamax(), loss='binary_crossentropy', metrics=['accuracy'])
In [55]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[55]:
In [56]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[56]:
In [208]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=Adamax(), loss='binary_crossentropy', metrics=['accuracy'])
In [209]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[209]:
In [210]:
clr_triangular._reset()
In [211]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[211]:
In [212]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[212]:
In [213]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=Adamax(), loss='binary_crossentropy', metrics=['accuracy'])
In [214]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[214]:
In [215]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[215]:
In [216]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [217]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[217]:
In [218]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[218]:
In [219]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [220]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=Adamax(), loss='binary_crossentropy', metrics=['accuracy'])
In [221]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[221]:
In [222]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[222]:
In [223]:
clr = lambda x: 1/(5**(x*0.0001))
In [224]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=Adamax(), loss='binary_crossentropy', metrics=['accuracy'])
In [225]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[225]:
In [226]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[226]:
In [227]:
clr_triangular = CyclicLR(mode='triangular')
model.compile(optimizer=Nadam(), loss='binary_crossentropy', metrics=['accuracy'])
In [228]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular],verbose=0)
Out[228]:
In [230]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[230]:
In [231]:
clr_triangular = CyclicLR(mode='triangular2')
model.compile(optimizer=Nadam(), loss='binary_crossentropy', metrics=['accuracy'])
In [232]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[232]:
In [233]:
clr_triangular._reset()
In [234]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[234]:
In [235]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[235]:
In [236]:
clr_triangular = CyclicLR(mode='exp_range', gamma=0.99994)
model.compile(optimizer=Nadam(), loss='binary_crossentropy', metrics=['accuracy'])
In [237]:
model.fit(X, Y, batch_size=2000, nb_epoch=20, callbacks=[clr_triangular], verbose=0)
Out[237]:
In [238]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[238]:
In [239]:
clr_triangular._reset(new_base_lr=0.003, new_max_lr=0.009)
In [240]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[240]:
In [241]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[241]:
In [242]:
clr = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
In [243]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='cycle')
model.compile(optimizer=Nadam(), loss='binary_crossentropy', metrics=['accuracy'])
In [244]:
model.fit(X, Y, batch_size=2000, nb_epoch=40, callbacks=[clr_triangular], verbose=0)
Out[244]:
In [245]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[245]:
In [246]:
clr = lambda x: 1/(5**(x*0.0001))
In [247]:
clr_triangular = CyclicLR(scale_fn=clr, scale_mode='iterations')
model.compile(optimizer=Nadam(), loss='binary_crossentropy', metrics=['accuracy'])
In [248]:
model.fit(X, Y, batch_size=2000, nb_epoch=10, callbacks=[clr_triangular], verbose=0)
Out[248]:
In [249]:
plt.plot(clr_triangular.history['iterations'], clr_triangular.history['lr'])
Out[249]: