In [1]:
import pandas as pd
import numpy as np
import seaborn as sns

import tensorflow as tf
print(tf.__version__)

from keras.layers import Dense
from keras.models import Model, Sequential

from keras import initializers


/home/minesh/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
1.8.0
Using TensorFlow backend.

In [57]:
from keras.callbacks import *

class CyclicLR(Callback):
    """This callback implements a cyclical learning rate policy (CLR).
    The method cycles the learning rate between two boundaries with
    some constant frequency, as detailed in this paper (https://arxiv.org/abs/1506.01186).
    The amplitude of the cycle can be scaled on a per-iteration or 
    per-cycle basis.
    This class has three built-in policies, as put forth in the paper.
    "triangular":
        A basic triangular cycle w/ no amplitude scaling.
    "triangular2":
        A basic triangular cycle that scales initial amplitude by half each cycle.
    "exp_range":
        A cycle that scales initial amplitude by gamma**(cycle iterations) at each 
        cycle iteration.
    For more detail, please see paper.
    
    # Example
        ```python
            clr = CyclicLR(base_lr=0.001, max_lr=0.006,
                                step_size=2000., mode='triangular')
            model.fit(X_train, Y_train, callbacks=[clr])
        ```
    
    Class also supports custom scaling functions:
        ```python
            clr_fn = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
            clr = CyclicLR(base_lr=0.001, max_lr=0.006,
                                step_size=2000., scale_fn=clr_fn,
                                scale_mode='cycle')
            model.fit(X_train, Y_train, callbacks=[clr])
        ```    
    # Arguments
        base_lr: initial learning rate which is the
            lower boundary in the cycle.
        max_lr: upper boundary in the cycle. Functionally,
            it defines the cycle amplitude (max_lr - base_lr).
            The lr at any cycle is the sum of base_lr
            and some scaling of the amplitude; therefore 
            max_lr may not actually be reached depending on
            scaling function.
        step_size: number of training iterations per
            half cycle. Authors suggest setting step_size
            2-8 x training iterations in epoch.
        mode: one of {triangular, triangular2, exp_range}.
            Default 'triangular'.
            Values correspond to policies detailed above.
            If scale_fn is not None, this argument is ignored.
        gamma: constant in 'exp_range' scaling function:
            gamma**(cycle iterations)
        scale_fn: Custom scaling policy defined by a single
            argument lambda function, where 
            0 <= scale_fn(x) <= 1 for all x >= 0.
            mode paramater is ignored 
        scale_mode: {'cycle', 'iterations'}.
            Defines whether scale_fn is evaluated on 
            cycle number or cycle iterations (training
            iterations since start of cycle). Default is 'cycle'.
    """

    def __init__(self, base_lr=0.001, max_lr=0.006, step_size=2000., mode='triangular',
                 gamma=1., scale_fn=None, scale_mode='cycle'):
        super(CyclicLR, self).__init__()

        self.base_lr = base_lr
        self.max_lr = max_lr
        self.step_size = step_size
        self.mode = mode
        self.gamma = gamma
        if scale_fn == None:
            if self.mode == 'triangular':
                self.scale_fn = lambda x: 1.
                self.scale_mode = 'cycle'
            elif self.mode == 'triangular2':
                self.scale_fn = lambda x: 1/(2.**(x-1))
                self.scale_mode = 'cycle'
            elif self.mode == 'exp_range':
                self.scale_fn = lambda x: gamma**(x)
                self.scale_mode = 'iterations'
        else:
            self.scale_fn = scale_fn
            self.scale_mode = scale_mode
        self.clr_iterations = 0.
        self.trn_iterations = 0.
        self.history = {}

        self._reset()

    def _reset(self, new_base_lr=None, new_max_lr=None,
               new_step_size=None):
        """Resets cycle iterations.
        Optional boundary/step size adjustment.
        """
        if new_base_lr != None:
            self.base_lr = new_base_lr
        if new_max_lr != None:
            self.max_lr = new_max_lr
        if new_step_size != None:
            self.step_size = new_step_size
        self.clr_iterations = 0.
        
    def clr(self):
        cycle = np.floor(1+self.clr_iterations/(2*self.step_size))
        x = np.abs(self.clr_iterations/self.step_size - 2*cycle + 1)
        if self.scale_mode == 'cycle':
            return self.base_lr + (self.max_lr-self.base_lr)*np.maximum(0, (1-x))*self.scale_fn(cycle)
        else:
            return self.base_lr + (self.max_lr-self.base_lr)*np.maximum(0, (1-x))*self.scale_fn(self.clr_iterations)
        
    def on_train_begin(self, logs={}):
        logs = logs or {}

        if self.clr_iterations == 0:
            K.set_value(self.model.optimizer.lr, self.base_lr)
        else:
            K.set_value(self.model.optimizer.lr, self.clr())        
            
    def on_batch_end(self, epoch, logs=None):
        
        logs = logs or {}
        self.trn_iterations += 1
        self.clr_iterations += 1

        self.history.setdefault('lr', []).append(K.get_value(self.model.optimizer.lr))
        self.history.setdefault('iterations', []).append(self.trn_iterations)

        for k, v in logs.items():
            self.history.setdefault(k, []).append(v)
        
        K.set_value(self.model.optimizer.lr, self.clr())

