Recurrent Neural Networks


In [1]:
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

Time series forecasting


In [2]:
df = pd.read_csv('./data/cansim-0800020-eng-6674700030567901031.csv',
                 skiprows=6, skipfooter=9,
                 engine='python')
df.head()


Out[2]:
Adjustments Unadjusted Seasonally adjusted
0 Jan-1991 12588862 15026890
1 Feb-1991 12154321 15304585
2 Mar-1991 14337072 15413591
3 Apr-1991 15108570 15293409
4 May-1991 17225734 15676083

In [3]:
from pandas.tseries.offsets import MonthEnd

In [4]:
df['Adjustments'] = pd.to_datetime(df['Adjustments']) + MonthEnd(1)
df = df.set_index('Adjustments')
df.head()


Out[4]:
Unadjusted Seasonally adjusted
Adjustments
1991-01-31 12588862 15026890
1991-02-28 12154321 15304585
1991-03-31 14337072 15413591
1991-04-30 15108570 15293409
1991-05-31 17225734 15676083

In [5]:
df.plot(figsize = (12,7))


Out[5]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc348406978>

In [6]:
split_date = pd.Timestamp('01-01-2011')

In [7]:
train = df.loc[:split_date, ['Unadjusted']]
test = df.loc[split_date:, ['Unadjusted']]

In [8]:
ax = train.plot()
test.plot(ax = ax)
plt.legend(['train', 'test'])


Out[8]:
<matplotlib.legend.Legend at 0x7fc34836d780>

In [9]:
from sklearn.preprocessing import MinMaxScaler

sc = MinMaxScaler()

# Tranforming only on the train data
# Fit to it on the test data
train_sc = sc.fit_transform(train)
test_sc = sc.transform(test)

In [10]:
train_sc[:4]


Out[10]:
array([[ 0.01402033],
       [ 0.        ],
       [ 0.0704258 ],
       [ 0.09531795]])

In [11]:
X_train = train_sc[:-1]
y_train = train_sc[1:]

X_test = test_sc[:-1]
y_test = test_sc[1:]

Fully connected predictor


In [12]:
from keras.models import Sequential
from keras.layers import Dense
import keras.backend as K
from keras.callbacks import EarlyStopping


Using TensorFlow backend.

In [13]:
K.clear_session()

model = Sequential()
model.add(Dense(12, 
                input_dim = 1, 
                activation = 'relu'))
model.add(Dense(1))
model.compile(optimizer = 'adam', 
              loss = 'mean_squared_error', 
              metrics = ['mae'])
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 12)                24        
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 13        
=================================================================
Total params: 37
Trainable params: 37
Non-trainable params: 0
_________________________________________________________________

In [14]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 10, 
                           verbose = 1)

In [15]:
model.fit(X_train, 
          y_train, 
          epochs = 200,
          batch_size = 2, 
          verbose = 2,
          callbacks = [early_stop])


Epoch 1/200
0s - loss: 0.2012 - mean_absolute_error: 0.3609
Epoch 2/200
0s - loss: 0.0498 - mean_absolute_error: 0.1731
Epoch 3/200
0s - loss: 0.0273 - mean_absolute_error: 0.1382
Epoch 4/200
0s - loss: 0.0238 - mean_absolute_error: 0.1312
Epoch 5/200
0s - loss: 0.0216 - mean_absolute_error: 0.1247
Epoch 6/200
0s - loss: 0.0197 - mean_absolute_error: 0.1184
Epoch 7/200
0s - loss: 0.0179 - mean_absolute_error: 0.1113
Epoch 8/200
0s - loss: 0.0162 - mean_absolute_error: 0.1046
Epoch 9/200
0s - loss: 0.0147 - mean_absolute_error: 0.0987
Epoch 10/200
0s - loss: 0.0136 - mean_absolute_error: 0.0930
Epoch 11/200
0s - loss: 0.0125 - mean_absolute_error: 0.0877
Epoch 12/200
0s - loss: 0.0117 - mean_absolute_error: 0.0831
Epoch 13/200
0s - loss: 0.0112 - mean_absolute_error: 0.0799
Epoch 14/200
0s - loss: 0.0108 - mean_absolute_error: 0.0762
Epoch 15/200
0s - loss: 0.0104 - mean_absolute_error: 0.0738
Epoch 16/200
0s - loss: 0.0102 - mean_absolute_error: 0.0721
Epoch 17/200
0s - loss: 0.0101 - mean_absolute_error: 0.0713
Epoch 18/200
0s - loss: 0.0101 - mean_absolute_error: 0.0697
Epoch 19/200
0s - loss: 0.0100 - mean_absolute_error: 0.0693
Epoch 20/200
0s - loss: 0.0098 - mean_absolute_error: 0.0686
Epoch 21/200
0s - loss: 0.0099 - mean_absolute_error: 0.0682
Epoch 22/200
0s - loss: 0.0098 - mean_absolute_error: 0.0679
Epoch 23/200
0s - loss: 0.0099 - mean_absolute_error: 0.0680
Epoch 24/200
0s - loss: 0.0098 - mean_absolute_error: 0.0677
Epoch 25/200
0s - loss: 0.0099 - mean_absolute_error: 0.0677
Epoch 26/200
0s - loss: 0.0097 - mean_absolute_error: 0.0673
Epoch 27/200
0s - loss: 0.0101 - mean_absolute_error: 0.0691
Epoch 28/200
0s - loss: 0.0100 - mean_absolute_error: 0.0677
Epoch 29/200
0s - loss: 0.0098 - mean_absolute_error: 0.0675
Epoch 30/200
0s - loss: 0.0098 - mean_absolute_error: 0.0668
Epoch 31/200
0s - loss: 0.0099 - mean_absolute_error: 0.0676
Epoch 32/200
0s - loss: 0.0098 - mean_absolute_error: 0.0674
Epoch 33/200
0s - loss: 0.0100 - mean_absolute_error: 0.0670
Epoch 34/200
0s - loss: 0.0099 - mean_absolute_error: 0.0674
Epoch 35/200
0s - loss: 0.0098 - mean_absolute_error: 0.0676
Epoch 36/200
0s - loss: 0.0099 - mean_absolute_error: 0.0672
Epoch 37/200
0s - loss: 0.0100 - mean_absolute_error: 0.0682
Epoch 00036: early stopping
Out[15]:
<keras.callbacks.History at 0x7fc331d877f0>

In [16]:
y_pred = model.predict(X_test)

In [17]:
plt.plot(y_test)
plt.plot(y_pred)


Out[17]:
[<matplotlib.lines.Line2D at 0x7fc34836d908>]

Recurrent predictor


In [18]:
from keras.layers import LSTM

In [19]:
X_train.shape


Out[19]:
(239, 1)

In [20]:
#3D tensor with shape (batch_size, timesteps, input_dim)
X_train[:, None].shape


Out[20]:
(239, 1, 1)

In [21]:
X_train_t = X_train[:, None]
X_test_t = X_test[:, None]

In [22]:
K.clear_session()
model = Sequential()

model.add(LSTM(6, 
               input_shape = (1, 1)))

model.add(Dense(1))

model.compile(optimizer = 'adam', 
              loss = 'mean_squared_error', 
              metrics = ['mae'])

In [23]:
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 6)                 192       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 7         
=================================================================
Total params: 199
Trainable params: 199
Non-trainable params: 0
_________________________________________________________________

