From d7f4c1849b2dea9a77e9adec166c627424e6a52d Mon Sep 17 00:00:00 2001 From: Victor Mylle Date: Mon, 6 May 2024 16:11:15 +0200 Subject: [PATCH] Non autregressive gru model load --- Reports/Thesis/sections/results/gru.tex | 14 +++--- Reports/Thesis/verslag.log | 4 +- Reports/Thesis/verslag.pdf | Bin 6373443 -> 6373408 bytes Reports/Thesis/verslag.synctex.gz | Bin 264159 -> 263896 bytes src/models/lstm_model.py | 46 +++++++++++++++--- src/trainers/quantile_trainer.py | 1 + .../non_autoregressive_quantiles.py | 12 ++--- 7 files changed, 55 insertions(+), 22 deletions(-) diff --git a/Reports/Thesis/sections/results/gru.tex b/Reports/Thesis/sections/results/gru.tex index e10fbe1..9a39785 100644 --- a/Reports/Thesis/sections/results/gru.tex +++ b/Reports/Thesis/sections/results/gru.tex @@ -30,15 +30,15 @@ Multiple experiments are conducted to find which hyperparameters and input featu \toprule Features & Layers & Hidden Size & \multicolumn{2}{c}{MSE} & \multicolumn{2}{c}{MAE} & \multicolumn{2}{c}{CRPS} \\ \cmidrule(lr){4-5} \cmidrule(lr){6-7} \cmidrule(lr){8-9} -& & & Train & Test & Train & Test & Train & Test \\ +& & & AR & NAR & AR & NAR & AR & NAR \\ \midrule NRV & & & & & & & & \\ -& 2 & 256 & 34942.89 & 39838.35 & 142.43 & 150.81 & 81.34 & 85.04 \\ -& 4 & 256 & 34705.61 & 39506.55 & 141.74 & 149.81 & 81.89 & 85.46 \\ -& 8 & 256 & 32885.71 & 37747.11 & 138.16 & 146.67 & 79.99 & 83.67 \\ -& 2 & 512 & 35362.66 & 39955.79 & 143.19 & 150.77 & 84.37 & 87.88 \\ -& 4 & 512 & 38253.89 & 43301.13 & 148.33 & 156.73 & 85.98 & 89.78 \\ -& 8 & 512 & 33131.93 & 37681.71 & 138.93 & 146.62 & 79.64 & 83.08 \\ +& 2 & 256 & 39838.35 & 40097.62 & 150.81 & 150.37 & 85.04 & 76.12 \\ +& 4 & 256 & 39506.55 & 39968.96 & 149.81 & 150.04 & 85.46 & 76.07 \\ +& 8 & 256 & 37747.11 & 40400.37 & 146.67 & 151.03 & 83.67 & 76.59 \\ +& 2 & 512 & 39955.79 & 40917.24 & 150.77 & 152.04 & 87.88 & 76.06 \\ +& 4 & 512 & 43301.13 & 39954.62 & 156.73 & 150.14 & 89.78 & 76.25 \\ +& 8 & 512 & 37681.71 & 40379.14 & 146.62 & 151.05 & 83.08 & 76.42 \\ \midrule NRV + Load & & & & & & & & & \\ & 2 & 256 & 33202.80 & 38427.91 & 138.02 & 147.27 & 79.62 & 84.17 \\ diff --git a/Reports/Thesis/verslag.log b/Reports/Thesis/verslag.log index 39dd957..49229ed 100644 --- a/Reports/Thesis/verslag.log +++ b/Reports/Thesis/verslag.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2023.9.17) 6 MAY 2024 13:49 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2023.9.17) 6 MAY 2024 16:04 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. @@ -1456,7 +1456,7 @@ Here is how much of TeX's memory you used: 1141 hyphenation exceptions out of 8191 83i,16n,131p,2100b,5180s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on verslag.pdf (37 pages, 6373443 bytes). +Output written on verslag.pdf (37 pages, 6373408 bytes). PDF statistics: 542 PDF objects out of 1000 (max. 8388607) 412 compressed objects within 5 object streams diff --git a/Reports/Thesis/verslag.pdf b/Reports/Thesis/verslag.pdf index 480ae6fdbade44bd79cb77d5fa05496df6a106b8..92489fdd6b702f7f4ede9f2245afb3d0493b3ec1 100644 GIT binary patch delta 3278 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 delta 3281 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 diff --git a/Reports/Thesis/verslag.synctex.gz b/Reports/Thesis/verslag.synctex.gz index 87cbbb6961e823c31674f0bc1a7f7d3c334dbe4f..af5484dc4e311d4bf8be04906c1ea3670ebaca2c 100644 GIT binary patch delta 18741 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 delta 18967 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%0AM!KE2*g@J}uy=$%e>@v8~l@ zMqlQN1hLhseKTME;+mg0N1V|LmZW9773rdD1#evpcfy5;NN;M5c~^YaDrO1cJz<@J z;9pqaRmBaWh>3O zt5bny3nFkCi>(DBmqI80h)RV}#n^aQ6K)U~Lv+ zx)6(0S^mo1Z=Q$ygAr{S=dE{j3A1g9fmA)23MwEX!OBN)AGt!w%onj(!>^^M%cUVu zhQ&LL(SvS^s4yB%3YU?J#jM{%?crnJ<5Vh@JSlj<-|5PiF>@dQ-ib0q9=J}e@sud5 zCy@UDHYClM)87`cE0X`n=n@NevR7$?aGhct4eOL|?OGVj(~haS`fb+!jcB>8^+7lI zX9+M^yArU$5e6NkJez-)lKu8oJ17kCZ z->&9!E4&8Jkp*NU&dD;>vc$Os9g-HbQ^U;4@n?$$cYb`uN!j7ptNz7p72g}V2AUGh z%g-1D?dZ}nvhoK9nfDHGB|P8M$GYfkiOm4 zXuTii$0MUyYN`FsSc!bUmZSmAJTJbCa-{@{SK9{dlq-SWPM( z-hGpF60E77o_1Wt9NVAH_G|OtM;=ZMPvkv_sns) zpD0g)UUgp3JfOes&D>A$w@S+r@ye@?BI)8LnoccEzRf+BP`ugx%9iO}x$Th+PkheSY^i{v zV-!7^38yfn)zr_uvh&MQSadTd5d$qk%2ZY z&4>uoQB}#Z;G5w$Aw`~Nl|XTBzjP?_lVJ_{RaFexh~w`5{DoAqa2KP30u0LH^%T&^ z3G3kb=LAywZ#9xrdOVuDC4P%|dA&ORJs&5)c7)kAIEoJVfVXSJ6=@+F_2Sv?(4%WQ4nI}d!ubz{J zkW;-;z)vWgI?uH@X;JzH`<+8CUu~im?MXaHf{8mD;y_kOi%cPUt+y;F6AcxZezM7P zFGsVTl%q}g0i!QWg-sm-jmC~SGCUlbAGYXR;><#ElWj7`X?=W^nPubs$B6Qi<0%L( z-A<+wcKD%Ux!=E5aG`A3u9xp{ZC+8e?48uUR_C?Nd#SsS%+w5=sIyNwU_sQvM7w^H zloIRP)thD{7FBSFZ<>CxoEWEY^t4N^OI@Me3u?1$puZu~rEC*K@bcYwTPSAnp%7+@ zb8#HUXSp#7BLepqFxucr&KQU_s!X|fOK;FyOyiYFvj7C86&*8JERzr4}USZVP7`$ ztk^XbG?heqSS>jpFQD2TE<|2SttVfmE}P3hPz-st%r(L883;#<2Z$g4igsh zdS@D2jMg%`fP7_{S1{vj8*(=IFFK0jl%frQGg~cCF~n4CP6>q6Ia)YOHcW+2mXv7mlyZTO&SFVErij(}>E#CO(_67bKa0 z*Qng<_vv$J;AdYi-^?~dekU9YMLnc0GPZ@Pc_l6ow8N_TA5FP$<#HWzwrcy+wg{93=MlD@l-0#B+!9$dl;AHqyrm`Wfv9Yw zszs%nSsxZd%}k^BjA{~!qV$ODMH_!CM(^~R@0Bln+B0a}P=M8g1(;Ncg;!BQ z%wmzidRuKgXVeWZo$aH}W-S8UqLpg^pO&%IQJZH#L8IN$6rrR9WLnny2Brbi8IzsUanHx+;`yDj4 zZT1}Be7w$fewv!mOcSNW>eoYFmedFdasBE%ZpA1_gn2U3gTM(LAoK=YUC3I96rbcH z6b%!2v17%-fppQB1UD>WNZM7A?y$KjVnv^FZ(kyT37 zk^h7Gne&$)gO?Tu#$MK$*n$NLbIEe+ROL3Z_8aK6cZmL%c{1FAp_!0fQ-u07IIMJ(9*OzavQDQLvY>_Hn<6D0=l<7qO+n^C~869pG(j>I!3h^vj4 z_{cs8^>UR+p!sKOfDoAbagtC=sJcFub(|n6qFp6==tEE6`o8F8t|)8ux1^AhA8^OQ zR8o>%qwH$u4h3zn7#V&HE7;hX*i)xS*MrDL)|1?wEI%f>N6$au%QBbh*39aS=+_8- zq-6ov!00E4goq!(DxbGCeB*7ep4jP{C`~MoMrZ7mB}_%f@R6Tt z)-z~vxg?ZaGE;*@O;Vh)f@92=7eO@|R#Ey&+#00UoQPdA;FPl(SBx0eFEtdD?>J>? zfl+$C0g8-niQSkTZL+Zpi1+2@=Rw2zJ0@`$wT%J%DKriAT%za3!6S;d?>xNCS3jlC z_=dMBg{gn3;6YBdgUE$a4zjrAgkqx}Y#Oqc^b+k#W^8|1{K7{#d;-IWR6_k(6(U9u z=JLe#4LV}9la$WW{Hc#a!2}r_rfp>`R2epKV(vkU+$+RRMr0>LXq;v*W2}l-w@aQPcibWxc<7O~;D6Yl%haz1v7HgpFRZ1YDS)+6Yv;Yke$Pn7h`| z%G~o)A=8fGC27qjNE%}Mw~i=jyR!}2KTy@wvyNj z{o(0U^5x3;lkb4!KC^$iBN`|3aiCj(G@GKNa{V@$A*A%M=IUNkM4Ww6`IMFX$^AGP z+-r~CtCg2{b(=m-eOkcDT;&C%F8d3XV@@_g{>hpcY&!y*@^T7sV9M&De&7czykH)( zjR+X7MhFsSKFY^)@aM!E38ir=$z&0t&hh3JT$p)<6;Yj6PnOP_;9RoXryV2lKA^`z zA|T{h_)!6z(b*vVhG7!_xTo&=ySXwoX@SJK^r+c)omPpBV|4(iO21E|wR21u`zzLIE0mr;_ZyrXr39E+f8NEMl6=_lYZuW7NJ~zCCvA z%d#;*`{tjL+x6?m^^?I5YNXQ;)q0G4`9e11V==Z3TX6#|KrLimh0$}!tQ@wEgRnxm zxl`JErIEKuF#+%Rlisat2<62WVG48fYSZ?~#_>xZ(X$qNWtr?~uuLZKP`=%weiPA<*@~fh2JI*t-}h^=6-3sZr(oAwgm3GqTc=Sp7v!)2Bbz6$q>H zWtmlzDL&&CGqJb6Z)dTDtTGp&?XfU^t1PSGmSvu;174fECc?WB2$!?<3VyD(1g(m6 zxtb3!RYb5_RI|&WKa6BF>(whLFLURj#HQ@Ol)@J9Kw3RVsCSpWvYFLm>OZ%+V3A`m zq3j~I?8x7>gbeR0t#w76>WSP3d>a_2o{QQBb8=rN{ZjNf&D~1DyHe64fAyKJG-;O}ETqn;x@+J&}#r#(UQg(2 zH8lJVi4W1?T#^aWcZchOZ0ebj%<9OS#H%Wc_$9M8iW@8Q8PG{+D(+qFm z>47VvvFHzd)MX*c`3s^Nr=eCK~q=Y^Q9Vfj8F% z>$k#;aND9^oBcDb@Le*9XJ?+3P)EfLQWl@Qt(GR6F#1ZG5W-(7A5gYJ#V7sYW*{Jp-iAU z1a~V;$-V<5R#BH~9_L4ff@wYE2cv&3y*8tK_L8yX)3KhTrr?8`2jT|^T5A(#f1+C0C<{UNtEM3d!c8uHK)~h*~y6)Ji zV|e`iFC6bpE%7h;XgD4Ht^@iRNKI#o?mWI<@upuGGMH?e$cduAE{G^C=5YmR-eXty z7GJ+0`G#J-e{y-%xt_X$eSfvA1z`(ybem#tbl6h2HWd`f8`frQGv80SsokgJ1E=DL zUnzb?wJa9tZ15#YTKLeW$Fogp&>uyWnyk-NUVTdc20zXT(w=p`u-oi+tZo@dvLVt{ z(aFuWb9p*z`EW#yHeKZLVXFmj5OM72?2HJh9+Y1nq&CpX>Z91kkd*9nSAChlVS}4Jxop?P+x%>yRWf1)vDKsM z9H!-=L_K{CuI~i|P5qa+68(|TAtqe75_aS(N^2-BN>!eP%qKpcW!y})%G%zxN9S3 zje+mb3M|(99aKMP4lj7Q81g-At0tJZE3AE|#)!;ob9g~W^ObtpX@ya3+!nE#M}Cy- zgE^nWcLWL|7sG+5s`J1~fL<@^@H#(=AQ$w;!YV&+$x!29WR+7epq9-l@O$m&!JnPq z44diEe0W*0gI3o0Y(;|-tK0~TVR(_INaKe6vMeXxWUsM|^Y_$v8ceJQB=;SE5V<6t zfc1LpotI;f9&lC8?;{0J2yj&eA$0$IMrzP=PI&YQ@9G z-384oFa9YkWYu{4^0s%Vg3Fz>^j*tHQ!X=DxjiIgL32eFSO9JOl%;1a0X;ONDx);@ zn;U6VID~f`A(=3Wm)mp4-X<6cz6^U3S;L@hf9@hfEfjWRdXq*niKK z@Y|Qpo9yZRCdFH)!EnkhVGiD$4+98B4A`oSg%fZu-FUbT(rLa{m2Am+~gm796w z+&f_#Q7ij|E9qQMQc$(W-Hby(qmHxB^NN(Y;u8&-s}abZFQ=BXyKXK=jBC2@L>CrjkxnB(ei z$PNEOsR^r880}81$AMfe)FU7Y?dd8-@(1XDUX@&Z`OD0dtG0bhH8fd0kP_k2T-lu{ zm5?||60PYXh9XPY7EP;kx}+cWtDtE9x9@>3()eK!gaOy=NuIT;Zhpi4<}lt3mQv~- z?*h3s7b1>_xG}B3X8aWIwE!_1U%mGT4};~}i{bh^9rG<4*Z5Dxn7ku!>8D~39gJfpKkn_iP@75hq%@uXSU2jZ7fkWT{#L`OS+SqXwcj(7SZ;D`| zrsiLX)T>#>k2$x>&kt&mN z+(9dLzMllu0F0FBizi#*Z&^FU-@(b~FQ+W}Bf?dS)IM3N#JuZymo!xKO>H~HwVEFE zN~bQT2c(jF^%?r_dImM+1lkE6wC_T4^0c=YO8u4v_^YK?7il{?tD5J#^AxusL#deA zG}+zi-RhLOyeg^7m%G44)zJs z3GQ$2U|+ByrN1?+Y9caOd3Tz|E85oQ1W>9**MpjZqSr6kbnfj75$R17-DbZ8#Maz+ zQLYSJ&F9?+zs(LNFp{v5m(-sgQPX|&ttUJuqOv@0x(dJP+8jY73ejFf0X9*uXj zB_x2y8IydI2(ORPrQ#EqHpEFdgqfN*@gl3j~;{oL(@Zf`)>TS3XhcvmjyU2O&3vu;j}dJ)c2Q5Fo2~#xswd}e*uXB zcK$e3{&Ndhd#Ch3&tK$q8BchMsN9m?U7&?q(jP7S-7{#txFsE}Thdd$qU|kdPZ2PD z^>3kk^`HLur$7J1JFB0*{>L9b|M272|N8B3e)|50Km6tQzyJL8fByE@KYa7UU%vkP z-+%w-f8YKC{rt_B&tLz;=WqVQ58wXl=U@JhtK@&-lE-hj#IL^p(@)?2;oJZ9`Iq1R z^s8Tge*5~r{N?W+D!%>vRKmXy=SN{k6E{Y7!6B7U~RSo+9 diff --git a/src/models/lstm_model.py b/src/models/lstm_model.py index 9ba3ac5..488760e 100644 --- a/src/models/lstm_model.py +++ b/src/models/lstm_model.py @@ -1,7 +1,15 @@ import torch + class LSTMModel(torch.nn.Module): - def __init__(self, inputSize, output_size, num_layers: int, hidden_size: int, dropout: float = 0.2): + def __init__( + self, + inputSize, + output_size, + num_layers: int, + hidden_size: int, + dropout: float = 0.2, + ): super(LSTMModel, self).__init__() self.inputSize = inputSize self.output_size = output_size @@ -10,20 +18,34 @@ class LSTMModel(torch.nn.Module): self.hidden_size = hidden_size self.dropout = dropout - self.lstm = torch.nn.LSTM(input_size=inputSize[-1], hidden_size=hidden_size, num_layers=num_layers, dropout=dropout, batch_first=True) + self.lstm = torch.nn.LSTM( + input_size=inputSize[-1], + hidden_size=hidden_size, + num_layers=num_layers, + dropout=dropout, + batch_first=True, + ) self.linear = torch.nn.Linear(hidden_size, output_size) def forward(self, x): # Forward pass through the LSTM layers _, (hidden_state, _) = self.lstm(x) - + # Use the hidden state from the last time step for the output output = self.linear(hidden_state[-1]) - + return output + class GRUModel(torch.nn.Module): - def __init__(self, inputSize, output_size, num_layers: int, hidden_size: int, dropout: float = 0.2): + def __init__( + self, + inputSize, + output_size, + num_layers: int, + hidden_size: int, + dropout: float = 0.2, + ): super(GRUModel, self).__init__() self.inputSize = inputSize self.output_size = output_size @@ -32,14 +54,24 @@ class GRUModel(torch.nn.Module): self.hidden_size = hidden_size self.dropout = dropout - self.gru = torch.nn.GRU(input_size=inputSize[-1], hidden_size=hidden_size, num_layers=num_layers, dropout=dropout, batch_first=True) + self.gru = torch.nn.GRU( + input_size=inputSize[-1], + hidden_size=hidden_size, + num_layers=num_layers, + dropout=dropout, + batch_first=True, + ) self.linear = torch.nn.Linear(hidden_size, output_size) def forward(self, x): + # if dimension is 2, add batch dimension to 1 + if x.dim() == 2: + x = x.unsqueeze(0) + # Forward pass through the GRU layers x, _ = self.gru(x) x = x[:, -1, :] # Use the hidden state from the last time step for the output output = self.linear(x) - + return output diff --git a/src/trainers/quantile_trainer.py b/src/trainers/quantile_trainer.py index 5e592d9..2c7078c 100644 --- a/src/trainers/quantile_trainer.py +++ b/src/trainers/quantile_trainer.py @@ -633,6 +633,7 @@ class NonAutoRegressiveQuantileRegression(Trainer): def debug_plots(self, task, train: bool, data_loader, sample_indices, epoch): for actual_idx, idx in sample_indices.items(): features, target, _ = data_loader.dataset[idx] + print(features.shape, target.shape) features = features.to(self.device) target = target.to(self.device) diff --git a/src/training_scripts/non_autoregressive_quantiles.py b/src/training_scripts/non_autoregressive_quantiles.py index 9a574c5..346df73 100644 --- a/src/training_scripts/non_autoregressive_quantiles.py +++ b/src/training_scripts/non_autoregressive_quantiles.py @@ -2,7 +2,7 @@ from src.utils.clearml import ClearMLHelper #### ClearML #### clearml_helper = ClearMLHelper(project_name="Thesis/NAQR: GRU") -task = clearml_helper.get_task(task_name="NAQR: GRU (2 - 256)") +task = clearml_helper.get_task(task_name="NAQR: GRU (2 - 256) + Load") task.execute_remotely(queue_name="default", exit_process=True) from src.policies.PolicyEvaluator import PolicyEvaluator @@ -27,8 +27,8 @@ from src.models.time_embedding_layer import TimeEmbedding data_config = DataConfig() data_config.NRV_HISTORY = True -data_config.LOAD_HISTORY = False -data_config.LOAD_FORECAST = False +data_config.LOAD_HISTORY = True +data_config.LOAD_FORECAST = True data_config.WIND_FORECAST = False data_config.WIND_HISTORY = False @@ -64,8 +64,8 @@ else: model_parameters = { "learning_rate": 0.0001, - "hidden_size": 256, - "num_layers": 2, + "hidden_size": 512, + "num_layers": 8, "dropout": 0.2, } @@ -83,7 +83,7 @@ model_parameters = task.connect(model_parameters, name="model_parameters") lstm_model = GRUModel( inputDim, - len(quantiles), + len(quantiles) * 96, hidden_size=model_parameters["hidden_size"], num_layers=model_parameters["num_layers"], dropout=model_parameters["dropout"],