In [2]:
## ---------- Create our linear dataset ---------------
## Set the mean, standard deviation, and size of the dataset, respectively
mu, sigma, size = 0, 4, 100

## Set the slope (m) and y-intercept (b), respectively
m, b = 2, 100

## Create a uniformally distributed set of X values between 0 and 10 and store in pandas dataframe
x = np.random.uniform(0,10, size)
df = pd.DataFrame({'x':x})

## Find the "perfect" y value corresponding to each x value given
df['y_perfect'] = df['x'].apply(lambda x: m*x+b)


## Create some noise and add it to each "perfect" y value to create a realistic y dataset
df['noise'] = np.random.normal(mu, sigma, size=(size,))
df['y'] = df['y_perfect']+df['noise']

## Plot our noisy dataset with a standard linear regression 
## (note seaborn, the plotting library, does the linear regression by default)
ax1 = sns.regplot(x='x', y='y', data=df)



In [147]:
from keras.callbacks import *
es = EarlyStopping(min_delta=0.00001,patience=50,verbose=2)
cp = ModelCheckpoint("bst_model_wts.hdf5",save_best_only=True)
rlop = ReduceLROnPlateau(patience=15,factor=0.999,verbose=1,min_delta=10)
clr = CyclicLR(base_lr=0.0001, max_lr=0.03,
                        step_size=20., mode='triangular')

In [65]:
class SGDLearningRateTracker(Callback):
    def on_epoch_end(self, epoch, logs={}):
        optimizer = self.model.optimizer
        
        lr = K.eval( tf.cast(optimizer.lr , tf.float32)
                    * (1. / (1. + 
                            tf.cast(optimizer.decay , tf.float32)*
                            tf.cast(optimizer.iterations , tf.float32)
                            )))
        print('\nLR: {:.6f}\n'.format(lr))
lr_track=SGDLearningRateTracker()

In [148]:
##---------- Create our Keras Model -----------------
## Create our model with a single dense layer, with a linear activation function and glorot (Xavier) input normalization
model = Sequential([
        Dense(1, activation='linear', input_shape=(1,), kernel_initializer='glorot_uniform')
    ])

from keras.optimizers import SGD

sgd=SGD(0.03,decay=0.0001)
## Compile our model using the method of least squares (mse) loss function 
## and a stochastic gradient descent (sgd) optimizer
model.compile(loss='mse', optimizer=sgd) ## To try our model with an Adam optimizer simple replace 'sgd' with 'Adam'

## Set our learning rate to 0.01 and print it
# model.optimizer.lr.set_value(.001)
# print (model.optimizer.lr.get_value())

## Fit our model to the noisy data we create above. Notes: 
## The validation split parameter reserves 20% of our data for validation (ie 80% will be used for training)
## I don't really know if using a batch size of 1 makes sense
history = model.fit(x=df['x'], y=df['y'], validation_split=0.2
                    , batch_size=1, epochs=1000 # bs=100
                    , callbacks=[es,rlop,cp]
                   )