In [24]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 10, 
                           verbose = 1)

In [25]:
model.fit(X_train_t, 
          y_train,
          epochs = 100, 
          batch_size = 1, 
          verbose = 2,
          callbacks=[early_stop])


Epoch 1/100
1s - loss: 0.1535 - mean_absolute_error: 0.3082
Epoch 2/100
0s - loss: 0.0513 - mean_absolute_error: 0.1880
Epoch 3/100
1s - loss: 0.0390 - mean_absolute_error: 0.1694
Epoch 4/100
0s - loss: 0.0317 - mean_absolute_error: 0.1526
Epoch 5/100
1s - loss: 0.0261 - mean_absolute_error: 0.1375
Epoch 6/100
1s - loss: 0.0203 - mean_absolute_error: 0.1202
Epoch 7/100
0s - loss: 0.0159 - mean_absolute_error: 0.1037
Epoch 8/100
0s - loss: 0.0131 - mean_absolute_error: 0.0901
Epoch 9/100
0s - loss: 0.0117 - mean_absolute_error: 0.0824
Epoch 10/100
0s - loss: 0.0108 - mean_absolute_error: 0.0755
Epoch 11/100
0s - loss: 0.0104 - mean_absolute_error: 0.0719
Epoch 12/100
0s - loss: 0.0104 - mean_absolute_error: 0.0696
Epoch 13/100
0s - loss: 0.0101 - mean_absolute_error: 0.0696
Epoch 14/100
0s - loss: 0.0103 - mean_absolute_error: 0.0692
Epoch 15/100
0s - loss: 0.0103 - mean_absolute_error: 0.0700
Epoch 16/100
0s - loss: 0.0102 - mean_absolute_error: 0.0683
Epoch 17/100
0s - loss: 0.0101 - mean_absolute_error: 0.0683
Epoch 18/100
0s - loss: 0.0105 - mean_absolute_error: 0.0693
Epoch 19/100
0s - loss: 0.0102 - mean_absolute_error: 0.0686
Epoch 20/100
0s - loss: 0.0103 - mean_absolute_error: 0.0691
Epoch 21/100
0s - loss: 0.0104 - mean_absolute_error: 0.0694
Epoch 22/100
0s - loss: 0.0102 - mean_absolute_error: 0.0679
Epoch 23/100
0s - loss: 0.0103 - mean_absolute_error: 0.0682
Epoch 24/100
0s - loss: 0.0101 - mean_absolute_error: 0.0690
Epoch 00023: early stopping
Out[25]:
<keras.callbacks.History at 0x7fc328b42908>

In [26]:
y_pred = model.predict(X_test_t)
plt.plot(y_test)
plt.plot(y_pred)


Out[26]:
[<matplotlib.lines.Line2D at 0x7fc34b0b3ba8>]

Windows


In [27]:
train_sc.shape


Out[27]:
(240, 1)

In [28]:
train_sc_df = pd.DataFrame(train_sc, 
                           columns = ['Scaled'], 
                           index = train.index)
test_sc_df = pd.DataFrame(test_sc, 
                          columns = ['Scaled'], 
                          index = test.index)
train_sc_df.head()


Out[28]:
Scaled
Adjustments
1991-01-31 0.014020
1991-02-28 0.000000
1991-03-31 0.070426
1991-04-30 0.095318
1991-05-31 0.163628

In [29]:
for s in range(1, 13):
    train_sc_df['shift_{}'.format(s)] = train_sc_df['Scaled'].shift(s)
    test_sc_df['shift_{}'.format(s)] = test_sc_df['Scaled'].shift(s)

In [30]:
train_sc_df.head(13)


Out[30]:
Scaled shift_1 shift_2 shift_3 shift_4 shift_5 shift_6 shift_7 shift_8 shift_9 shift_10 shift_11 shift_12
Adjustments
1991-01-31 0.014020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1991-02-28 0.000000 0.014020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1991-03-31 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1991-04-30 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1991-05-31 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN NaN NaN NaN
1991-06-30 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN NaN NaN
1991-07-31 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN NaN
1991-08-31 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN NaN
1991-09-30 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN NaN
1991-10-31 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN NaN
1991-11-30 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020 NaN NaN
1991-12-31 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.01402 NaN
1992-01-31 0.030027 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.00000 0.01402

In [31]:
X_train = train_sc_df.dropna().drop('Scaled', axis=1)
y_train = train_sc_df.dropna()[['Scaled']]

X_test = test_sc_df.dropna().drop('Scaled', axis=1)
y_test = test_sc_df.dropna()[['Scaled']]

In [32]:
X_train.head()


Out[32]:
shift_1 shift_2 shift_3 shift_4 shift_5 shift_6 shift_7 shift_8 shift_9 shift_10 shift_11 shift_12
Adjustments
1992-01-31 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000 0.014020
1992-02-29 0.030027 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426 0.000000
1992-03-31 0.019993 0.030027 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318 0.070426
1992-04-30 0.065964 0.019993 0.030027 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628 0.095318
1992-05-31 0.109831 0.065964 0.019993 0.030027 0.200913 0.131738 0.111395 0.092309 0.126174 0.123958 0.135141 0.163628

In [33]:
X_train.shape


Out[33]:
(228, 12)

In [34]:
X_train = X_train.values
X_test= X_test.values

y_train = y_train.values
y_test = y_test.values

Fully Connected on Windows


In [35]:
K.clear_session()

model = Sequential()
model.add(Dense(12, 
                input_dim = 12, 
                activation = 'relu'))
model.add(Dense(1))
model.compile(optimizer = 'adam', 
              loss = 'mean_squared_error', 
              metrics = ['mae'])
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 12)                156       
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 13        
=================================================================
Total params: 169
Trainable params: 169
Non-trainable params: 0
_________________________________________________________________

In [36]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 10, 
                           verbose = 1)

In [37]:
model.fit(X_train, 
          y_train, 
          epochs = 200,
          batch_size = 1, 
          verbose = 2, 
          callbacks = [early_stop])


