├── README.md ├── data_functions.py ├── models.py └── es_rnn_example.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # ES-RNN-Pytorch 2 | 3 | # Overview 4 | This is a work in progress Pytorch implementation of the recently proposed ES-RNN by Slawek Smyl, winner of the M4 competition. 5 | 6 | ## Progress: 7 | 8 | - [x] Implement Single Series Model based on Additive season and level in Pytorch 9 | - [x] Implement toy datset, and Pytorch data functions 10 | - [x] Test and Debug SSM on Toy Dataset 11 | - [ ] Implemente multiplicative season and trend 12 | - [ ] Implement Multi Series Model with shared Trend LSTM 13 | - [ ] Implement Multi Series Multi Output Model 14 | - [ ] Compare performance on benchmark dataset 15 | -------------------------------------------------------------------------------- /data_functions.py: -------------------------------------------------------------------------------- 1 | #Dataset with random shuffeling: We have to check, that seasonality gets shifted apropriatly 2 | 3 | import numpy as np 4 | import pandas as pd 5 | 6 | import random 7 | from torch.utils.data import Dataset,sampler,DataLoader 8 | import torch 9 | import torch.nn as nn 10 | from tqdm import tqdm 11 | 12 | 13 | class sequence_labeling_dataset(Dataset): 14 | 15 | def __init__(self, input,max_size=100,sequence_labeling=True,seasonality=12,out_preds=12): 16 | 17 | self.data=input 18 | self.max_size=max_size 19 | self.sequence_labeling=sequence_labeling 20 | self.seasonality=seasonality 21 | self.out_preds=out_preds 22 | 23 | def __len__(self): 24 | 25 | return int(10000) 26 | 27 | def __getitem__(self, index): 28 | 29 | data_i=self.data 30 | 31 | #we randomly shift the inputs to create more data 32 | if len(data_i)>self.max_size: 33 | max_rand_int=len(data_i)-self.max_size 34 | #take a random start integer 35 | start_int=random.randint(0,max_rand_int) 36 | data_i=data_i[start_int:(start_int+self.max_size)] 37 | else: 38 | start_int=0 39 | 40 | 41 | inp=np.array(data_i[:-self.out_preds]) 42 | 43 | 44 | if self.sequence_labeling==True: 45 | #in case of sequence labeling, we shift the input by the range to output 46 | out=np.array(data_i[self.out_preds:]) 47 | else: 48 | #in case of sequnec classification we return only the last n elements we 49 | #need in the forecast 50 | out=np.array(data_i[-self.out_preds:]) 51 | 52 | #This defines, how much we have to shift the season 53 | shift_steps=start_int%self.seasonality 54 | 55 | return inp, out,shift_steps 56 | -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | import random 5 | from torch.utils.data import Dataset,sampler,DataLoader 6 | import torch 7 | import torch.nn as nn 8 | import pandas as pd 9 | from tqdm import tqdm 10 | 11 | class holt_winters_no_trend(torch.nn.Module): 12 | 13 | def __init__(self,init_a=0.1,init_g=0.1,slen=12): 14 | 15 | super(holt_winters_no_trend, self).__init__() 16 | 17 | #Smoothing parameters 18 | self.alpha=torch.nn.Parameter(torch.tensor(init_a)) 19 | self.gamma=torch.nn.Parameter(torch.tensor(init_g)) 20 | 21 | #init parameters 22 | self.init_season=torch.nn.Parameter(torch.tensor(np.random.random(size=slen))) 23 | 24 | #season legnth used to pick appropriate past season step 25 | self.slen=slen 26 | 27 | #Sigmoid used to norm the params to be betweeen 0 and 1 if needed 28 | self.sig=nn.Sigmoid() 29 | 30 | def forward(self,series ,series_shifts,n_preds=12,rv=False): 31 | 32 | #Get Batch size 33 | batch_size=series.shape[0] 34 | 35 | #Get the initial seasonality parameter 36 | init_season_batch=self.init_season.repeat(batch_size).view(batch_size,-1) 37 | 38 | #We use roll to Allow for our random input shifts. 39 | seasonals=torch.stack([torch.roll(j,int(rol)) for j,rol in zip(init_season_batch,series_shifts)]).float() 40 | 41 | #It has to be a list such that we dont need inplace tensor changes. 42 | seasonals=list(torch.split(seasonals,1,dim=1)) 43 | seasonals=[x.squeeze() for x in seasonals] 44 | 45 | #Now We loop over the input in each forward step 46 | result = [] 47 | 48 | #rv can be used for decomposing a series./normalizing in case of ES-RNN 49 | if rv==True: 50 | value_list=[] 51 | season_list=[] 52 | 53 | 54 | for i in range(series.shape[1]+n_preds): 55 | 56 | #0th step we init the parameter 57 | if i == 0: 58 | 59 | smooth = series[:,0] 60 | value_list.append(smooth) 61 | season_list.append(seasonals[i%self.slen]) 62 | result.append(series[:,0]) 63 | 64 | continue 65 | 66 | #smoothing 67 | #its smaller here, so smoothing is only for one less than the input? 68 | if i " 112 | ] 113 | }, 114 | "metadata": {}, 115 | "output_type": "display_data" 116 | } 117 | ], 118 | "source": [ 119 | "#Initial Prediction \n", 120 | "\n", 121 | "overall_loss=[]\n", 122 | "batch=next(iter(test_dl))\n", 123 | "inp=batch[0].float()#.unsqueeze(2)\n", 124 | "out=batch[1].float()#.unsqueeze(2).float()\n", 125 | "shifts=batch[2].numpy()\n", 126 | "pred=hw(inp,shifts)\n", 127 | "plt.plot(torch.cat([inp[0],out[0,:]]).detach().numpy(),\"g\")\n", 128 | "plt.plot(torch.cat([inp[0],pred[0,:]]).detach().numpy(),\"r\")\n", 129 | "plt.show()" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 14, 135 | "metadata": {}, 136 | "outputs": [ 137 | { 138 | "data": { 139 | "text/plain": [ 140 | "tensor(2.9005, grad_fn=)" 141 | ] 142 | }, 143 | "execution_count": 14, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "#Initial Loss RMSE \n", 150 | "(torch.mean((pred-out)**2))**(1/2)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 15, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "data": { 160 | "text/plain": [ 161 | "tensor(9.5917)" 162 | ] 163 | }, 164 | "execution_count": 15, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "#Baseline Loss Predicting last value at each step\n", 171 | "(torch.mean((inp[0][-1]-out)**2))**(1/2)" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 16, 177 | "metadata": { 178 | "collapsed": true 179 | }, 180 | "outputs": [], 181 | "source": [ 182 | "overall_loss_train=[]\n", 183 | "overall_loss=[]" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 12, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "name": "stderr", 193 | "output_type": "stream", 194 | "text": [ 195 | " 1%| | 1/100 [00:02<03:27, 2.10s/it]" 196 | ] 197 | }, 198 | { 199 | "name": "stdout", 200 | "output_type": "stream", 201 | "text": [ 202 | "6.8607206\n", 203 | "7.3957877\n" 204 | ] 205 | }, 206 | { 207 | "name": "stderr", 208 | "output_type": "stream", 209 | "text": [ 210 | "\r", 211 | " 2%|▏ | 2/100 [00:04<03:25, 2.10s/it]" 212 | ] 213 | }, 214 | { 215 | "name": "stdout", 216 | "output_type": "stream", 217 | "text": [ 218 | "4.0958314\n", 219 | "4.4489546\n" 220 | ] 221 | }, 222 | { 223 | "name": "stderr", 224 | "output_type": "stream", 225 | "text": [ 226 | "\r", 227 | " 3%|▎ | 3/100 [00:06<03:22, 2.09s/it]" 228 | ] 229 | }, 230 | { 231 | "name": "stdout", 232 | "output_type": "stream", 233 | "text": [ 234 | "2.9072347\n", 235 | "1.7616297\n" 236 | ] 237 | }, 238 | { 239 | "name": "stderr", 240 | "output_type": "stream", 241 | "text": [ 242 | "\r", 243 | " 4%|▍ | 4/100 [00:08<03:21, 2.10s/it]" 244 | ] 245 | }, 246 | { 247 | "name": "stdout", 248 | "output_type": "stream", 249 | "text": [ 250 | "2.90861\n", 251 | "0.27803552\n" 252 | ] 253 | }, 254 | { 255 | "name": "stderr", 256 | "output_type": "stream", 257 | "text": [ 258 | "\r", 259 | " 5%|▌ | 5/100 [00:10<03:17, 2.08s/it]" 260 | ] 261 | }, 262 | { 263 | "name": "stdout", 264 | "output_type": "stream", 265 | "text": [ 266 | "2.8909032\n", 267 | "0.07848331\n" 268 | ] 269 | }, 270 | { 271 | "name": "stderr", 272 | "output_type": "stream", 273 | "text": [ 274 | "\r", 275 | " 6%|▌ | 6/100 [00:12<03:14, 2.07s/it]" 276 | ] 277 | }, 278 | { 279 | "name": "stdout", 280 | "output_type": "stream", 281 | "text": [ 282 | "2.9040785\n", 283 | "0.025534514\n" 284 | ] 285 | }, 286 | { 287 | "name": "stderr", 288 | "output_type": "stream", 289 | "text": [ 290 | "\r", 291 | " 7%|▋ | 7/100 [00:14<03:11, 2.06s/it]" 292 | ] 293 | }, 294 | { 295 | "name": "stdout", 296 | "output_type": "stream", 297 | "text": [ 298 | "2.9152913\n", 299 | "0.02120905\n" 300 | ] 301 | }, 302 | { 303 | "name": "stderr", 304 | "output_type": "stream", 305 | "text": [ 306 | "\r", 307 | " 8%|▊ | 8/100 [00:16<03:08, 2.05s/it]" 308 | ] 309 | }, 310 | { 311 | "name": "stdout", 312 | "output_type": "stream", 313 | "text": [ 314 | "2.9007642\n", 315 | "0.015477379\n" 316 | ] 317 | }, 318 | { 319 | "name": "stderr", 320 | "output_type": "stream", 321 | "text": [ 322 | "\r", 323 | " 9%|▉ | 9/100 [00:18<03:05, 2.03s/it]" 324 | ] 325 | }, 326 | { 327 | "name": "stdout", 328 | "output_type": "stream", 329 | "text": [ 330 | "2.903886\n", 331 | "0.013104449\n" 332 | ] 333 | }, 334 | { 335 | "name": "stderr", 336 | "output_type": "stream", 337 | "text": [ 338 | "\r", 339 | " 10%|█ | 10/100 [00:20<03:03, 2.04s/it]" 340 | ] 341 | }, 342 | { 343 | "name": "stdout", 344 | "output_type": "stream", 345 | "text": [ 346 | "2.9012113\n", 347 | "0.01664723\n" 348 | ] 349 | }, 350 | { 351 | "name": "stderr", 352 | "output_type": "stream", 353 | "text": [ 354 | "\r", 355 | " 11%|█ | 11/100 [00:22<03:00, 2.03s/it]" 356 | ] 357 | }, 358 | { 359 | "name": "stdout", 360 | "output_type": "stream", 361 | "text": [ 362 | "2.9098902\n", 363 | "0.013082137\n" 364 | ] 365 | }, 366 | { 367 | "name": "stderr", 368 | "output_type": "stream", 369 | "text": [ 370 | "\r", 371 | " 12%|█▏ | 12/100 [00:24<02:58, 2.03s/it]" 372 | ] 373 | }, 374 | { 375 | "name": "stdout", 376 | "output_type": "stream", 377 | "text": [ 378 | "2.9086177\n", 379 | "0.013396879\n" 380 | ] 381 | }, 382 | { 383 | "name": "stderr", 384 | "output_type": "stream", 385 | "text": [ 386 | "\r", 387 | " 13%|█▎ | 13/100 [00:26<02:58, 2.05s/it]" 388 | ] 389 | }, 390 | { 391 | "name": "stdout", 392 | "output_type": "stream", 393 | "text": [ 394 | "2.9079268\n", 395 | "0.013137279\n" 396 | ] 397 | }, 398 | { 399 | "name": "stderr", 400 | "output_type": "stream", 401 | "text": [ 402 | "\r", 403 | " 14%|█▍ | 14/100 [00:28<02:55, 2.04s/it]" 404 | ] 405 | }, 406 | { 407 | "name": "stdout", 408 | "output_type": "stream", 409 | "text": [ 410 | "2.904755\n", 411 | "0.011554496\n" 412 | ] 413 | }, 414 | { 415 | "name": "stderr", 416 | "output_type": "stream", 417 | "text": [ 418 | "\r", 419 | " 15%|█▌ | 15/100 [00:30<02:53, 2.04s/it]" 420 | ] 421 | }, 422 | { 423 | "name": "stdout", 424 | "output_type": "stream", 425 | "text": [ 426 | "2.9042325\n", 427 | "0.01075287\n" 428 | ] 429 | }, 430 | { 431 | "name": "stderr", 432 | "output_type": "stream", 433 | "text": [ 434 | "\r", 435 | " 16%|█▌ | 16/100 [00:32<02:53, 2.07s/it]" 436 | ] 437 | }, 438 | { 439 | "name": "stdout", 440 | "output_type": "stream", 441 | "text": [ 442 | "2.8992906\n", 443 | "0.014193204\n" 444 | ] 445 | }, 446 | { 447 | "ename": "KeyboardInterrupt", 448 | "evalue": "", 449 | "output_type": "error", 450 | "traceback": [ 451 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 452 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 453 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;31m#.unsqueeze(2).float()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mshifts\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mpred\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mshifts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0;31m#loss=torch.mean(torch.abs(pred-out))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 454 | "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 487\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 488\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 489\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 490\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 455 | "\u001b[0;32m~/AI/repos/ES-RNN-Pytorch/models.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, series, shifts)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;31m#Get Batch size\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msmoothed_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msmoothed_season\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mshifts\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mrv\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mn_preds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0mde_season\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0msmoothed_season\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 456 | "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 487\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 488\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 489\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 490\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 457 | "\u001b[0;32m~/AI/repos/ES-RNN-Pytorch/models.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, series, series_shifts, n_preds, rv)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;31m#We use roll to Allow for our random input shifts.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0mseasonals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mroll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mrol\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minit_season_batch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mseries_shifts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0;31m#It has to be a list such that we dont need inplace tensor changes.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 458 | "\u001b[0;32m~/AI/repos/ES-RNN-Pytorch/models.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;31m#We use roll to Allow for our random input shifts.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0mseasonals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mroll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mrol\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minit_season_batch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mseries_shifts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0;31m#It has to be a list such that we dont need inplace tensor changes.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 459 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 460 | ] 461 | } 462 | ], 463 | "source": [ 464 | "for j in tqdm(range(20)):\n", 465 | " loss_list_b=[]\n", 466 | " train_loss_list_b=[]\n", 467 | " #here we use batches of past, and to be forecasted value\n", 468 | " #batches are determined by a random start integer\n", 469 | " for batch in iter(train_dl):\n", 470 | "\n", 471 | " opti.zero_grad()\n", 472 | " inp=batch[0].float()#.unsqueeze(2)\n", 473 | " out=batch[1].float()#.unsqueeze(2).float()\n", 474 | " shifts=batch[2].numpy()\n", 475 | " #it returns the whole sequence atm \n", 476 | " pred=hw(inp,shifts)\n", 477 | " loss=(torch.mean((pred-out)**2))**(1/2)\n", 478 | " train_loss_list_b.append(loss.detach().cpu().numpy())\n", 479 | " \n", 480 | " loss.backward()\n", 481 | " opti.step()\n", 482 | "\n", 483 | "\n", 484 | " #here we use all the available values to forecast the future ones and eval on it\n", 485 | " for batch in iter(test_dl):\n", 486 | " inp=batch[0].float()#.unsqueeze(2)\n", 487 | " out=batch[1].float()#.unsqueeze(2).float()\n", 488 | " shifts=batch[2].numpy()\n", 489 | " pred=hw(inp,shifts)\n", 490 | " #loss=torch.mean(torch.abs(pred-out))\n", 491 | " loss=(torch.mean((pred-out)**2))**(1/2)\n", 492 | " loss_list_b.append(loss.detach().cpu().numpy())\n", 493 | " \n", 494 | " \n", 495 | " print(np.mean(loss_list_b))\n", 496 | " print(np.mean(train_loss_list_b))\n", 497 | " overall_loss.append(np.mean(loss_list_b))\n", 498 | " overall_loss_train.append(np.mean(train_loss_list_b))" 499 | ] 500 | }, 501 | { 502 | "cell_type": "code", 503 | "execution_count": 13, 504 | "metadata": {}, 505 | "outputs": [ 506 | { 507 | "data": { 508 | "text/plain": [ 509 | "[]" 510 | ] 511 | }, 512 | "execution_count": 13, 513 | "metadata": {}, 514 | "output_type": "execute_result" 515 | }, 516 | { 517 | "data": { 518 | "image/png": "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\n", 519 | "text/plain": [ 520 | "
" 521 | ] 522 | }, 523 | "metadata": {}, 524 | "output_type": "display_data" 525 | } 526 | ], 527 | "source": [ 528 | "#Plot of Train and Validatiaon Loss, we nicely converge\n", 529 | "plt.plot(overall_loss,\"g\")\n", 530 | "plt.plot(overall_loss_train,\"r\")" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 17, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "data": { 540 | "image/png": "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\nQmCC\n", 541 | "text/plain": [ 542 | "
" 543 | ] 544 | }, 545 | "metadata": {}, 546 | "output_type": "display_data" 547 | } 548 | ], 549 | "source": [ 550 | "#Forecasting on the Validation set\n", 551 | "\n", 552 | "batch=next(iter(test_dl))\n", 553 | "inp=batch[0].float()#.unsqueeze(2)\n", 554 | "out=batch[1].float()#.unsqueeze(2).float()\n", 555 | "shifts=batch[2].numpy()\n", 556 | "pred=hw(torch.cat([inp,out],dim=1),shifts)\n", 557 | "\n", 558 | "#plt.plot(torch.cat([inp,out,pred],dim=1)[0].detach().numpy(),\"r\")\n", 559 | "\n", 560 | "\n", 561 | "plt.plot(torch.cat([inp[0],out[0,:]]).detach().numpy(),\"g\")\n", 562 | "plt.plot(torch.cat([inp[0],pred[0,:]]).detach().numpy(),\"r\")\n", 563 | "plt.show()" 564 | ] 565 | }, 566 | { 567 | "cell_type": "code", 568 | "execution_count": 34, 569 | "metadata": {}, 570 | "outputs": [ 571 | { 572 | "data": { 573 | "image/png": "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\n", 574 | "text/plain": [ 575 | "
" 576 | ] 577 | }, 578 | "metadata": {}, 579 | "output_type": "display_data" 580 | } 581 | ], 582 | "source": [ 583 | "#Forecasting to the Future looks good.\n", 584 | "\n", 585 | "batch=next(iter(test_dl))\n", 586 | "inp=batch[0].float()#.unsqueeze(2)\n", 587 | "out=batch[1].float()#.unsqueeze(2).float()\n", 588 | "shifts=batch[2].numpy()\n", 589 | "\n", 590 | "pred=hw(torch.cat([inp,out],dim=1),shifts)\n", 591 | "plt.plot(torch.cat([inp,out],dim=1)[0].detach().numpy(),\"b\")\n", 592 | "plt.plot(torch.cat([inp,out,pred],dim=1)[0].detach().numpy(),\"r\")\n", 593 | "\n", 594 | "\n", 595 | "plt.show()" 596 | ] 597 | }, 598 | { 599 | "cell_type": "code", 600 | "execution_count": 37, 601 | "metadata": {}, 602 | "outputs": [ 603 | { 604 | "data": { 605 | "text/plain": [ 606 | "array([0.4233447 , 0.37306103], dtype=float32)" 607 | ] 608 | }, 609 | "execution_count": 37, 610 | "metadata": {}, 611 | "output_type": "execute_result" 612 | } 613 | ], 614 | "source": [ 615 | "param_list=[]\n", 616 | "for params in hw.parameters():\n", 617 | " param_list.append(params)\n", 618 | "param_list=torch.sigmoid(params[0:2]).detach().numpy()\n", 619 | "\n", 620 | "param_list" 621 | ] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "execution_count": null, 626 | "metadata": { 627 | "collapsed": true 628 | }, 629 | "outputs": [], 630 | "source": [] 631 | } 632 | ], 633 | "metadata": { 634 | "kernelspec": { 635 | "display_name": "Python (pytorchenv)", 636 | "language": "python", 637 | "name": "pytorch" 638 | }, 639 | "language_info": { 640 | "codemirror_mode": { 641 | "name": "ipython", 642 | "version": 3 643 | }, 644 | "file_extension": ".py", 645 | "mimetype": "text/x-python", 646 | "name": "python", 647 | "nbconvert_exporter": "python", 648 | "pygments_lexer": "ipython3", 649 | "version": "3.6.3" 650 | } 651 | }, 652 | "nbformat": 4, 653 | "nbformat_minor": 2 654 | } 655 | --------------------------------------------------------------------------------