Train on 80 samples, validate on 20 samples
Epoch 1/1000
80/80 [==============================] - 2s 22ms/step - loss: 29304868.7704 - val_loss: 166253611.8500
Epoch 2/1000
80/80 [==============================] - 0s 2ms/step - loss: 365909333281.6063 - val_loss: 1959544128.0000
Epoch 3/1000
80/80 [==============================] - 0s 2ms/step - loss: 52729564426.9859 - val_loss: 61257415910.4000
Epoch 4/1000
80/80 [==============================] - 0s 2ms/step - loss: 492951332404.6504 - val_loss: 4872737448.0000
Epoch 5/1000
80/80 [==============================] - 0s 2ms/step - loss: 2372873681421.9839 - val_loss: 75387766616883.2031
Epoch 6/1000
80/80 [==============================] - 0s 2ms/step - loss: 78207605224459.2031 - val_loss: 29442925564.8000
Epoch 7/1000
80/80 [==============================] - 0s 2ms/step - loss: 1309871851018.7688 - val_loss: 2836933266022.3999
Epoch 8/1000
80/80 [==============================] - 0s 2ms/step - loss: 46759747182370792.0000 - val_loss: 167217174917939.1875
Epoch 9/1000
80/80 [==============================] - 0s 3ms/step - loss: 8292826083786752.0000 - val_loss: 66945207504896.0000
Epoch 10/1000
80/80 [==============================] - 0s 3ms/step - loss: 1155880928393052.7500 - val_loss: 145996264085913.5938
Epoch 11/1000
80/80 [==============================] - 0s 3ms/step - loss: 216187987478014.8750 - val_loss: 112620766340.8375
Epoch 12/1000
80/80 [==============================] - 0s 3ms/step - loss: 4645509116414.2002 - val_loss: 1590503479.8500
Epoch 13/1000
80/80 [==============================] - 0s 2ms/step - loss: 203312642999.6094 - val_loss: 125774326374.4000
Epoch 14/1000
80/80 [==============================] - 0s 2ms/step - loss: 100036208381192.3750 - val_loss: 2866624734201.6001
Epoch 15/1000
80/80 [==============================] - 0s 3ms/step - loss: 471686904669242.8750 - val_loss: 9632119029670.4004
Epoch 16/1000
80/80 [==============================] - 0s 3ms/step - loss: 137514802053480.7969 - val_loss: 6232690435481.5996

Epoch 00016: ReduceLROnPlateau reducing learning rate to 0.029969999330118298.
Epoch 17/1000
80/80 [==============================] - 0s 3ms/step - loss: 62362324768312.0000 - val_loss: 1324470232.4000
Epoch 18/1000
80/80 [==============================] - 0s 3ms/step - loss: 259833904253.9000 - val_loss: 170270645.6500
Epoch 19/1000
80/80 [==============================] - 0s 3ms/step - loss: 316842744.0410 - val_loss: 16443701.7750
Epoch 20/1000
80/80 [==============================] - 0s 3ms/step - loss: 117593311.3337 - val_loss: 201002.0506
Epoch 21/1000
80/80 [==============================] - 0s 3ms/step - loss: 758590273.6216 - val_loss: 2595115.2570
Epoch 22/1000
80/80 [==============================] - 0s 3ms/step - loss: 71442558.5129 - val_loss: 599807.6831
Epoch 23/1000
80/80 [==============================] - 0s 3ms/step - loss: 5330293.8100 - val_loss: 45109703.6375
Epoch 24/1000
80/80 [==============================] - 0s 3ms/step - loss: 14884319.8535 - val_loss: 166476.5064
Epoch 25/1000
80/80 [==============================] - 0s 3ms/step - loss: 3348491.0887 - val_loss: 322346.0743
Epoch 26/1000
80/80 [==============================] - 0s 3ms/step - loss: 7754261.1961 - val_loss: 15546.5506
Epoch 27/1000
80/80 [==============================] - 0s 3ms/step - loss: 1366852.6331 - val_loss: 2572786.0881
Epoch 28/1000
80/80 [==============================] - 0s 3ms/step - loss: 3701979.1159 - val_loss: 114.3445
Epoch 29/1000
80/80 [==============================] - 0s 3ms/step - loss: 23074.3020 - val_loss: 697.2942
Epoch 30/1000
80/80 [==============================] - 0s 2ms/step - loss: 427.1662 - val_loss: 87.8608
Epoch 31/1000
80/80 [==============================] - 0s 3ms/step - loss: 10228.1417 - val_loss: 166373.0789
Epoch 32/1000
80/80 [==============================] - 0s 3ms/step - loss: 1892.8905 - val_loss: 95.4026
Epoch 33/1000
80/80 [==============================] - 0s 3ms/step - loss: 365.6621 - val_loss: 47.1967
Epoch 34/1000
80/80 [==============================] - 0s 3ms/step - loss: 489.5981 - val_loss: 762.5251
Epoch 35/1000
80/80 [==============================] - 0s 3ms/step - loss: 19376.3722 - val_loss: 28.0025
Epoch 36/1000
80/80 [==============================] - 0s 3ms/step - loss: 220.7086 - val_loss: 899.9633
Epoch 37/1000
80/80 [==============================] - 0s 3ms/step - loss: 334.1000 - val_loss: 20.7428
Epoch 38/1000
80/80 [==============================] - 0s 3ms/step - loss: 300.1286 - val_loss: 46.0211
Epoch 39/1000
80/80 [==============================] - 0s 3ms/step - loss: 623.1408 - val_loss: 26.4629
Epoch 40/1000
80/80 [==============================] - 0s 3ms/step - loss: 91.0267 - val_loss: 19.8361
Epoch 41/1000
80/80 [==============================] - 0s 3ms/step - loss: 969.0514 - val_loss: 20.4473
Epoch 42/1000
80/80 [==============================] - 0s 3ms/step - loss: 12065.4836 - val_loss: 103.5448
Epoch 43/1000
80/80 [==============================] - 0s 3ms/step - loss: 1952.6233 - val_loss: 41.7384
Epoch 44/1000
80/80 [==============================] - 0s 3ms/step - loss: 2448.0910 - val_loss: 278.1238
Epoch 45/1000
80/80 [==============================] - 0s 3ms/step - loss: 786.7367 - val_loss: 387.6096
Epoch 46/1000
80/80 [==============================] - 0s 3ms/step - loss: 89.2088 - val_loss: 40.3368
Epoch 47/1000
80/80 [==============================] - 0s 3ms/step - loss: 165.7064 - val_loss: 42.6610
Epoch 48/1000
80/80 [==============================] - 0s 3ms/step - loss: 1165.3578 - val_loss: 20.4491
Epoch 49/1000
80/80 [==============================] - 0s 3ms/step - loss: 247.7275 - val_loss: 1128.7868
Epoch 50/1000
80/80 [==============================] - 0s 3ms/step - loss: 144.0951 - val_loss: 2329.9968