Epoch 1/200
0s - loss: 0.0530 - mean_absolute_error: 0.1460
Epoch 2/200
0s - loss: 0.0049 - mean_absolute_error: 0.0561
Epoch 3/200
0s - loss: 0.0036 - mean_absolute_error: 0.0456
Epoch 4/200
0s - loss: 0.0031 - mean_absolute_error: 0.0414
Epoch 5/200
0s - loss: 0.0028 - mean_absolute_error: 0.0396
Epoch 6/200
0s - loss: 0.0026 - mean_absolute_error: 0.0380
Epoch 7/200
0s - loss: 0.0024 - mean_absolute_error: 0.0368
Epoch 8/200
0s - loss: 0.0023 - mean_absolute_error: 0.0346
Epoch 9/200
0s - loss: 0.0021 - mean_absolute_error: 0.0337
Epoch 10/200
0s - loss: 0.0023 - mean_absolute_error: 0.0345
Epoch 11/200
0s - loss: 0.0020 - mean_absolute_error: 0.0324
Epoch 12/200
0s - loss: 0.0018 - mean_absolute_error: 0.0310
Epoch 13/200
0s - loss: 0.0018 - mean_absolute_error: 0.0304
Epoch 14/200
0s - loss: 0.0017 - mean_absolute_error: 0.0307
Epoch 15/200
0s - loss: 0.0018 - mean_absolute_error: 0.0319
Epoch 16/200
0s - loss: 0.0016 - mean_absolute_error: 0.0304
Epoch 17/200
0s - loss: 0.0015 - mean_absolute_error: 0.0290
Epoch 18/200
0s - loss: 0.0014 - mean_absolute_error: 0.0281
Epoch 19/200
0s - loss: 0.0015 - mean_absolute_error: 0.0293
Epoch 20/200
0s - loss: 0.0014 - mean_absolute_error: 0.0280
Epoch 21/200
0s - loss: 0.0014 - mean_absolute_error: 0.0275
Epoch 22/200
0s - loss: 0.0013 - mean_absolute_error: 0.0264
Epoch 23/200
0s - loss: 0.0013 - mean_absolute_error: 0.0261
Epoch 24/200
0s - loss: 0.0014 - mean_absolute_error: 0.0274
Epoch 25/200
0s - loss: 0.0011 - mean_absolute_error: 0.0259
Epoch 26/200
0s - loss: 0.0012 - mean_absolute_error: 0.0255
Epoch 27/200
0s - loss: 0.0012 - mean_absolute_error: 0.0257
Epoch 28/200
0s - loss: 0.0011 - mean_absolute_error: 0.0248
Epoch 29/200
0s - loss: 0.0011 - mean_absolute_error: 0.0249
Epoch 30/200
0s - loss: 0.0011 - mean_absolute_error: 0.0240
Epoch 31/200
0s - loss: 0.0010 - mean_absolute_error: 0.0239
Epoch 32/200
0s - loss: 0.0011 - mean_absolute_error: 0.0245
Epoch 33/200
0s - loss: 8.7837e-04 - mean_absolute_error: 0.0221
Epoch 34/200
0s - loss: 0.0012 - mean_absolute_error: 0.0243
Epoch 35/200
0s - loss: 0.0012 - mean_absolute_error: 0.0257
Epoch 36/200
0s - loss: 0.0011 - mean_absolute_error: 0.0248
Epoch 37/200
0s - loss: 9.4390e-04 - mean_absolute_error: 0.0221
Epoch 38/200
0s - loss: 0.0012 - mean_absolute_error: 0.0237
Epoch 39/200
0s - loss: 0.0011 - mean_absolute_error: 0.0244
Epoch 40/200
0s - loss: 0.0011 - mean_absolute_error: 0.0237
Epoch 41/200
0s - loss: 9.9120e-04 - mean_absolute_error: 0.0224
Epoch 42/200
0s - loss: 0.0010 - mean_absolute_error: 0.0219
Epoch 43/200
0s - loss: 9.9448e-04 - mean_absolute_error: 0.0234
Epoch 44/200
0s - loss: 0.0010 - mean_absolute_error: 0.0246
Epoch 00043: early stopping
Out[37]:
<keras.callbacks.History at 0x7fc3289b9160>

In [38]:
y_pred = model.predict(X_test)
plt.plot(y_test)
plt.plot(y_pred)


Out[38]:
[<matplotlib.lines.Line2D at 0x7fc33c478278>]

LSTM on Windows


In [39]:
X_train_t = X_train.reshape(X_train.shape[0], 1, 12)
X_test_t = X_test.reshape(X_test.shape[0], 1, 12)

In [40]:
X_train_t.shape


Out[40]:
(228, 1, 12)

In [41]:
K.clear_session()
model = Sequential()

model.add(LSTM(6, 
               input_shape = (1, 12)))

model.add(Dense(1))

model.compile(optimizer = 'adam', 
              loss = 'mean_squared_error', 
              metrics = ['mae'])

In [42]:
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 6)                 456       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 7         
=================================================================
Total params: 463
Trainable params: 463
Non-trainable params: 0
_________________________________________________________________

In [43]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 10, 
                           verbose = 1)

In [44]:
model.fit(X_train_t, 
          y_train, 
          epochs = 100,
          batch_size = 1, 
          verbose = 2, 
          callbacks = [early_stop])


Epoch 1/100
0s - loss: 0.0311 - mean_absolute_error: 0.1329
Epoch 2/100
0s - loss: 0.0075 - mean_absolute_error: 0.0664
Epoch 3/100
0s - loss: 0.0061 - mean_absolute_error: 0.0582
Epoch 4/100
0s - loss: 0.0054 - mean_absolute_error: 0.0556
Epoch 5/100
0s - loss: 0.0053 - mean_absolute_error: 0.0553
Epoch 6/100
0s - loss: 0.0045 - mean_absolute_error: 0.0505
Epoch 7/100
0s - loss: 0.0041 - mean_absolute_error: 0.0497
Epoch 8/100
0s - loss: 0.0035 - mean_absolute_error: 0.0461
Epoch 9/100
0s - loss: 0.0031 - mean_absolute_error: 0.0435
Epoch 10/100
0s - loss: 0.0028 - mean_absolute_error: 0.0415
Epoch 11/100
0s - loss: 0.0026 - mean_absolute_error: 0.0399
Epoch 12/100
0s - loss: 0.0023 - mean_absolute_error: 0.0380
Epoch 13/100
0s - loss: 0.0022 - mean_absolute_error: 0.0367
Epoch 14/100
0s - loss: 0.0019 - mean_absolute_error: 0.0344
Epoch 15/100
0s - loss: 0.0019 - mean_absolute_error: 0.0344
Epoch 16/100
0s - loss: 0.0019 - mean_absolute_error: 0.0340
Epoch 17/100
0s - loss: 0.0016 - mean_absolute_error: 0.0314
Epoch 18/100
0s - loss: 0.0016 - mean_absolute_error: 0.0316
Epoch 19/100
0s - loss: 0.0014 - mean_absolute_error: 0.0283
Epoch 20/100
0s - loss: 0.0014 - mean_absolute_error: 0.0285
Epoch 21/100
0s - loss: 0.0014 - mean_absolute_error: 0.0292
Epoch 22/100
0s - loss: 0.0012 - mean_absolute_error: 0.0265
Epoch 23/100
0s - loss: 0.0013 - mean_absolute_error: 0.0276
Epoch 24/100
0s - loss: 0.0012 - mean_absolute_error: 0.0259
Epoch 25/100
0s - loss: 0.0012 - mean_absolute_error: 0.0263
Epoch 26/100
0s - loss: 0.0013 - mean_absolute_error: 0.0272
Epoch 27/100
0s - loss: 0.0012 - mean_absolute_error: 0.0253
Epoch 28/100
0s - loss: 0.0012 - mean_absolute_error: 0.0261
Epoch 29/100
0s - loss: 0.0012 - mean_absolute_error: 0.0260
Epoch 30/100
0s - loss: 0.0012 - mean_absolute_error: 0.0255
Epoch 31/100
0s - loss: 0.0012 - mean_absolute_error: 0.0266
Epoch 32/100
0s - loss: 0.0011 - mean_absolute_error: 0.0240
Epoch 33/100
0s - loss: 0.0011 - mean_absolute_error: 0.0241
Epoch 34/100
0s - loss: 0.0011 - mean_absolute_error: 0.0247
Epoch 35/100
0s - loss: 0.0011 - mean_absolute_error: 0.0240
Epoch 36/100
0s - loss: 0.0012 - mean_absolute_error: 0.0255
Epoch 37/100
0s - loss: 0.0012 - mean_absolute_error: 0.0247
Epoch 38/100
0s - loss: 9.9418e-04 - mean_absolute_error: 0.0232
Epoch 39/100
0s - loss: 9.8508e-04 - mean_absolute_error: 0.0238
Epoch 40/100
0s - loss: 0.0010 - mean_absolute_error: 0.0244
Epoch 41/100
0s - loss: 0.0011 - mean_absolute_error: 0.0255
Epoch 42/100
0s - loss: 9.1485e-04 - mean_absolute_error: 0.0227
Epoch 43/100
0s - loss: 9.7746e-04 - mean_absolute_error: 0.0226
Epoch 44/100
0s - loss: 9.2999e-04 - mean_absolute_error: 0.0231
Epoch 45/100
0s - loss: 0.0010 - mean_absolute_error: 0.0236
Epoch 46/100
0s - loss: 9.3826e-04 - mean_absolute_error: 0.0236
Epoch 47/100
0s - loss: 0.0010 - mean_absolute_error: 0.0244
Epoch 48/100
0s - loss: 0.0010 - mean_absolute_error: 0.0237
Epoch 49/100
0s - loss: 9.5745e-04 - mean_absolute_error: 0.0230
Epoch 50/100
0s - loss: 0.0010 - mean_absolute_error: 0.0234
Epoch 51/100
0s - loss: 9.4667e-04 - mean_absolute_error: 0.0234
Epoch 52/100
0s - loss: 9.6175e-04 - mean_absolute_error: 0.0230
Epoch 53/100
0s - loss: 0.0010 - mean_absolute_error: 0.0238
Epoch 00052: early stopping
Out[44]:
<keras.callbacks.History at 0x7fc32809b048>