Epoch 00050: ReduceLROnPlateau reducing learning rate to 0.02994002956710756.
Epoch 51/1000
80/80 [==============================] - 0s 3ms/step - loss: 1518.5154 - val_loss: 68.0308
Epoch 52/1000
80/80 [==============================] - 0s 3ms/step - loss: 171.4600 - val_loss: 20.3927
Epoch 53/1000
80/80 [==============================] - 0s 3ms/step - loss: 258.9091 - val_loss: 39.2343
Epoch 54/1000
80/80 [==============================] - 0s 3ms/step - loss: 173.2771 - val_loss: 53.3233
Epoch 55/1000
80/80 [==============================] - 0s 3ms/step - loss: 1047.1914 - val_loss: 29.2247
Epoch 56/1000
80/80 [==============================] - 0s 3ms/step - loss: 174.2948 - val_loss: 30.1324
Epoch 57/1000
80/80 [==============================] - 0s 3ms/step - loss: 129.8265 - val_loss: 19.3406
Epoch 58/1000
80/80 [==============================] - 0s 3ms/step - loss: 233.9742 - val_loss: 60.7315
Epoch 59/1000
80/80 [==============================] - 0s 3ms/step - loss: 578.0170 - val_loss: 57558.5164
Epoch 60/1000
80/80 [==============================] - 0s 3ms/step - loss: 15595.6122 - val_loss: 572.7818
Epoch 61/1000
80/80 [==============================] - 0s 3ms/step - loss: 155.1206 - val_loss: 240.2991
Epoch 62/1000
80/80 [==============================] - 0s 3ms/step - loss: 189.4578 - val_loss: 23.2494
Epoch 63/1000
80/80 [==============================] - 0s 3ms/step - loss: 1059.3797 - val_loss: 22.3228
Epoch 64/1000
80/80 [==============================] - 0s 3ms/step - loss: 59.2150 - val_loss: 19.8520
Epoch 65/1000
80/80 [==============================] - 0s 3ms/step - loss: 316.2121 - val_loss: 19.7299

Epoch 00065: ReduceLROnPlateau reducing learning rate to 0.029910089576616884.
Epoch 66/1000
80/80 [==============================] - 0s 3ms/step - loss: 58.9563 - val_loss: 51.9649
Epoch 67/1000
80/80 [==============================] - 0s 3ms/step - loss: 97.9336 - val_loss: 66.3338
Epoch 68/1000
80/80 [==============================] - 0s 3ms/step - loss: 194.7163 - val_loss: 66.5813
Epoch 69/1000
80/80 [==============================] - 0s 3ms/step - loss: 131.5370 - val_loss: 19.3291
Epoch 70/1000
80/80 [==============================] - 0s 3ms/step - loss: 61.4164 - val_loss: 21.9973
Epoch 71/1000
80/80 [==============================] - 0s 4ms/step - loss: 219.9669 - val_loss: 21.7071
Epoch 72/1000
80/80 [==============================] - 0s 3ms/step - loss: 459.1665 - val_loss: 22.5458
Epoch 73/1000
80/80 [==============================] - 0s 4ms/step - loss: 92.9948 - val_loss: 25.6914
Epoch 74/1000
80/80 [==============================] - 0s 5ms/step - loss: 197.6622 - val_loss: 2152.3315
Epoch 75/1000
80/80 [==============================] - 0s 4ms/step - loss: 645.8859 - val_loss: 45.1623
Epoch 76/1000
80/80 [==============================] - 0s 3ms/step - loss: 76.9980 - val_loss: 290.3416
Epoch 77/1000
80/80 [==============================] - 0s 3ms/step - loss: 372.3467 - val_loss: 34.4884
Epoch 78/1000
80/80 [==============================] - 0s 5ms/step - loss: 73.7526 - val_loss: 19.8743
Epoch 79/1000
80/80 [==============================] - 0s 5ms/step - loss: 61.9870 - val_loss: 114.9071
Epoch 80/1000
80/80 [==============================] - 0s 4ms/step - loss: 111.6028 - val_loss: 787.7047

Epoch 00080: ReduceLROnPlateau reducing learning rate to 0.029880179358646272.
Epoch 81/1000
80/80 [==============================] - 0s 3ms/step - loss: 120.2942 - val_loss: 32.1517
Epoch 82/1000
80/80 [==============================] - 0s 3ms/step - loss: 614.7544 - val_loss: 32.9005
Epoch 83/1000
80/80 [==============================] - 0s 3ms/step - loss: 121.0970 - val_loss: 96.4114
Epoch 84/1000
80/80 [==============================] - 0s 3ms/step - loss: 59.4423 - val_loss: 27.3107
Epoch 85/1000
80/80 [==============================] - 0s 3ms/step - loss: 81.6644 - val_loss: 85.1734
Epoch 86/1000
80/80 [==============================] - 0s 4ms/step - loss: 110.9255 - val_loss: 171.1225
Epoch 87/1000
80/80 [==============================] - 0s 5ms/step - loss: 65.8294 - val_loss: 48.2612
Epoch 88/1000
80/80 [==============================] - 0s 4ms/step - loss: 163.1650 - val_loss: 28.7791
Epoch 89/1000
80/80 [==============================] - 0s 3ms/step - loss: 84.6918 - val_loss: 26.2142
Epoch 90/1000
80/80 [==============================] - 0s 3ms/step - loss: 153.5419 - val_loss: 19.8316
Epoch 91/1000
80/80 [==============================] - 0s 3ms/step - loss: 69.0920 - val_loss: 21.3515
Epoch 92/1000
80/80 [==============================] - 0s 3ms/step - loss: 44.0407 - val_loss: 42.8914
Epoch 93/1000
80/80 [==============================] - 0s 4ms/step - loss: 213.4378 - val_loss: 23.8281
Epoch 94/1000
80/80 [==============================] - 0s 4ms/step - loss: 287.6379 - val_loss: 34.6693
Epoch 95/1000
80/80 [==============================] - 0s 4ms/step - loss: 79.6301 - val_loss: 22.2006