In [45]:
y_pred = model.predict(X_test_t)
plt.plot(y_test)
plt.plot(y_pred)


Out[45]:
[<matplotlib.lines.Line2D at 0x7fc328028978>]

Exercise 1

In the model above we reshaped the input shape to: (num_samples, 1, 12), i.e. we treated a window of 12 months as a vector of 12 coordinates that we simultaneously passed to all the LSTM nodes. An alternative way to look at the problem is to reshape the input to (num_samples, 12, 1). This means we consider each input window as a sequence of 12 values that we will pass in sequence to the LSTM. In principle this looks like a more accurate description of our situation. But does it yield better predictions? Let's check it.

  • Reshape X_train and X_test so that they represent a set of univariate sequences
  • retrain the same LSTM(6) model, you'll have to adapt the input_shape
  • check the performance of this new model, is it better at predicting the test data?

In [46]:
X_train.shape, X_test.shape, y_train.shape, y_test.shape


Out[46]:
((228, 12), (61, 12), (228, 1), (61, 1))

In [47]:
print(X_train[0]) 
print(X_train[1]), 
print(y_train[0])


[ 0.20091289  0.13173822  0.11139526  0.09230917  0.12617398  0.12395846
  0.13514108  0.16362761  0.09531795  0.0704258   0.          0.01402033]
[ 0.03002688  0.20091289  0.13173822  0.11139526  0.09230917  0.12617398
  0.12395846  0.13514108  0.16362761  0.09531795  0.0704258   0.        ]
[ 0.03002688]

In [48]:
X_train = X_train.reshape(-1, 12, 1)
X_test = X_test.reshape(-1, 12, 1)

In [49]:
print(X_train[0])


[[ 0.20091289]
 [ 0.13173822]
 [ 0.11139526]
 [ 0.09230917]
 [ 0.12617398]
 [ 0.12395846]
 [ 0.13514108]
 [ 0.16362761]
 [ 0.09531795]
 [ 0.0704258 ]
 [ 0.        ]
 [ 0.01402033]]

In [50]:
X_train.shape, X_test.shape, y_train.shape, y_test.shape


Out[50]:
((228, 12, 1), (61, 12, 1), (228, 1), (61, 1))

In [51]:
from keras.models import Model
from keras.layers import Input, LSTM
import keras.backend as K

K.clear_session()

inp = Input(shape = (12, 1))

net = LSTM(units = 6)(inp)

prediction = Dense(units = 1)(net)

model = Model(inputs = inp, outputs = prediction)

model.compile(optimizer = 'adam', 
              loss = 'mean_squared_error', 
              metrics = ['mae'])

In [52]:
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 12, 1)             0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 6)                 192       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 7         
=================================================================
Total params: 199
Trainable params: 199
Non-trainable params: 0
_________________________________________________________________

In [53]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 10, 
                           verbose = 1)

In [54]:
model.fit(X_train, 
          y_train, 
          epochs = 500,
          batch_size = 20, 
          verbose = 2, 
          callbacks = [early_stop])


Epoch 1/500
0s - loss: 0.0516 - mean_absolute_error: 0.1899
Epoch 2/500
0s - loss: 0.0272 - mean_absolute_error: 0.1293
Epoch 3/500
0s - loss: 0.0133 - mean_absolute_error: 0.0888
Epoch 4/500
0s - loss: 0.0094 - mean_absolute_error: 0.0789
Epoch 5/500
0s - loss: 0.0091 - mean_absolute_error: 0.0779
Epoch 6/500
0s - loss: 0.0083 - mean_absolute_error: 0.0738
Epoch 7/500
0s - loss: 0.0077 - mean_absolute_error: 0.0697
Epoch 8/500
0s - loss: 0.0073 - mean_absolute_error: 0.0666
Epoch 9/500
0s - loss: 0.0069 - mean_absolute_error: 0.0640
Epoch 10/500
0s - loss: 0.0067 - mean_absolute_error: 0.0616
Epoch 11/500
0s - loss: 0.0064 - mean_absolute_error: 0.0597
Epoch 12/500
0s - loss: 0.0063 - mean_absolute_error: 0.0582
Epoch 13/500
0s - loss: 0.0062 - mean_absolute_error: 0.0576
Epoch 14/500
0s - loss: 0.0061 - mean_absolute_error: 0.0561
Epoch 15/500
0s - loss: 0.0061 - mean_absolute_error: 0.0557
Epoch 16/500
0s - loss: 0.0061 - mean_absolute_error: 0.0560
Epoch 17/500
0s - loss: 0.0060 - mean_absolute_error: 0.0550
Epoch 18/500
0s - loss: 0.0061 - mean_absolute_error: 0.0559
Epoch 19/500
0s - loss: 0.0059 - mean_absolute_error: 0.0552
Epoch 20/500
0s - loss: 0.0059 - mean_absolute_error: 0.0550
Epoch 21/500
0s - loss: 0.0060 - mean_absolute_error: 0.0548
Epoch 22/500
0s - loss: 0.0059 - mean_absolute_error: 0.0545
Epoch 23/500
0s - loss: 0.0059 - mean_absolute_error: 0.0554
Epoch 24/500
0s - loss: 0.0059 - mean_absolute_error: 0.0561
Epoch 25/500
0s - loss: 0.0059 - mean_absolute_error: 0.0544
Epoch 26/500
0s - loss: 0.0059 - mean_absolute_error: 0.0547
Epoch 27/500
0s - loss: 0.0058 - mean_absolute_error: 0.0550
Epoch 28/500
0s - loss: 0.0058 - mean_absolute_error: 0.0545
Epoch 29/500
0s - loss: 0.0058 - mean_absolute_error: 0.0542
Epoch 30/500
0s - loss: 0.0057 - mean_absolute_error: 0.0540
Epoch 31/500
0s - loss: 0.0057 - mean_absolute_error: 0.0539
Epoch 32/500
0s - loss: 0.0057 - mean_absolute_error: 0.0537
Epoch 33/500
0s - loss: 0.0057 - mean_absolute_error: 0.0545
Epoch 34/500
0s - loss: 0.0057 - mean_absolute_error: 0.0536
Epoch 35/500
0s - loss: 0.0056 - mean_absolute_error: 0.0534
Epoch 36/500
0s - loss: 0.0056 - mean_absolute_error: 0.0537
Epoch 37/500
0s - loss: 0.0056 - mean_absolute_error: 0.0534
Epoch 38/500
0s - loss: 0.0055 - mean_absolute_error: 0.0532
Epoch 39/500
0s - loss: 0.0056 - mean_absolute_error: 0.0534
Epoch 40/500
0s - loss: 0.0055 - mean_absolute_error: 0.0531
Epoch 41/500
0s - loss: 0.0055 - mean_absolute_error: 0.0528
Epoch 42/500
0s - loss: 0.0056 - mean_absolute_error: 0.0527
Epoch 43/500
0s - loss: 0.0055 - mean_absolute_error: 0.0532
Epoch 44/500
0s - loss: 0.0054 - mean_absolute_error: 0.0526
Epoch 45/500
0s - loss: 0.0055 - mean_absolute_error: 0.0524
Epoch 46/500
0s - loss: 0.0054 - mean_absolute_error: 0.0525
Epoch 47/500
0s - loss: 0.0054 - mean_absolute_error: 0.0528
Epoch 48/500
0s - loss: 0.0053 - mean_absolute_error: 0.0515
Epoch 49/500
0s - loss: 0.0053 - mean_absolute_error: 0.0520
Epoch 50/500
0s - loss: 0.0053 - mean_absolute_error: 0.0522
Epoch 51/500
0s - loss: 0.0053 - mean_absolute_error: 0.0515
Epoch 52/500
0s - loss: 0.0052 - mean_absolute_error: 0.0520
Epoch 53/500
0s - loss: 0.0052 - mean_absolute_error: 0.0516
Epoch 54/500
0s - loss: 0.0052 - mean_absolute_error: 0.0514
Epoch 55/500
0s - loss: 0.0052 - mean_absolute_error: 0.0514
Epoch 56/500
0s - loss: 0.0052 - mean_absolute_error: 0.0506
Epoch 57/500
0s - loss: 0.0051 - mean_absolute_error: 0.0506
Epoch 58/500
0s - loss: 0.0053 - mean_absolute_error: 0.0535
Epoch 59/500
0s - loss: 0.0052 - mean_absolute_error: 0.0510
Epoch 60/500
0s - loss: 0.0050 - mean_absolute_error: 0.0499
Epoch 61/500
0s - loss: 0.0051 - mean_absolute_error: 0.0517
Epoch 62/500
0s - loss: 0.0050 - mean_absolute_error: 0.0499
Epoch 63/500
0s - loss: 0.0050 - mean_absolute_error: 0.0502
Epoch 64/500
0s - loss: 0.0050 - mean_absolute_error: 0.0505
Epoch 65/500
0s - loss: 0.0049 - mean_absolute_error: 0.0497
Epoch 66/500
0s - loss: 0.0048 - mean_absolute_error: 0.0492
Epoch 67/500
0s - loss: 0.0049 - mean_absolute_error: 0.0506
Epoch 68/500
0s - loss: 0.0049 - mean_absolute_error: 0.0495
Epoch 69/500
0s - loss: 0.0048 - mean_absolute_error: 0.0491
Epoch 70/500
0s - loss: 0.0049 - mean_absolute_error: 0.0504
Epoch 71/500
0s - loss: 0.0049 - mean_absolute_error: 0.0487
Epoch 72/500
0s - loss: 0.0047 - mean_absolute_error: 0.0489
Epoch 73/500
0s - loss: 0.0047 - mean_absolute_error: 0.0490
Epoch 74/500
0s - loss: 0.0046 - mean_absolute_error: 0.0485
Epoch 75/500
0s - loss: 0.0046 - mean_absolute_error: 0.0484
Epoch 76/500
0s - loss: 0.0046 - mean_absolute_error: 0.0483
Epoch 77/500
0s - loss: 0.0046 - mean_absolute_error: 0.0479
Epoch 78/500
0s - loss: 0.0046 - mean_absolute_error: 0.0481
Epoch 79/500
0s - loss: 0.0045 - mean_absolute_error: 0.0476
Epoch 80/500
0s - loss: 0.0045 - mean_absolute_error: 0.0482
Epoch 81/500
0s - loss: 0.0045 - mean_absolute_error: 0.0471
Epoch 82/500
0s - loss: 0.0044 - mean_absolute_error: 0.0470
Epoch 83/500
0s - loss: 0.0044 - mean_absolute_error: 0.0469
Epoch 84/500
0s - loss: 0.0044 - mean_absolute_error: 0.0472
Epoch 85/500
0s - loss: 0.0044 - mean_absolute_error: 0.0470
Epoch 86/500
0s - loss: 0.0043 - mean_absolute_error: 0.0463
Epoch 87/500
0s - loss: 0.0043 - mean_absolute_error: 0.0468
Epoch 88/500
0s - loss: 0.0044 - mean_absolute_error: 0.0466
Epoch 89/500
0s - loss: 0.0043 - mean_absolute_error: 0.0464
Epoch 90/500
0s - loss: 0.0042 - mean_absolute_error: 0.0461
Epoch 91/500
0s - loss: 0.0042 - mean_absolute_error: 0.0461
Epoch 92/500
0s - loss: 0.0042 - mean_absolute_error: 0.0457
Epoch 93/500
0s - loss: 0.0041 - mean_absolute_error: 0.0454
Epoch 94/500
0s - loss: 0.0041 - mean_absolute_error: 0.0450
Epoch 95/500
0s - loss: 0.0041 - mean_absolute_error: 0.0458
Epoch 96/500
0s - loss: 0.0041 - mean_absolute_error: 0.0451
Epoch 97/500
0s - loss: 0.0040 - mean_absolute_error: 0.0442
Epoch 98/500
0s - loss: 0.0040 - mean_absolute_error: 0.0450
Epoch 99/500
0s - loss: 0.0039 - mean_absolute_error: 0.0442
Epoch 100/500
0s - loss: 0.0039 - mean_absolute_error: 0.0440
Epoch 101/500
0s - loss: 0.0040 - mean_absolute_error: 0.0441
Epoch 102/500
0s - loss: 0.0038 - mean_absolute_error: 0.0435
Epoch 103/500
0s - loss: 0.0038 - mean_absolute_error: 0.0436
Epoch 104/500
0s - loss: 0.0038 - mean_absolute_error: 0.0431
Epoch 105/500
0s - loss: 0.0038 - mean_absolute_error: 0.0435
Epoch 106/500
0s - loss: 0.0037 - mean_absolute_error: 0.0428
Epoch 107/500
0s - loss: 0.0037 - mean_absolute_error: 0.0426
Epoch 108/500
0s - loss: 0.0036 - mean_absolute_error: 0.0425
Epoch 109/500
0s - loss: 0.0036 - mean_absolute_error: 0.0424
Epoch 110/500
0s - loss: 0.0036 - mean_absolute_error: 0.0425
Epoch 111/500
0s - loss: 0.0036 - mean_absolute_error: 0.0418
Epoch 112/500
0s - loss: 0.0035 - mean_absolute_error: 0.0414
Epoch 113/500
0s - loss: 0.0035 - mean_absolute_error: 0.0418
Epoch 114/500
0s - loss: 0.0035 - mean_absolute_error: 0.0412
Epoch 115/500
0s - loss: 0.0034 - mean_absolute_error: 0.0410
Epoch 116/500
0s - loss: 0.0034 - mean_absolute_error: 0.0406
Epoch 117/500
0s - loss: 0.0034 - mean_absolute_error: 0.0408
Epoch 118/500
0s - loss: 0.0033 - mean_absolute_error: 0.0402
Epoch 119/500
0s - loss: 0.0033 - mean_absolute_error: 0.0397
Epoch 120/500
0s - loss: 0.0033 - mean_absolute_error: 0.0399
Epoch 121/500
0s - loss: 0.0032 - mean_absolute_error: 0.0395
Epoch 122/500
0s - loss: 0.0032 - mean_absolute_error: 0.0396
Epoch 123/500
0s - loss: 0.0032 - mean_absolute_error: 0.0393
Epoch 124/500
0s - loss: 0.0031 - mean_absolute_error: 0.0389
Epoch 125/500
0s - loss: 0.0031 - mean_absolute_error: 0.0387
Epoch 126/500
0s - loss: 0.0031 - mean_absolute_error: 0.0384
Epoch 127/500
0s - loss: 0.0031 - mean_absolute_error: 0.0386
Epoch 128/500
0s - loss: 0.0031 - mean_absolute_error: 0.0385
Epoch 129/500
0s - loss: 0.0030 - mean_absolute_error: 0.0376
Epoch 130/500
0s - loss: 0.0029 - mean_absolute_error: 0.0378
Epoch 131/500
0s - loss: 0.0030 - mean_absolute_error: 0.0380
Epoch 132/500
0s - loss: 0.0029 - mean_absolute_error: 0.0371
Epoch 133/500
0s - loss: 0.0028 - mean_absolute_error: 0.0367
Epoch 134/500
0s - loss: 0.0028 - mean_absolute_error: 0.0363
Epoch 135/500
0s - loss: 0.0029 - mean_absolute_error: 0.0371
Epoch 136/500
0s - loss: 0.0028 - mean_absolute_error: 0.0367
Epoch 137/500
0s - loss: 0.0027 - mean_absolute_error: 0.0359
Epoch 138/500
0s - loss: 0.0027 - mean_absolute_error: 0.0357
Epoch 139/500
0s - loss: 0.0027 - mean_absolute_error: 0.0360
Epoch 140/500
0s - loss: 0.0026 - mean_absolute_error: 0.0349
Epoch 141/500
0s - loss: 0.0026 - mean_absolute_error: 0.0348
Epoch 142/500
0s - loss: 0.0026 - mean_absolute_error: 0.0349
Epoch 143/500
0s - loss: 0.0025 - mean_absolute_error: 0.0341
Epoch 144/500
0s - loss: 0.0025 - mean_absolute_error: 0.0340
Epoch 145/500
0s - loss: 0.0024 - mean_absolute_error: 0.0338
Epoch 146/500
0s - loss: 0.0024 - mean_absolute_error: 0.0338
Epoch 147/500
0s - loss: 0.0024 - mean_absolute_error: 0.0336
Epoch 148/500
0s - loss: 0.0023 - mean_absolute_error: 0.0333
Epoch 149/500
0s - loss: 0.0023 - mean_absolute_error: 0.0331
Epoch 150/500
0s - loss: 0.0023 - mean_absolute_error: 0.0332
Epoch 151/500
0s - loss: 0.0022 - mean_absolute_error: 0.0330
Epoch 152/500
0s - loss: 0.0022 - mean_absolute_error: 0.0323
Epoch 153/500
0s - loss: 0.0022 - mean_absolute_error: 0.0321
Epoch 154/500
0s - loss: 0.0021 - mean_absolute_error: 0.0320
Epoch 155/500
0s - loss: 0.0021 - mean_absolute_error: 0.0316
Epoch 156/500
0s - loss: 0.0021 - mean_absolute_error: 0.0314
Epoch 157/500
0s - loss: 0.0020 - mean_absolute_error: 0.0313
Epoch 158/500
0s - loss: 0.0020 - mean_absolute_error: 0.0310
Epoch 159/500
0s - loss: 0.0020 - mean_absolute_error: 0.0310
Epoch 160/500
0s - loss: 0.0019 - mean_absolute_error: 0.0305
Epoch 161/500
0s - loss: 0.0019 - mean_absolute_error: 0.0303
Epoch 162/500
0s - loss: 0.0018 - mean_absolute_error: 0.0298
Epoch 163/500
0s - loss: 0.0018 - mean_absolute_error: 0.0299
Epoch 164/500
0s - loss: 0.0018 - mean_absolute_error: 0.0295
Epoch 165/500
0s - loss: 0.0018 - mean_absolute_error: 0.0302
Epoch 166/500
0s - loss: 0.0018 - mean_absolute_error: 0.0296
Epoch 167/500
0s - loss: 0.0017 - mean_absolute_error: 0.0289
Epoch 168/500
0s - loss: 0.0017 - mean_absolute_error: 0.0287
Epoch 169/500
0s - loss: 0.0017 - mean_absolute_error: 0.0293
Epoch 170/500
0s - loss: 0.0017 - mean_absolute_error: 0.0288
Epoch 171/500
0s - loss: 0.0016 - mean_absolute_error: 0.0278
Epoch 172/500
0s - loss: 0.0016 - mean_absolute_error: 0.0286
Epoch 173/500
0s - loss: 0.0016 - mean_absolute_error: 0.0285
Epoch 174/500
0s - loss: 0.0016 - mean_absolute_error: 0.0290
Epoch 175/500
0s - loss: 0.0016 - mean_absolute_error: 0.0283
Epoch 176/500
0s - loss: 0.0015 - mean_absolute_error: 0.0275
Epoch 177/500
0s - loss: 0.0014 - mean_absolute_error: 0.0267
Epoch 178/500
0s - loss: 0.0014 - mean_absolute_error: 0.0267
Epoch 179/500
0s - loss: 0.0014 - mean_absolute_error: 0.0270
Epoch 180/500
0s - loss: 0.0014 - mean_absolute_error: 0.0263
Epoch 181/500
0s - loss: 0.0013 - mean_absolute_error: 0.0262
Epoch 182/500
0s - loss: 0.0013 - mean_absolute_error: 0.0265
Epoch 183/500
0s - loss: 0.0013 - mean_absolute_error: 0.0259
Epoch 184/500
0s - loss: 0.0013 - mean_absolute_error: 0.0258
Epoch 185/500
0s - loss: 0.0013 - mean_absolute_error: 0.0259
Epoch 186/500
0s - loss: 0.0013 - mean_absolute_error: 0.0256
Epoch 187/500
0s - loss: 0.0013 - mean_absolute_error: 0.0255
Epoch 188/500
0s - loss: 0.0013 - mean_absolute_error: 0.0265
Epoch 189/500
0s - loss: 0.0013 - mean_absolute_error: 0.0252
Epoch 190/500
0s - loss: 0.0012 - mean_absolute_error: 0.0249
Epoch 191/500
0s - loss: 0.0012 - mean_absolute_error: 0.0252
Epoch 192/500
0s - loss: 0.0012 - mean_absolute_error: 0.0252
Epoch 193/500
0s - loss: 0.0012 - mean_absolute_error: 0.0261
Epoch 194/500
0s - loss: 0.0011 - mean_absolute_error: 0.0243
Epoch 195/500
0s - loss: 0.0011 - mean_absolute_error: 0.0243
Epoch 196/500
0s - loss: 0.0011 - mean_absolute_error: 0.0246
Epoch 197/500
0s - loss: 0.0011 - mean_absolute_error: 0.0241
Epoch 198/500
0s - loss: 0.0011 - mean_absolute_error: 0.0240
Epoch 199/500
0s - loss: 0.0011 - mean_absolute_error: 0.0238
Epoch 200/500
0s - loss: 0.0011 - mean_absolute_error: 0.0234
Epoch 201/500
0s - loss: 0.0011 - mean_absolute_error: 0.0251
Epoch 202/500
0s - loss: 0.0012 - mean_absolute_error: 0.0240
Epoch 203/500
0s - loss: 0.0012 - mean_absolute_error: 0.0255
Epoch 204/500
0s - loss: 0.0011 - mean_absolute_error: 0.0232
Epoch 205/500
0s - loss: 0.0010 - mean_absolute_error: 0.0235
Epoch 206/500
0s - loss: 0.0010 - mean_absolute_error: 0.0230
Epoch 207/500
0s - loss: 0.0010 - mean_absolute_error: 0.0229
Epoch 208/500
0s - loss: 0.0010 - mean_absolute_error: 0.0230
Epoch 209/500
0s - loss: 0.0010 - mean_absolute_error: 0.0227
Epoch 210/500
0s - loss: 0.0010 - mean_absolute_error: 0.0236
Epoch 211/500
0s - loss: 0.0010 - mean_absolute_error: 0.0226
Epoch 212/500
0s - loss: 0.0010 - mean_absolute_error: 0.0224
Epoch 213/500
0s - loss: 0.0010 - mean_absolute_error: 0.0226
Epoch 214/500
0s - loss: 0.0010 - mean_absolute_error: 0.0229
Epoch 215/500
0s - loss: 0.0010 - mean_absolute_error: 0.0230
Epoch 216/500
0s - loss: 0.0010 - mean_absolute_error: 0.0228
Epoch 217/500
0s - loss: 0.0010 - mean_absolute_error: 0.0234
Epoch 218/500
0s - loss: 9.8737e-04 - mean_absolute_error: 0.0226
Epoch 219/500
0s - loss: 9.8631e-04 - mean_absolute_error: 0.0228
Epoch 220/500
0s - loss: 0.0010 - mean_absolute_error: 0.0224
Epoch 221/500
0s - loss: 0.0010 - mean_absolute_error: 0.0229
Epoch 222/500
0s - loss: 0.0010 - mean_absolute_error: 0.0227
Epoch 223/500
0s - loss: 0.0010 - mean_absolute_error: 0.0228
Epoch 224/500
0s - loss: 9.8470e-04 - mean_absolute_error: 0.0228
Epoch 225/500
0s - loss: 9.9981e-04 - mean_absolute_error: 0.0226
Epoch 226/500
0s - loss: 9.8067e-04 - mean_absolute_error: 0.0221
Epoch 227/500
0s - loss: 9.7203e-04 - mean_absolute_error: 0.0226
Epoch 228/500
0s - loss: 0.0010 - mean_absolute_error: 0.0220
Epoch 229/500
0s - loss: 0.0010 - mean_absolute_error: 0.0232
Epoch 230/500
0s - loss: 0.0010 - mean_absolute_error: 0.0227
Epoch 231/500
0s - loss: 0.0010 - mean_absolute_error: 0.0237
Epoch 232/500
0s - loss: 0.0010 - mean_absolute_error: 0.0229
Epoch 233/500
0s - loss: 9.9115e-04 - mean_absolute_error: 0.0227
Epoch 234/500
0s - loss: 9.7420e-04 - mean_absolute_error: 0.0220
Epoch 235/500
0s - loss: 0.0010 - mean_absolute_error: 0.0225
Epoch 236/500
0s - loss: 9.4861e-04 - mean_absolute_error: 0.0220
Epoch 237/500
0s - loss: 9.6354e-04 - mean_absolute_error: 0.0220
Epoch 238/500
0s - loss: 9.6226e-04 - mean_absolute_error: 0.0225
Epoch 239/500
0s - loss: 9.6054e-04 - mean_absolute_error: 0.0220
Epoch 240/500
0s - loss: 9.9983e-04 - mean_absolute_error: 0.0235
Epoch 241/500
0s - loss: 9.9843e-04 - mean_absolute_error: 0.0225
Epoch 242/500
0s - loss: 9.4758e-04 - mean_absolute_error: 0.0221
Epoch 243/500
0s - loss: 9.3898e-04 - mean_absolute_error: 0.0220
Epoch 244/500
0s - loss: 9.5198e-04 - mean_absolute_error: 0.0219
Epoch 245/500
0s - loss: 9.3955e-04 - mean_absolute_error: 0.0222
Epoch 246/500
0s - loss: 9.8272e-04 - mean_absolute_error: 0.0220
Epoch 247/500
0s - loss: 0.0010 - mean_absolute_error: 0.0237
Epoch 248/500
0s - loss: 9.8424e-04 - mean_absolute_error: 0.0220
Epoch 249/500
0s - loss: 9.5396e-04 - mean_absolute_error: 0.0224
Epoch 250/500
0s - loss: 9.6497e-04 - mean_absolute_error: 0.0217
Epoch 251/500
0s - loss: 9.3653e-04 - mean_absolute_error: 0.0220
Epoch 252/500
0s - loss: 9.5327e-04 - mean_absolute_error: 0.0218
Epoch 253/500
0s - loss: 9.5205e-04 - mean_absolute_error: 0.0225
Epoch 254/500
0s - loss: 9.6633e-04 - mean_absolute_error: 0.0220
Epoch 255/500
0s - loss: 9.7571e-04 - mean_absolute_error: 0.0228
Epoch 256/500
0s - loss: 9.3139e-04 - mean_absolute_error: 0.0217
Epoch 257/500
0s - loss: 9.5887e-04 - mean_absolute_error: 0.0225
Epoch 258/500
0s - loss: 9.3117e-04 - mean_absolute_error: 0.0217
Epoch 259/500
0s - loss: 9.4372e-04 - mean_absolute_error: 0.0222
Epoch 260/500
0s - loss: 9.1837e-04 - mean_absolute_error: 0.0218
Epoch 261/500
0s - loss: 9.2537e-04 - mean_absolute_error: 0.0217
Epoch 262/500
0s - loss: 9.3973e-04 - mean_absolute_error: 0.0219
Epoch 263/500
0s - loss: 9.1984e-04 - mean_absolute_error: 0.0216
Epoch 264/500
0s - loss: 9.1883e-04 - mean_absolute_error: 0.0215
Epoch 265/500
0s - loss: 9.2773e-04 - mean_absolute_error: 0.0218
Epoch 266/500
0s - loss: 9.1896e-04 - mean_absolute_error: 0.0217
Epoch 267/500
0s - loss: 9.1729e-04 - mean_absolute_error: 0.0216
Epoch 268/500
0s - loss: 9.1776e-04 - mean_absolute_error: 0.0220
Epoch 269/500
0s - loss: 9.1471e-04 - mean_absolute_error: 0.0216
Epoch 270/500
0s - loss: 9.2553e-04 - mean_absolute_error: 0.0215
Epoch 271/500
0s - loss: 9.2183e-04 - mean_absolute_error: 0.0217
Epoch 272/500
0s - loss: 9.1519e-04 - mean_absolute_error: 0.0217
Epoch 273/500
0s - loss: 9.2000e-04 - mean_absolute_error: 0.0221
Epoch 274/500
0s - loss: 9.1139e-04 - mean_absolute_error: 0.0216
Epoch 275/500
0s - loss: 9.2973e-04 - mean_absolute_error: 0.0220
Epoch 276/500
0s - loss: 9.1196e-04 - mean_absolute_error: 0.0216
Epoch 277/500
0s - loss: 9.1467e-04 - mean_absolute_error: 0.0213
Epoch 278/500
0s - loss: 9.2041e-04 - mean_absolute_error: 0.0220
Epoch 279/500
0s - loss: 9.2249e-04 - mean_absolute_error: 0.0218
Epoch 280/500
0s - loss: 9.0582e-04 - mean_absolute_error: 0.0217
Epoch 281/500
0s - loss: 9.0607e-04 - mean_absolute_error: 0.0214
Epoch 282/500
0s - loss: 9.1526e-04 - mean_absolute_error: 0.0217
Epoch 283/500
0s - loss: 9.2272e-04 - mean_absolute_error: 0.0217
Epoch 284/500
0s - loss: 9.3647e-04 - mean_absolute_error: 0.0221
Epoch 285/500
0s - loss: 9.2545e-04 - mean_absolute_error: 0.0222
Epoch 286/500
0s - loss: 9.4039e-04 - mean_absolute_error: 0.0216
Epoch 287/500
0s - loss: 9.0460e-04 - mean_absolute_error: 0.0220
Epoch 288/500
0s - loss: 9.2670e-04 - mean_absolute_error: 0.0214
Epoch 289/500
0s - loss: 9.5000e-04 - mean_absolute_error: 0.0220
Epoch 290/500
0s - loss: 9.1729e-04 - mean_absolute_error: 0.0218
Epoch 291/500
0s - loss: 9.6373e-04 - mean_absolute_error: 0.0219
Epoch 292/500
0s - loss: 9.7583e-04 - mean_absolute_error: 0.0235
Epoch 293/500
0s - loss: 9.2030e-04 - mean_absolute_error: 0.0216
Epoch 294/500
0s - loss: 8.9178e-04 - mean_absolute_error: 0.0215
Epoch 295/500
0s - loss: 8.9917e-04 - mean_absolute_error: 0.0213
Epoch 296/500
0s - loss: 9.0806e-04 - mean_absolute_error: 0.0217
Epoch 297/500
0s - loss: 9.1725e-04 - mean_absolute_error: 0.0214
Epoch 298/500
0s - loss: 9.1876e-04 - mean_absolute_error: 0.0216
Epoch 299/500
0s - loss: 9.0530e-04 - mean_absolute_error: 0.0214
Epoch 300/500
0s - loss: 9.0445e-04 - mean_absolute_error: 0.0219
Epoch 301/500
0s - loss: 9.1139e-04 - mean_absolute_error: 0.0215
Epoch 302/500
0s - loss: 9.2365e-04 - mean_absolute_error: 0.0217
Epoch 303/500
0s - loss: 9.1059e-04 - mean_absolute_error: 0.0212
Epoch 304/500
0s - loss: 9.1672e-04 - mean_absolute_error: 0.0221
Epoch 305/500
0s - loss: 8.9757e-04 - mean_absolute_error: 0.0217
Epoch 00304: early stopping
Out[54]:
<keras.callbacks.History at 0x7fc30b7810f0>

In [55]:
y_pred = model.predict(X_test)
plt.plot(y_test)
plt.plot(y_pred)


Out[55]:
[<matplotlib.lines.Line2D at 0x7fc30b70a5c0>]

Exercise 2

RNN models can be applied to images too. In general we can apply them to any data where there's a connnection between nearby units. Let's see how we can easily build a model that works with images.

  • Load the MNIST data, by now you should be able to do it blindfolded :)
  • reshape it so that an image looks like a long sequence of pixels
  • create a recurrent model and train it on the training data
  • how does it perform compared to a fully connected? How does it compare to Convolutional Neural Networks?

(feel free to run this exercise on a cloud GPU if it's too slow on your laptop)


In [56]:
from keras.datasets import mnist

In [57]:
(X_train, Y_train), (X_test, Y_test) = mnist.load_data(path = 'mnist.npz')

In [58]:
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# Regularization
X_train /= 255.0
X_test /= 255.0

In [59]:
from keras.utils import to_categorical

In [60]:
Y_train.shape


Out[60]:
(60000,)

In [61]:
Y_train_cat = to_categorical(Y_train)
Y_test_cat = to_categorical(Y_test)

In [62]:
Y_train_cat.shape, Y_test_cat.shape


Out[62]:
((60000, 10), (10000, 10))

In [63]:
X_train = X_train.reshape(X_train.shape[0], -1, 1)
X_test = X_test.reshape(X_test.shape[0], -1, 1)

In [64]:
X_train.shape, X_test.shape


Out[64]:
((60000, 784, 1), (10000, 784, 1))

In [65]:
from keras.models import Model
from keras.layers import Input, LSTM, Dense
import keras.backend as K

In [66]:
K.clear_session()

In [67]:
inp = Input(shape = X_train.shape[1:])

In [68]:
net = LSTM(units = 32)(inp)
prediction = Dense(units = 10, 
                   activation = 'softmax')(net)

model = Model(inputs = inp, 
              outputs = prediction)
model.compile(optimizer = 'adam', 
              loss = 'categorical_crossentropy', 
              metrics = ['accuracy'])

In [69]:
model.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 784, 1)            0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 32)                4352      
_________________________________________________________________
dense_1 (Dense)              (None, 10)                330       
=================================================================
Total params: 4,682
Trainable params: 4,682
Non-trainable params: 0
_________________________________________________________________

In [ ]:
early_stop = EarlyStopping(monitor = 'loss', 
                           patience = 1, 
                           verbose = 1)

In [ ]:
model.fit(X_train, 
          Y_train_cat, 
          epochs = 2,
          batch_size = 1000,
          validation_split = 0.3,
          verbose = 1, 
          callbacks = [early_stop])


Train on 42000 samples, validate on 18000 samples
Epoch 1/2
42000/42000 [==============================] - 395s - loss: 2.2995 - acc: 0.1183 - val_loss: 2.2751 - val_acc: 0.1223
Epoch 2/2
41000/42000 [============================>.] - ETA: 7s - loss: 2.1940 - acc: 0.2033  

In [ ]:
model.evaluate(X_test, Y_test_cat)