Epoch 00095: ReduceLROnPlateau reducing learning rate to 0.029850298913195728.
Epoch 96/1000
80/80 [==============================] - 0s 4ms/step - loss: 240.9209 - val_loss: 97.8177
Epoch 97/1000
80/80 [==============================] - 0s 4ms/step - loss: 106.9419 - val_loss: 23.1409
Epoch 98/1000
80/80 [==============================] - 0s 3ms/step - loss: 71.5640 - val_loss: 32.8615
Epoch 99/1000
80/80 [==============================] - 0s 3ms/step - loss: 148.5411 - val_loss: 19.1781
Epoch 100/1000
80/80 [==============================] - 0s 4ms/step - loss: 40.1278 - val_loss: 229.7484
Epoch 101/1000
80/80 [==============================] - 0s 4ms/step - loss: 80.3622 - val_loss: 216.5606
Epoch 102/1000
80/80 [==============================] - 0s 4ms/step - loss: 39.9385 - val_loss: 246.2964
Epoch 103/1000
80/80 [==============================] - 0s 4ms/step - loss: 53.7541 - val_loss: 21.8749
Epoch 104/1000
80/80 [==============================] - 0s 3ms/step - loss: 33.6609 - val_loss: 98.9240
Epoch 105/1000
80/80 [==============================] - 0s 3ms/step - loss: 107.8302 - val_loss: 19.8785
Epoch 106/1000
80/80 [==============================] - 0s 4ms/step - loss: 65.1311 - val_loss: 22.8187
Epoch 107/1000
80/80 [==============================] - 0s 4ms/step - loss: 60.3671 - val_loss: 75.3172
Epoch 108/1000
80/80 [==============================] - 0s 4ms/step - loss: 63.1650 - val_loss: 169.1341
Epoch 109/1000
80/80 [==============================] - ETA: 0s - loss: 41.32 - 0s 3ms/step - loss: 41.6595 - val_loss: 53.3375
Epoch 110/1000
80/80 [==============================] - 0s 3ms/step - loss: 81.6650 - val_loss: 20.4896

Epoch 00110: ReduceLROnPlateau reducing learning rate to 0.02982044824026525.
Epoch 111/1000
80/80 [==============================] - 0s 3ms/step - loss: 56.0365 - val_loss: 24.0950
Epoch 112/1000
80/80 [==============================] - 0s 3ms/step - loss: 54.8229 - val_loss: 77.1739
Epoch 113/1000
80/80 [==============================] - 0s 4ms/step - loss: 46.1725 - val_loss: 29.7302
Epoch 114/1000
80/80 [==============================] - 0s 4ms/step - loss: 54.0612 - val_loss: 20.5211
Epoch 115/1000
80/80 [==============================] - 0s 4ms/step - loss: 36.6747 - val_loss: 172.0680
Epoch 116/1000
80/80 [==============================] - 0s 4ms/step - loss: 41.5979 - val_loss: 19.7981
Epoch 117/1000
80/80 [==============================] - 0s 3ms/step - loss: 142.7253 - val_loss: 37.5683
Epoch 118/1000
80/80 [==============================] - 0s 4ms/step - loss: 75.2257 - val_loss: 28.6464
Epoch 119/1000
80/80 [==============================] - 0s 3ms/step - loss: 60.0655 - val_loss: 179.6530
Epoch 120/1000
80/80 [==============================] - 0s 4ms/step - loss: 62.6737 - val_loss: 59.4409
Epoch 121/1000
80/80 [==============================] - 0s 4ms/step - loss: 38.6275 - val_loss: 24.3583
Epoch 122/1000
80/80 [==============================] - 0s 4ms/step - loss: 30.2389 - val_loss: 42.9383
Epoch 123/1000
80/80 [==============================] - 0s 4ms/step - loss: 29.7408 - val_loss: 75.0399
Epoch 124/1000
80/80 [==============================] - 0s 4ms/step - loss: 51.9539 - val_loss: 31.6922
Epoch 125/1000
80/80 [==============================] - 0s 3ms/step - loss: 45.6601 - val_loss: 23.8330

Epoch 00125: ReduceLROnPlateau reducing learning rate to 0.029790627339854835.
Epoch 126/1000
80/80 [==============================] - 0s 4ms/step - loss: 70.7954 - val_loss: 26.2617
Epoch 127/1000
80/80 [==============================] - 0s 4ms/step - loss: 83.2594 - val_loss: 32.5316
Epoch 128/1000
80/80 [==============================] - 0s 4ms/step - loss: 71.4533 - val_loss: 57.9407
Epoch 129/1000
80/80 [==============================] - 0s 3ms/step - loss: 58.5512 - val_loss: 57.8714
Epoch 130/1000
80/80 [==============================] - 0s 3ms/step - loss: 84.1749 - val_loss: 40.9739
Epoch 131/1000
80/80 [==============================] - 0s 3ms/step - loss: 46.5357 - val_loss: 243.2496
Epoch 132/1000
80/80 [==============================] - 0s 3ms/step - loss: 59.3084 - val_loss: 58.1299
Epoch 133/1000
80/80 [==============================] - 0s 3ms/step - loss: 57.6358 - val_loss: 29.9796
Epoch 134/1000
80/80 [==============================] - 0s 3ms/step - loss: 90.3936 - val_loss: 25.4362
Epoch 135/1000
80/80 [==============================] - 0s 3ms/step - loss: 57.7804 - val_loss: 22.9286
Epoch 136/1000
80/80 [==============================] - 0s 3ms/step - loss: 59.3383 - val_loss: 36.1047
Epoch 137/1000
80/80 [==============================] - 0s 3ms/step - loss: 32.4562 - val_loss: 26.5854
Epoch 138/1000
80/80 [==============================] - 0s 3ms/step - loss: 32.5665 - val_loss: 20.9283
Epoch 139/1000
80/80 [==============================] - 0s 3ms/step - loss: 37.7635 - val_loss: 66.0974
Epoch 140/1000
80/80 [==============================] - 0s 3ms/step - loss: 46.8429 - val_loss: 40.8108

Epoch 00140: ReduceLROnPlateau reducing learning rate to 0.029760836211964486.
Epoch 141/1000
80/80 [==============================] - 0s 3ms/step - loss: 47.2041 - val_loss: 45.4773
Epoch 142/1000
80/80 [==============================] - 0s 4ms/step - loss: 39.7498 - val_loss: 39.2440
Epoch 143/1000
80/80 [==============================] - 0s 3ms/step - loss: 35.1506 - val_loss: 44.4581
Epoch 144/1000
80/80 [==============================] - 0s 3ms/step - loss: 31.4047 - val_loss: 56.8965
Epoch 145/1000
80/80 [==============================] - 0s 3ms/step - loss: 37.5291 - val_loss: 260.9208
Epoch 146/1000
80/80 [==============================] - 0s 3ms/step - loss: 44.6587 - val_loss: 26.9865
Epoch 147/1000
80/80 [==============================] - 0s 3ms/step - loss: 30.7012 - val_loss: 20.4343
Epoch 148/1000
80/80 [==============================] - 0s 3ms/step - loss: 37.0177 - val_loss: 19.9109
Epoch 149/1000
80/80 [==============================] - 0s 3ms/step - loss: 32.1214 - val_loss: 21.4824
Epoch 00149: early stopping

In [149]:
# list all data in history
print(history.history.keys())
import matplotlib.pyplot as plt

# # summarize history for accuracy
# plt.plot(history.history['acc'])
# plt.plot(history.history['val_acc'])
# plt.title('model accuracy')
# plt.ylabel('accuracy')
# plt.xlabel('epoch')
# plt.legend(['train', 'test'], loc='upper left')
# # axes = plt.gca()
# # axes.set_xlim([0,120])
# # axes.set_ylim([90,100])
# plt.savefig('acc.png')  # save the figure to file
# plt.show()
# plt.close()

# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig('loss.png')
plt.show()


dict_keys(['val_loss', 'loss', 'lr'])

In [151]:
model.load_weights("bst_model_wts.hdf5")
# Compile model (required to make predictions)
# model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

In [152]:
## ---------- Review our weights -------------------
## Save and print our final weights
predicted_m = model.get_weights()[0][0][0]
predicted_b = model.get_weights()[1][0]
print ("\nm=%.2f b=%.2f\n" % (predicted_m, predicted_b))

## Create our predicted y's based on the model
df['y_predicted'] = df['x'].apply(lambda x: predicted_m*x + predicted_b)

## Plot the original data with a standard linear regression
ax1 = sns.regplot(x='x', y='y', data=df, label='real')

## Plot our predicted line based on our Keras model's slope and y-intercept
ax2 = sns.regplot(x='x', y='y_predicted', data=df, scatter=False, label='predicted')
ax2.legend(loc="upper left")


m=2.04 b=99.08

Out[152]:
<matplotlib.legend.Legend at 0x7fbaaf7a6f60>

In [ ]: