diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..c957848293c654a36ed7309c83d1f5d1a02b9997 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/2500/frame_0.jpg b/2500/frame_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcdb4d25801e36d3fa66171adf9ababa5af3b705 --- /dev/null +++ b/2500/frame_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4214550eb30c78ee29c83e330d40e6efb10e81ff0a3f0463c7e987a8abf7a12a +size 145355 diff --git a/2500/frame_1.jpg b/2500/frame_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..508c22a163b2716bb0032e4b6031cb0f4ad9bc51 --- /dev/null +++ b/2500/frame_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa60eff520d3e52add835a7ec6151a811bd501c97e22e609fd3b553a7ab2b93b +size 145491 diff --git a/2500/frame_10.jpg b/2500/frame_10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e80cc707375a2c3925082a79ca6e50b94a633409 --- /dev/null +++ b/2500/frame_10.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e3b2b8af1380258a33b3ea929c41c15bab23c882b7a85374ed34cc9f6b225b5 +size 147119 diff --git a/2500/frame_11.jpg b/2500/frame_11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..106899ea8ef897717a2acf46c4af798b0aa3eef0 --- /dev/null +++ b/2500/frame_11.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05c5021c1b7deffc21ddc5d635716187b1ee4b41fd414671592e9ad82826e691 +size 146891 diff --git a/2500/frame_12.jpg b/2500/frame_12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3794a14f01a6ef979c169fb02b5747d7a1f70114 --- /dev/null +++ b/2500/frame_12.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6c99056381d59704d1020959491964079efc2d2be4c3cffbc3e9e92c8af2254 +size 147105 diff --git a/2500/frame_13.jpg b/2500/frame_13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efa28f3e05823044efb22e5edfd437d0dd63e005 --- /dev/null +++ b/2500/frame_13.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f70b9e5649d36b8be2806759433f4ce0443e993a424f9a051bd293d1d419e570 +size 147260 diff --git a/2500/frame_14.jpg b/2500/frame_14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98afc37db9eb84f010b2518eaa31614528acb103 --- /dev/null +++ b/2500/frame_14.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2cbda2c8035c26ecdd53c59df901cfd5ad88618fc4ecd73d53dd90be07155bc +size 147602 diff --git a/2500/frame_15.jpg b/2500/frame_15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f9411bf6e0b89de40594b7c3cb67bf39a7d7a29 --- /dev/null +++ b/2500/frame_15.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8379e1b3f086cd41e7a2f39dddf24db2df858c09a8e603e9b1dab022869ab75 +size 147315 diff --git a/2500/frame_16.jpg b/2500/frame_16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9984d6fabfd4a2eb7c89e176952af2b8cb60525 --- /dev/null +++ b/2500/frame_16.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf643c114911d2f142b9b8aa2d9fe256f1fc04fd9d5035313597af2280544f0 +size 147546 diff --git a/2500/frame_17.jpg b/2500/frame_17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8a00149385eff9152ed76da64cee37378eb4337 --- /dev/null +++ b/2500/frame_17.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16070710dc9f7a0a4c1b9a3bb1c6b49c1540133c98a69c962407b15ac36b1e92 +size 147434 diff --git a/2500/frame_18.jpg b/2500/frame_18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba803c13e1cb81a43459ec65aca665e215b7fe40 --- /dev/null +++ b/2500/frame_18.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d333ed661c83cef924f6a5c7c37bae6d0b1cfa27046c5d44477eb0bab7f8147 +size 148037 diff --git a/2500/frame_19.jpg b/2500/frame_19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e49e8676389c582aacb5accb7845444e0835ebe --- /dev/null +++ b/2500/frame_19.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28a43ed03c91382e49400d4212d83376533a64e5a9a4d1872c3860247e08cc30 +size 147803 diff --git a/2500/frame_2.jpg b/2500/frame_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c43f9abc8f50f6290fac2a503e6ce8c30192511b --- /dev/null +++ b/2500/frame_2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37ab6c93e42e155d329fcf267043c692331be09c6a878b6b2efefc357bc79a5b +size 145724 diff --git a/2500/frame_20.jpg b/2500/frame_20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5864f549679ce278e6d4092c9bdc31c710d9839 --- /dev/null +++ b/2500/frame_20.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfce8307c54e635248a03e16e73e1547a97b51bddb4be9da8e3cab8c061cf9fc +size 147657 diff --git a/2500/frame_21.jpg b/2500/frame_21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcd9c041994197b4cd5617e32cc55224d8981507 --- /dev/null +++ b/2500/frame_21.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d59f9657623ab09ae98b2a74c98681e0cc0412ad86bb985bc84ad49944b9f65b +size 147875 diff --git a/2500/frame_22.jpg b/2500/frame_22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be65f59aaf2a0903e9a5ae6a5b31f37524c2a524 --- /dev/null +++ b/2500/frame_22.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc89d85ee212c16aa0005324e42804813957bed60300761b4623baa3a45b1f6d +size 144797 diff --git a/2500/frame_23.jpg b/2500/frame_23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a5380f6c26e7f3f88b9aff6aff6241c232e822a --- /dev/null +++ b/2500/frame_23.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8dd2efc6f1d167c931ccea142674a627f4f6f1296f3fb7968275dc0f2a41834a +size 145096 diff --git a/2500/frame_24.jpg b/2500/frame_24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b717bf2a8037c4f7a3052f66e1ee4af1a7627e27 --- /dev/null +++ b/2500/frame_24.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d27d3289f3b1b84ec38176ec635baa2631097c1d95b2cf32cface71edbbfe88 +size 145165 diff --git a/2500/frame_25.jpg b/2500/frame_25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..969b34029fe3d1074bbd645a981ec1c9d8f7e09e --- /dev/null +++ b/2500/frame_25.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebfd57dd741c65c4b2afcf04cc145e9e4a60b4ae03eee034b66bbdf9497b0581 +size 145263 diff --git a/2500/frame_26.jpg b/2500/frame_26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d916313891573435f25b31dcf11054a6d946549f --- /dev/null +++ b/2500/frame_26.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af90e59d046a588496cb40fbbec85ad335f4d5bb667739034212986713c69405 +size 145496 diff --git a/2500/frame_27.jpg b/2500/frame_27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fea6b949097b20f2cfcef8bc1ecf74cf47648a46 --- /dev/null +++ b/2500/frame_27.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9176a169134fce515c377113649af64a024179b74c6ab88d8a72d49549ac2eb +size 145021 diff --git a/2500/frame_28.jpg b/2500/frame_28.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1028989d419ab64da7ce09d5b018042eb4a1858b --- /dev/null +++ b/2500/frame_28.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e272bd16a080c40811f23db52c20bd87ad4c33413b4faf558448dc64283a7ef +size 139917 diff --git a/2500/frame_29.jpg b/2500/frame_29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cca1d9fb7b9b341b05b9195238fffc26fb0e0ed --- /dev/null +++ b/2500/frame_29.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce8eae730d826191915f13967148630ac8d756a383e0ecffa43e1ad0976f3024 +size 143063 diff --git a/2500/frame_3.jpg b/2500/frame_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16e96a9858bda18677b1389ad9fd87987ba936ec --- /dev/null +++ b/2500/frame_3.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9601c989afb47054a1072d280b30a8486fcb357df0f4685a72f13e345dd54782 +size 145878 diff --git a/2500/frame_30.jpg b/2500/frame_30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46a04a6408db2bed9cc0188ab7288466ed338902 --- /dev/null +++ b/2500/frame_30.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70ac8bf52f928d321bf92d6a79e3798c00807a0290d48cadb40531897bdfd388 +size 143201 diff --git a/2500/frame_31.jpg b/2500/frame_31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f05172aa0c104ffa483fe69e2e4141f82eda3c1 --- /dev/null +++ b/2500/frame_31.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8e330a108f6b973e08576569e2f1e553cbf8f1ad7e866018b42f2ae8e0ee7a2 +size 143604 diff --git a/2500/frame_32.jpg b/2500/frame_32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38337f2ea5e9bb36a6f79ba84e1595c88fa0ed89 --- /dev/null +++ b/2500/frame_32.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:508c46bb844e6f66d9613c7d88740e5015ed49ff642f39508a4ec9411f480bb6 +size 143719 diff --git a/2500/frame_33.jpg b/2500/frame_33.jpg new file mode 100644 index 0000000000000000000000000000000000000000..053fc5a23104bb2816d3f62ced3bd39c96c8ebaa --- /dev/null +++ b/2500/frame_33.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b5e3f48c5038025ec83f7ec8cd37c23f467be7de4c5d76f120bb7546312845a +size 144259 diff --git a/2500/frame_34.jpg b/2500/frame_34.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2697aa8951b6f897ef3b8d9f73ff9ea1324326e9 --- /dev/null +++ b/2500/frame_34.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76bc7cbe1b442f7efdfcb727dd400ab43b83ae74c6ab9828f36f807b93a79639 +size 143914 diff --git a/2500/frame_35.jpg b/2500/frame_35.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a000dc7cac4e31a9d6333382f860f52a141f7d00 --- /dev/null +++ b/2500/frame_35.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bce561f852c9252087018e8cccd55d38d2ad3e6f5e2eb551697b8c56aa3757d +size 143971 diff --git a/2500/frame_36.jpg b/2500/frame_36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07fd901df457f7e5c79b93af281d498c7016a3bf --- /dev/null +++ b/2500/frame_36.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76cab1a5f7a41b62f6f15722e3fe3a4f510dc1540dcd877ec082bbfc9bf56ee8 +size 143976 diff --git a/2500/frame_37.jpg b/2500/frame_37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d441354641af1d796f2ac1cdd9570d81a09faf7 --- /dev/null +++ b/2500/frame_37.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:035c5c5bcda21acef292a7df84745a60fc7c81ad30ac841b7baaa3232aa46d78 +size 144467 diff --git a/2500/frame_38.jpg b/2500/frame_38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..743fd9c3366e478e6612bf9eb256d771a72c60c4 --- /dev/null +++ b/2500/frame_38.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b671e7a2a498e5123beb97dc6035e2bc91c5c525a1d137700081fad42bb0d0e1 +size 144136 diff --git a/2500/frame_39.jpg b/2500/frame_39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f4e3e5d74e200045360e7b8f3216835ebd899f7 --- /dev/null +++ b/2500/frame_39.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ce2022268a66b8a050601de76141750ba0af2ad849ed5b20366970f9a0e80ba +size 144217 diff --git a/2500/frame_4.jpg b/2500/frame_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4ff320bea21d78c31018cb003ac447896e668f0 --- /dev/null +++ b/2500/frame_4.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa4245600e614375c65870d5c27980b2366d83282e6b0b93969a02fc0393db4 +size 145985 diff --git a/2500/frame_40.jpg b/2500/frame_40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25b2c146d082d09a2bb1240c9f15e7f0fc61da75 --- /dev/null +++ b/2500/frame_40.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:376afbbabb758d72cd2cc4b5a97743fe3da73ef9dd7703f6f27dfb729b1d23f3 +size 144463 diff --git a/2500/frame_41.jpg b/2500/frame_41.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1b7e861b8d5ec10cee786760bb4b28d4a5d66b7 --- /dev/null +++ b/2500/frame_41.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1736823c0782b951ba84247708af4e73c8bc673410d46a92ec3d891da6147fbc +size 145076 diff --git a/2500/frame_42.jpg b/2500/frame_42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90f0d663906a426e125eabe3cfb323b85e03c422 --- /dev/null +++ b/2500/frame_42.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e55fa184062e390f563379c48cea94128b27164abdba01f375785a8ed8ed3891 +size 144669 diff --git a/2500/frame_43.jpg b/2500/frame_43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32784d1d1dfdabdf0aa478457188ccc50c764e07 --- /dev/null +++ b/2500/frame_43.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:824a368c27e9dfc11419fa7d4ddbad41fd4b7654ffe2ff236e0874a4c79123da +size 144783 diff --git a/2500/frame_44.jpg b/2500/frame_44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f97dd615cc9aa66ec624307eda166f8a5d6a297 --- /dev/null +++ b/2500/frame_44.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:919894571ec091b5708a61c34148e6e0a8abdcbf7d760ac30b1ab2d6501fd5b3 +size 144680 diff --git a/2500/frame_45.jpg b/2500/frame_45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..873bbadd54802f930e14071b9efe6741b33a71c1 --- /dev/null +++ b/2500/frame_45.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47ef721ed9bd230bc273f6f3661d46e43465c78c8044f3206801200afdc616de +size 145176 diff --git a/2500/frame_46.jpg b/2500/frame_46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91436ad0412cf6f881f38e6758c92bf926376973 --- /dev/null +++ b/2500/frame_46.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa65f3330aee73b69c23700d23878e6007ea6044f6ffaabf3953c05b22ab6365 +size 144843 diff --git a/2500/frame_47.jpg b/2500/frame_47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ff86528cb503dec63adc4f91627683f8a326da0 --- /dev/null +++ b/2500/frame_47.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52f8db15f2bf9567c4c7c7e6231b8d4081711aabcd439f9cd9f645c38e4b73ff +size 144770 diff --git a/2500/frame_48.jpg b/2500/frame_48.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bc3c08287422ca28d79114b18d6891f510fb849 --- /dev/null +++ b/2500/frame_48.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d76cf090a3cbb1e2afd89510049eb8a76310cfc1365d0363ad88765db72d1c7 +size 144799 diff --git a/2500/frame_49.jpg b/2500/frame_49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb730af2f9439e54955ae1b96ade5f3e2f840e9e --- /dev/null +++ b/2500/frame_49.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:951235b2c5f283c9a1fc01e32d29a5e7fe7c52680148a00b4fb2ca1fec0d7285 +size 145504 diff --git a/2500/frame_5.jpg b/2500/frame_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8407ff599e3d4127b91674ab7f21f728c8dc4222 --- /dev/null +++ b/2500/frame_5.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb3d256109e6aea043992d417787dcacf888fceac4df292704bbdfdd506f07ed +size 146214 diff --git a/2500/frame_50.jpg b/2500/frame_50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2c51aafdf512f34cb4481686617871c795f6ce9 --- /dev/null +++ b/2500/frame_50.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efed39bc84862b0d8e20db951edf90632eba36ee4753b7fe607a0fd794096e1b +size 145135 diff --git a/2500/frame_51.jpg b/2500/frame_51.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9889b072d4c676288c29d0009972f4ae38720bf2 --- /dev/null +++ b/2500/frame_51.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0af2fa82b5e6f8cd2ecd64d660eaa7af2c11cdabee5729f881a00ca666c9e497 +size 144954 diff --git a/2500/frame_52.jpg b/2500/frame_52.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dfe4972d327765519eeb8552a30d0b915d6b207 --- /dev/null +++ b/2500/frame_52.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbfbc9d5a2301882fbed8415804b1d3c710851610357b5ce3834a64d3157e327 +size 145028 diff --git a/2500/frame_53.jpg b/2500/frame_53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b2c115afa619a66fa83e612e920adfdda20ae72 --- /dev/null +++ b/2500/frame_53.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2e8f9f96c70c29dc4e9a6deb0a2986966e36e869b25c1ee79806170a91601ae +size 145470 diff --git a/2500/frame_54.jpg b/2500/frame_54.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21fb6530d7b3c0738f22433976a94c316e69b41a --- /dev/null +++ b/2500/frame_54.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efaa3546ca306046eabdf8d72bd97eff66500d26baaf4c0053e55eb2fe620367 +size 145177 diff --git a/2500/frame_55.jpg b/2500/frame_55.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a3bd710961b9ef233eb616fee66f383c928de2c --- /dev/null +++ b/2500/frame_55.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f52d1e8a48a5d3f98d8f0b2596580a3e991639c303908bdfa174ad7dab4a2e3 +size 145318 diff --git a/2500/frame_56.jpg b/2500/frame_56.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d6a485a759b8f90da0af8a1cd17b16e2888ed3e --- /dev/null +++ b/2500/frame_56.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e387ffe7a1cc70e6d790dc02552ba123b6baf25a729771e22ee8ab992b04e7f1 +size 145376 diff --git a/2500/frame_57.jpg b/2500/frame_57.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cef9e1ad0da25c2ee6a0a33029c3421f2128e12 --- /dev/null +++ b/2500/frame_57.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ad91e4cb3a26bf447cb433671e882f3f03ff5577c2e8d1f2e6627d8af5a238b +size 145757 diff --git a/2500/frame_58.jpg b/2500/frame_58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c99d82014755688299a1ff9cebfa6bcd431041b6 --- /dev/null +++ b/2500/frame_58.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f80ba0ae3beab3d4760801e5241e78949bd2d607622c85a617d274dacf5e42c7 +size 145361 diff --git a/2500/frame_59.jpg b/2500/frame_59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6718b53ce25b0a54d669abb5edff080eefbd8f0 --- /dev/null +++ b/2500/frame_59.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4967acea8ec0108ac023784a0a8a4f5c900ecbdfe9f22ee9e4aa0a401a7cc03a +size 145324 diff --git a/2500/frame_6.jpg b/2500/frame_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf1e553e59b8a016673c19207d4920d80e3127fb --- /dev/null +++ b/2500/frame_6.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4259ef949152486afc3b8bd5c20ab3b57373bdeafca6b2e0fd77907924ca568e +size 146500 diff --git a/2500/frame_60.jpg b/2500/frame_60.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f0e1fc5751fa71cac0f2f56000a9c6fcc70b133 --- /dev/null +++ b/2500/frame_60.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6a3aa260c15e3ffcbba2324233202cac782743a3cf88e4dc5a216097fa3fee0 +size 145521 diff --git a/2500/frame_61.jpg b/2500/frame_61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a38200f9bd475c29fa554ccb66205dcd17f4f19 --- /dev/null +++ b/2500/frame_61.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3814108daf08f68bc6c91eddacc35682ca6afccd642eac2075f5cd8824741400 +size 145883 diff --git a/2500/frame_62.jpg b/2500/frame_62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6f9d47c4bab85547eaae336ad75721d7772d554 --- /dev/null +++ b/2500/frame_62.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d0954f6acb062a2609a68064a4786f5ce5e677aa808b28ff3795e81928ca8fb +size 145300 diff --git a/2500/frame_63.jpg b/2500/frame_63.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe159b89e8d0cda0b6071a4d71feb66edcc9857c --- /dev/null +++ b/2500/frame_63.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd76992204ce7ca50704a6333b8234527bb8977f3d5bcf9a7ef61d615f6a631a +size 145267 diff --git a/2500/frame_64.jpg b/2500/frame_64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c78902d756617a850c2b8ec42f5b8b3e61d0d89 --- /dev/null +++ b/2500/frame_64.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ee81c0cb2398601a74cd5863f2394802548889a710e0333d2299bf25950f7e +size 145371 diff --git a/2500/frame_65.jpg b/2500/frame_65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ad95b9bbdc706e5fe63d8dac2c3a6f95d81076c --- /dev/null +++ b/2500/frame_65.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:364a880dd241c9aeb3f4de50c7ed4de41addeb024706be2b58740ecdabfbde74 +size 145949 diff --git a/2500/frame_66.jpg b/2500/frame_66.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b529d99ad517d560815edb00e38e4a495af4c27 --- /dev/null +++ b/2500/frame_66.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d807f3308e642e4b80ecb0bbc1974ff42c069ac29bcfbd616c6821e8516b2a82 +size 145543 diff --git a/2500/frame_67.jpg b/2500/frame_67.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ac9d4474745fd4f278cd20439ce37734528e3c8 --- /dev/null +++ b/2500/frame_67.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:accdee04308f8705d6dce5b31401fdf22735e090f040128b80b058d49ccedadc +size 145530 diff --git a/2500/frame_68.jpg b/2500/frame_68.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a00929fcc03c50bdcc352b75adcd068ffeff0d55 --- /dev/null +++ b/2500/frame_68.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7d3c2703c7d276307476810725ddede6b754512da5775da2043fd53c20b37ab +size 145553 diff --git a/2500/frame_69.jpg b/2500/frame_69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a5a18eff3ef891693c30477ac2a1a536c0ee82e --- /dev/null +++ b/2500/frame_69.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce4e8ea80d03c10107589a042f141e13d6eb0c0f0c19b4a9a4c36baa3cd2b3c5 +size 146072 diff --git a/2500/frame_7.jpg b/2500/frame_7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11ce16e2b7a7168d97a4db980dace40010278b78 --- /dev/null +++ b/2500/frame_7.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fa3da5fa1ca1cc434d52e54f0380e46481465de431f7374f901276138eac23f +size 146454 diff --git a/2500/frame_70.jpg b/2500/frame_70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3e7113ca2c7cab92179a23bbc59fa92a1f944fe --- /dev/null +++ b/2500/frame_70.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a244e36c7984b59ef77681f4a0b787c11f5376d07edb559ae15f44a2304e014 +size 145656 diff --git a/2500/frame_71.jpg b/2500/frame_71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b85174d85e88b414f9fecf9c4cc825075c182f59 --- /dev/null +++ b/2500/frame_71.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffccc2b61a68a3c6b7f62b97ebafe6bab0864d715f49acf213c56a979724b0fd +size 145636 diff --git a/2500/frame_72.jpg b/2500/frame_72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1787d98af4f087da9b757afc24870582301b45a6 --- /dev/null +++ b/2500/frame_72.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b51330a7a3b654e6acb24d6985027b07281991524c4173d28744e752f672a3d +size 145748 diff --git a/2500/frame_73.jpg b/2500/frame_73.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98f1cafc84cdd455d7f02bbeaf85adc195360d2b --- /dev/null +++ b/2500/frame_73.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fab85a5987c64ee2811a5196b7f3d300157245dbad22bdce6ab0e3cba59cd35d +size 145945 diff --git a/2500/frame_74.jpg b/2500/frame_74.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d5b5fd2c254364904953d9b1563d9efc8f2603d --- /dev/null +++ b/2500/frame_74.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f69a38f3c340cfb9c856dde60e84d8918d92ec8a41bfd99d5721e4e9ede05932 +size 145382 diff --git a/2500/frame_75.jpg b/2500/frame_75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0f05cc517dc0ee44950de31e415f57d70dcfaa2 --- /dev/null +++ b/2500/frame_75.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:958c6428ee37265e65a590c09f170c0921e61aa930bb81c2fc08764e756d74c8 +size 145426 diff --git a/2500/frame_76.jpg b/2500/frame_76.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17f4a30942e3a5010b4bdd7a6aa3ad55da354556 --- /dev/null +++ b/2500/frame_76.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51b568e616c0766567c2d4ee4a64c6a1f72b19e14c454464506df7cafe72cf73 +size 145799 diff --git a/2500/frame_77.jpg b/2500/frame_77.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8971a99a1e4f505d831ce943a43b3b54324ae84b --- /dev/null +++ b/2500/frame_77.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91ad921f567c1fbca540082e94f1e909b1c43dbb0bf370a9f650388124071a92 +size 146173 diff --git a/2500/frame_78.jpg b/2500/frame_78.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e051cf8467109387b9bb8bccdab632f368e1a558 --- /dev/null +++ b/2500/frame_78.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7eeb4e3a8fc1588c52cc33e5668bf469ac69c1a9e98fc8cff89c8e9cbac7a2a8 +size 145710 diff --git a/2500/frame_79.jpg b/2500/frame_79.jpg new file mode 100644 index 0000000000000000000000000000000000000000..606b61d7938f88acab9c4e8f166cef57402cd189 --- /dev/null +++ b/2500/frame_79.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f3e3fafdbfe491451b3ac6160804b5d1f1a78e19f4ddcad58792ff9250f7be6 +size 145630 diff --git a/2500/frame_8.jpg b/2500/frame_8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a63270faab27f9ca80cebcb7bfe2364bbea9fa4a --- /dev/null +++ b/2500/frame_8.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c2415fc6df1e7b90e65f678935e8970fc67afdb93a099c340aae87435eabb95 +size 146798 diff --git a/2500/frame_80.jpg b/2500/frame_80.jpg new file mode 100644 index 0000000000000000000000000000000000000000..023e4d212e6f37d04a01a42bd1ea6f97b85f7ed9 --- /dev/null +++ b/2500/frame_80.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee4e3ac9d49190cab6588adffac9b0eaa6872459d6fd1b59547199f6dda53cd5 +size 145814 diff --git a/2500/frame_81.jpg b/2500/frame_81.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10075aad88cd08ccdf3a8f770bc40f7166dd0dbd --- /dev/null +++ b/2500/frame_81.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aefcb6223c0e74819dc1a74d2d7851681da55857c57643e9c477083f4c1ae414 +size 146330 diff --git a/2500/frame_82.jpg b/2500/frame_82.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07918074eab4efad39a48cee9d775c42e806ded0 --- /dev/null +++ b/2500/frame_82.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acfc376222b098ecad3252d8d8b8eea86c697135ac07c479c5431c9c6334c08f +size 145868 diff --git a/2500/frame_83.jpg b/2500/frame_83.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bab011c12b43628bf4fc165ec471417526641c66 --- /dev/null +++ b/2500/frame_83.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab2d21c2f83a878546a149c1753a6f44d9949db6e2f7b240bbdbbc8930175770 +size 145820 diff --git a/2500/frame_84.jpg b/2500/frame_84.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e7655a8868cac89ece8298ddecd7494698c7696 --- /dev/null +++ b/2500/frame_84.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8dfbb50a5c59d822658a7f289b4f376f4eac948f9c26fc45ff9e10291d6e164 +size 145898 diff --git a/2500/frame_85.jpg b/2500/frame_85.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6583b4eb2b5cb7c398fdfefc7f7e0d1e0b2df61 --- /dev/null +++ b/2500/frame_85.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbea3b15a412922820b20e96269e4a880274f4f32a942933592650a26d910449 +size 145988 diff --git a/2500/frame_86.jpg b/2500/frame_86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..292ed4be6b2f4b8489811f17b1fe6db2a5e75650 --- /dev/null +++ b/2500/frame_86.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f07a1842b009030fd665509beee1c8494aeb1984d28390d38f7dba7c006ffd16 +size 145775 diff --git a/2500/frame_87.jpg b/2500/frame_87.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9347849115420c8ef04059335ad60c7094f3b76d --- /dev/null +++ b/2500/frame_87.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbf654649010d13b627a767834c1f75185b6c3b04459b010031140378b823ed4 +size 145711 diff --git a/2500/frame_88.jpg b/2500/frame_88.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b9157bd7484ed07e8a0a795a7fdec159879ecfd --- /dev/null +++ b/2500/frame_88.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed9a2f9a00fd4a30d391b8e3644bac8703348bde3be128e509598c5d879b2b2a +size 145796 diff --git a/2500/frame_89.jpg b/2500/frame_89.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12902431e2e62338d54fc880919666039b703c12 --- /dev/null +++ b/2500/frame_89.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db1dc25e265c3b450d1e6a7e1c3b907e5fea87c7fd97c9292ede2ed9ac6b2f9a +size 146043 diff --git a/2500/frame_9.jpg b/2500/frame_9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fb848a25d42a2c9272377c0e5479da5390fd545 --- /dev/null +++ b/2500/frame_9.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d638a07c15d421a319c4a58cd98b148ee7c0453dfde54ad1f43572a2e377d158 +size 146771 diff --git a/2500/frame_90.jpg b/2500/frame_90.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74c094a5a8a225047ba03d39938e921a840c547d --- /dev/null +++ b/2500/frame_90.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18654c2bc49b083225cec2e69b49b4feab7a7ee0c7d8e8f9ac40137cab578f27 +size 145779 diff --git a/Honey_Regression_Final_v2.ipynb b/Honey_Regression_Final_v2.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..998719d39c45a36305e267414476cae152ff29f7 --- /dev/null +++ b/Honey_Regression_Final_v2.ipynb @@ -0,0 +1,5038 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "eb3df5ad", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\biplabd\\Anaconda3\\envs\\pyg\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "import numpy as np\n", + "import torch\n", + "from torch import nn\n", + "import torchvision.transforms as transforms\n", + "from tqdm import tqdm\n", + "from utils.loaders_viscosity import create_datasets, Dataset_3DCNN\n", + "from models.viscosity_models import CNNLayers, CNN3D\n", + "from models.feedforward import LinLayers\n", + "from utils.datastruct import CNNData, LinData, NetData\n", + "from utils.helper_fun import conv3D_output_size\n", + "from torch.optim import Adam\n", + "\n", + "from models.training import train, test\n", + "\n", + "from sklearn.metrics import r2_score\n", + "from models.training import train_epochs" + ] + }, + { + "cell_type": "markdown", + "id": "7f7c8a94", + "metadata": {}, + "source": [ + "## Dataloaders" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3dbc1027", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "length test set 33\n" + ] + }, + { + "data": { + "text/plain": [ + "\"# plots\\nx, y = next(iter(train_dl))\\nx = x.permute(0,2,3,4,1)\\n\\nplt.figure(figsize=(20,12))\\nfor k in range(x.shape[1]):\\n plt.subplot(1, x.shape[1],k+1)\\n plt.imshow(x[0,k,:,:,:].squeeze(),cmap = 'gray')\\n\"" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_dl, test_dl, val_dl = create_datasets(path = r'D:\\All_files\\pys\\AI_algos\\Mikes_Work\\viscosity-video-classification\\viscosity_reg_modeling\\new_honey_164', # absolute path\n", + " validation_split = 0.2,\n", + " test_split = 0.2,\n", + " batch_size = 5,\n", + " transform = transforms.Compose([transforms.Resize([256, 342]),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.5], std=[0.5])]),\n", + " random_seed = 112,\n", + " shuffle = True,\n", + " selected_frames = np.arange(2,62,2))\n", + "\n", + "\n", + "'''# plots\n", + "x, y = next(iter(train_dl))\n", + "x = x.permute(0,2,3,4,1)\n", + "\n", + "plt.figure(figsize=(20,12))\n", + "for k in range(x.shape[1]):\n", + " plt.subplot(1, x.shape[1],k+1)\n", + " plt.imshow(x[0,k,:,:,:].squeeze(),cmap = 'gray')\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "id": "02765816", + "metadata": {}, + "source": [ + "## Models" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "12fbad8f", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CNN3D(\n", + " (cnn3d): CNNLayers(\n", + " (layers): Sequential(\n", + " (0): Sequential(\n", + " (0): Conv3d(1, 32, kernel_size=(5, 5, 5), stride=(2, 2, 2))\n", + " (1): BatchNorm3d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (2): ReLU()\n", + " )\n", + " (1): Sequential(\n", + " (0): Conv3d(32, 48, kernel_size=(3, 3, 3), stride=(2, 2, 2))\n", + " (1): BatchNorm3d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (2): ReLU()\n", + " )\n", + " )\n", + " )\n", + " (lin): LinLayers(\n", + " (layers): Sequential(\n", + " (0): Sequential(\n", + " (0): Linear(in_features=1499904, out_features=256, bias=True)\n", + " (1): ReLU()\n", + " (2): Dropout(p=0.2, inplace=False)\n", + " )\n", + " (1): Sequential(\n", + " (0): Linear(in_features=256, out_features=256, bias=True)\n", + " (1): ReLU()\n", + " )\n", + " (2): Sequential(\n", + " (0): Linear(in_features=256, out_features=1, bias=True)\n", + " )\n", + " )\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "# CNN3D Layer's architecture\n", + "cnndata = CNNData(in_dim = 1,\n", + " n_f =[32,48],\n", + " kernel_size=[(5,5,5), (3,3,3)],\n", + " activations=[nn.ReLU(),nn.ReLU()],\n", + " bns = [True, True],\n", + " dropouts = [0, 0],\n", + " paddings = [(0,0,0),(0,0,0)],\n", + " strides = [(2,2,2),(2,2,2)])\n", + "\n", + "# Feedforward layer's architecture\n", + "lindata = LinData(in_dim = conv3D_output_size(cnndata, [30, 256, 342]),\n", + " hidden_layers= [256,256,1],\n", + " activations=[nn.ReLU(),nn.ReLU(),None],\n", + " bns=[False,False,False],\n", + " dropouts =[0.2, 0, 0])\n", + "\n", + "# combined architecture\n", + "args = NetData(cnndata, lindata)\n", + " \n", + "# CNN3D model\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "cnn3d = CNN3D(args).to(device)\n", + "print(cnn3d)" + ] + }, + { + "cell_type": "markdown", + "id": "06185dc2", + "metadata": {}, + "source": [ + "## Training" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "93bffb53", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 1/300 [01:49<9:07:25, 109.85s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 000, train loss: 4274492.9226, val loss: 3206663.2500, test loss : 4400214.0000\n", + "Epoch: 000, train r2: 0.2575, val r2: 0.2704, test r2: 0.2545\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 1%| | 2/300 [03:43<9:15:49, 111.91s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 001, train loss: 4540687.0536, val loss: 3916466.0000, test loss : 4490281.0000\n", + "Epoch: 001, train r2: 0.2122, val r2: 0.1262, test r2: 0.2353\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 1%|▏ | 3/300 [05:32<9:08:49, 110.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 002, train loss: 3934426.9226, val loss: 4222610.5000, test loss : 4146311.5000\n", + "Epoch: 002, train r2: 0.2920, val r2: 0.2602, test r2: 0.2982\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 1%|▏ | 4/300 [07:24<9:08:00, 111.08s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 003, train loss: 3723287.5327, val loss: 1981270.6250, test loss : 3828467.5000\n", + "Epoch: 003, train r2: 0.4281, val r2: 0.5509, test r2: 0.3482\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 2%|▎ | 5/300 [09:15<9:06:10, 111.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 004, train loss: 3228769.9182, val loss: 2352728.7500, test loss : 3374907.2500\n", + "Epoch: 004, train r2: 0.4653, val r2: 0.4668, test r2: 0.4234\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 2%|▎ | 6/300 [11:08<9:07:56, 111.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 005, train loss: 2991300.3601, val loss: 1650118.3750, test loss : 3186784.5000\n", + "Epoch: 005, train r2: 0.5415, val r2: 0.6456, test r2: 0.4497\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 2%|▍ | 7/300 [12:58<9:03:15, 111.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 006, train loss: 2393042.3185, val loss: 2291022.0000, test loss : 3031543.5000\n", + "Epoch: 006, train r2: 0.5346, val r2: 0.4786, test r2: 0.4798\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 3%|▍ | 8/300 [14:41<8:48:41, 108.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 007, train loss: 2260682.4792, val loss: 1549960.6250, test loss : 2257897.5000\n", + "Epoch: 007, train r2: 0.6835, val r2: 0.6904, test r2: 0.6066\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 3%|▌ | 9/300 [16:24<8:37:40, 106.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 008, train loss: 1643174.5848, val loss: 1760399.5000, test loss : 2329627.7500\n", + "Epoch: 008, train r2: 0.6801, val r2: 0.6186, test r2: 0.5998\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 3%|▌ | 10/300 [18:11<8:36:26, 106.85s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 009, train loss: 1561948.5060, val loss: 775720.3125, test loss : 1825776.1250\n", + "Epoch: 009, train r2: 0.7510, val r2: 0.8256, test r2: 0.6794\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 4%|▌ | 11/300 [19:58<8:35:02, 106.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 010, train loss: 1347368.5432, val loss: 838856.5000, test loss : 1378916.2500\n", + "Epoch: 010, train r2: 0.8334, val r2: 0.8296, test r2: 0.7592\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 4%|▋ | 12/300 [21:47<8:36:12, 107.54s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 011, train loss: 1074673.5186, val loss: 626881.7500, test loss : 1342152.8750\n", + "Epoch: 011, train r2: 0.8236, val r2: 0.8597, test r2: 0.7609\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 4%|▋ | 13/300 [23:37<8:38:37, 108.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 012, train loss: 764028.0692, val loss: 547547.4375, test loss : 906935.8750\n", + "Epoch: 012, train r2: 0.8968, val r2: 0.8928, test r2: 0.8394\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 5%|▊ | 14/300 [25:29<8:40:57, 109.29s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 013, train loss: 645933.5789, val loss: 507428.0938, test loss : 813910.3750\n", + "Epoch: 013, train r2: 0.9178, val r2: 0.8970, test r2: 0.8572\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 5%|▊ | 15/300 [27:19<8:40:21, 109.55s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 014, train loss: 549480.2121, val loss: 758520.8125, test loss : 1050635.1250\n", + "Epoch: 014, train r2: 0.8923, val r2: 0.8309, test r2: 0.8204\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 5%|▉ | 16/300 [29:10<8:40:13, 109.91s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 015, train loss: 541406.5499, val loss: 505376.7812, test loss : 776183.8750\n", + "Epoch: 015, train r2: 0.8949, val r2: 0.8860, test r2: 0.8609\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 6%|▉ | 17/300 [31:01<8:40:05, 110.27s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 016, train loss: 475607.0725, val loss: 444884.1562, test loss : 710100.6250\n", + "Epoch: 016, train r2: 0.9403, val r2: 0.9001, test r2: 0.8817\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 6%|█ | 18/300 [32:53<8:41:29, 110.96s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 017, train loss: 500315.5539, val loss: 359908.6562, test loss : 624091.3125\n", + "Epoch: 017, train r2: 0.9539, val r2: 0.9196, test r2: 0.8966\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 6%|█ | 19/300 [34:45<8:40:29, 111.14s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 018, train loss: 389259.3264, val loss: 480812.6562, test loss : 571490.3750\n", + "Epoch: 018, train r2: 0.9487, val r2: 0.9323, test r2: 0.9017\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 7%|█▏ | 20/300 [36:40<8:44:27, 112.38s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 019, train loss: 364233.1643, val loss: 338118.7812, test loss : 595508.6875\n", + "Epoch: 019, train r2: 0.9637, val r2: 0.9268, test r2: 0.9022\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 7%|█▏ | 21/300 [38:28<8:36:46, 111.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 020, train loss: 392436.1730, val loss: 379300.6562, test loss : 626270.6875\n", + "Epoch: 020, train r2: 0.9631, val r2: 0.9176, test r2: 0.8986\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 7%|█▏ | 22/300 [40:18<8:33:27, 110.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 021, train loss: 457044.1552, val loss: 313321.8438, test loss : 563794.8750\n", + "Epoch: 021, train r2: 0.9684, val r2: 0.9295, test r2: 0.9079\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 8%|█▎ | 23/300 [42:08<8:29:45, 110.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 022, train loss: 361686.4991, val loss: 808470.9375, test loss : 991936.0625\n", + "Epoch: 022, train r2: 0.8562, val r2: 0.8394, test r2: 0.8236\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 8%|█▎ | 24/300 [43:58<8:27:02, 110.23s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 023, train loss: 261427.2818, val loss: 331737.3750, test loss : 553101.9375\n", + "Epoch: 023, train r2: 0.9648, val r2: 0.9253, test r2: 0.9111\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 8%|█▍ | 25/300 [45:48<8:25:42, 110.34s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 024, train loss: 390974.5724, val loss: 330643.2188, test loss : 502931.8438\n", + "Epoch: 024, train r2: 0.9712, val r2: 0.9303, test r2: 0.9193\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 9%|█▍ | 26/300 [47:41<8:26:46, 110.97s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 025, train loss: 247646.9860, val loss: 350876.5312, test loss : 542204.3750\n", + "Epoch: 025, train r2: 0.9686, val r2: 0.9254, test r2: 0.9124\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 9%|█▌ | 27/300 [49:30<8:22:25, 110.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 026, train loss: 273634.2016, val loss: 263317.7812, test loss : 462578.3438\n", + "Epoch: 026, train r2: 0.9737, val r2: 0.9418, test r2: 0.9223\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 9%|█▌ | 28/300 [51:28<8:31:07, 112.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 027, train loss: 238405.4280, val loss: 808061.6875, test loss : 575342.3125\n", + "Epoch: 027, train r2: 0.9699, val r2: 0.9202, test r2: 0.9058\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 10%|█▋ | 29/300 [53:21<8:29:42, 112.85s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 028, train loss: 225046.1259, val loss: 224800.8125, test loss : 439290.0938\n", + "Epoch: 028, train r2: 0.9786, val r2: 0.9496, test r2: 0.9270\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 10%|█▋ | 30/300 [55:16<8:30:34, 113.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 029, train loss: 271467.9493, val loss: 1593275.1250, test loss : 1514306.7500\n", + "Epoch: 029, train r2: 0.7178, val r2: 0.6693, test r2: 0.7292\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 10%|█▊ | 31/300 [57:06<8:23:57, 112.41s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 030, train loss: 325431.6839, val loss: 523626.7500, test loss : 690028.1875\n", + "Epoch: 030, train r2: 0.9394, val r2: 0.8828, test r2: 0.8888\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 11%|█▊ | 32/300 [58:57<8:20:04, 111.96s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 031, train loss: 288475.1017, val loss: 254087.6875, test loss : 476156.9688\n", + "Epoch: 031, train r2: 0.9791, val r2: 0.9424, test r2: 0.9210\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 11%|█▋ | 33/300 [1:00:47<8:15:54, 111.44s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 032, train loss: 268110.2640, val loss: 392643.9062, test loss : 501362.7188\n", + "Epoch: 032, train r2: 0.9395, val r2: 0.9293, test r2: 0.9118\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 11%|█▋ | 34/300 [1:02:37<8:12:14, 111.03s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 033, train loss: 212246.7926, val loss: 976262.1875, test loss : 592245.5000\n", + "Epoch: 033, train r2: 0.9582, val r2: 0.9030, test r2: 0.9050\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 12%|█▊ | 35/300 [1:04:27<8:08:55, 110.70s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 034, train loss: 212452.0249, val loss: 342979.7188, test loss : 453344.2500\n", + "Epoch: 034, train r2: 0.9783, val r2: 0.9308, test r2: 0.9281\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 12%|█▊ | 36/300 [1:06:16<8:05:13, 110.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 035, train loss: 188403.1038, val loss: 203123.8125, test loss : 358235.9688\n", + "Epoch: 035, train r2: 0.9853, val r2: 0.9558, test r2: 0.9414\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 12%|█▊ | 37/300 [1:08:06<8:02:37, 110.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 036, train loss: 151882.7333, val loss: 291139.2188, test loss : 426948.7500\n", + "Epoch: 036, train r2: 0.9825, val r2: 0.9413, test r2: 0.9311\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 13%|█▉ | 38/300 [1:09:54<7:57:33, 109.37s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 037, train loss: 236403.0422, val loss: 640334.0625, test loss : 790076.6250\n", + "Epoch: 037, train r2: 0.8898, val r2: 0.8666, test r2: 0.8605\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 13%|█▉ | 39/300 [1:11:41<7:52:59, 108.73s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 038, train loss: 184861.2145, val loss: 270351.7812, test loss : 424100.3125\n", + "Epoch: 038, train r2: 0.9845, val r2: 0.9391, test r2: 0.9322\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 13%|██ | 40/300 [1:13:33<7:56:05, 109.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 039, train loss: 191831.3307, val loss: 336728.7812, test loss : 507202.0938\n", + "Epoch: 039, train r2: 0.9750, val r2: 0.9236, test r2: 0.9185\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 14%|██ | 41/300 [1:15:23<7:53:25, 109.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 040, train loss: 215466.2297, val loss: 694807.1250, test loss : 737112.0625\n", + "Epoch: 040, train r2: 0.8941, val r2: 0.8709, test r2: 0.8698\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 14%|██ | 42/300 [1:17:12<7:51:07, 109.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 041, train loss: 200084.2584, val loss: 322081.0625, test loss : 464033.4688\n", + "Epoch: 041, train r2: 0.9833, val r2: 0.9376, test r2: 0.9240\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 14%|██▏ | 43/300 [1:19:02<7:50:10, 109.77s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 042, train loss: 157676.3764, val loss: 388380.1250, test loss : 418590.2812\n", + "Epoch: 042, train r2: 0.9623, val r2: 0.9322, test r2: 0.9278\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 15%|██▏ | 44/300 [1:20:53<7:49:18, 109.99s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 043, train loss: 197874.8055, val loss: 512995.6250, test loss : 650919.1875\n", + "Epoch: 043, train r2: 0.9552, val r2: 0.8930, test r2: 0.8972\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 15%|██▎ | 45/300 [1:22:42<7:46:25, 109.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 044, train loss: 270490.0203, val loss: 200896.5156, test loss : 361826.4375\n", + "Epoch: 044, train r2: 0.9875, val r2: 0.9555, test r2: 0.9406\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 15%|██▎ | 46/300 [1:24:31<7:43:37, 109.52s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 045, train loss: 221742.3655, val loss: 254442.4531, test loss : 455671.0625\n", + "Epoch: 045, train r2: 0.9867, val r2: 0.9421, test r2: 0.9255\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 16%|██▎ | 47/300 [1:26:22<7:43:21, 109.89s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 046, train loss: 243158.1425, val loss: 299450.6875, test loss : 442311.4062\n", + "Epoch: 046, train r2: 0.9542, val r2: 0.9364, test r2: 0.9229\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 16%|██▍ | 48/300 [1:28:11<7:40:51, 109.73s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 047, train loss: 257558.2760, val loss: 543164.1250, test loss : 611667.8750\n", + "Epoch: 047, train r2: 0.9629, val r2: 0.8939, test r2: 0.9018\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 16%|██▍ | 49/300 [1:30:00<7:38:21, 109.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 048, train loss: 214719.0956, val loss: 232339.4531, test loss : 332446.7812\n", + "Epoch: 048, train r2: 0.9865, val r2: 0.9540, test r2: 0.9443\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 17%|██▌ | 50/300 [1:31:54<7:41:44, 110.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 049, train loss: 162059.4637, val loss: 295493.9062, test loss : 436076.8125\n", + "Epoch: 049, train r2: 0.9809, val r2: 0.9335, test r2: 0.9320\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 17%|██▌ | 51/300 [1:33:43<7:38:14, 110.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 050, train loss: 167722.3993, val loss: 455145.9062, test loss : 595372.5625\n", + "Epoch: 050, train r2: 0.9609, val r2: 0.8971, test r2: 0.9061\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 17%|██▌ | 52/300 [1:35:33<7:34:50, 110.04s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 051, train loss: 160521.1073, val loss: 436603.2812, test loss : 535822.6875\n", + "Epoch: 051, train r2: 0.9764, val r2: 0.9151, test r2: 0.9137\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 18%|██▋ | 53/300 [1:37:22<7:31:55, 109.78s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 052, train loss: 180622.5389, val loss: 327534.4375, test loss : 460541.8125\n", + "Epoch: 052, train r2: 0.9564, val r2: 0.9258, test r2: 0.9195\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 18%|██▋ | 54/300 [1:39:09<7:27:31, 109.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 053, train loss: 183151.3266, val loss: 247970.6094, test loss : 376593.8438\n", + "Epoch: 053, train r2: 0.9888, val r2: 0.9438, test r2: 0.9397\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 18%|██▊ | 55/300 [1:40:58<7:25:26, 109.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 054, train loss: 198509.5595, val loss: 227842.8750, test loss : 354623.2188\n", + "Epoch: 054, train r2: 0.9926, val r2: 0.9543, test r2: 0.9423\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 19%|██▊ | 56/300 [1:42:50<7:26:24, 109.77s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 055, train loss: 195545.4075, val loss: 243615.1719, test loss : 378647.4062\n", + "Epoch: 055, train r2: 0.9922, val r2: 0.9445, test r2: 0.9408\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 19%|██▊ | 57/300 [1:44:38<7:22:06, 109.16s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 056, train loss: 171923.2473, val loss: 282997.5312, test loss : 402044.4375\n", + "Epoch: 056, train r2: 0.9786, val r2: 0.9373, test r2: 0.9338\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 19%|██▉ | 58/300 [1:46:26<7:19:06, 108.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 057, train loss: 123308.0633, val loss: 184728.9844, test loss : 317388.2188\n", + "Epoch: 057, train r2: 0.9917, val r2: 0.9589, test r2: 0.9493\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 20%|██▉ | 59/300 [1:48:16<7:19:27, 109.41s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 058, train loss: 126985.3024, val loss: 340456.4062, test loss : 457698.9375\n", + "Epoch: 058, train r2: 0.9845, val r2: 0.9326, test r2: 0.9292\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 20%|███ | 60/300 [1:50:09<7:21:03, 110.27s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 059, train loss: 142725.9963, val loss: 240191.2500, test loss : 415722.0000\n", + "Epoch: 059, train r2: 0.9933, val r2: 0.9467, test r2: 0.9334\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 20%|███ | 61/300 [1:51:54<7:12:55, 108.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 060, train loss: 184504.4544, val loss: 327037.8125, test loss : 373445.0938\n", + "Epoch: 060, train r2: 0.9704, val r2: 0.9395, test r2: 0.9363\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 21%|███ | 62/300 [1:53:39<7:07:11, 107.69s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 061, train loss: 175095.3283, val loss: 232376.8750, test loss : 390770.6875\n", + "Epoch: 061, train r2: 0.9919, val r2: 0.9471, test r2: 0.9381\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 21%|███▏ | 63/300 [1:55:23<7:01:34, 106.73s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 062, train loss: 105187.5937, val loss: 263082.8438, test loss : 356483.1875\n", + "Epoch: 062, train r2: 0.9929, val r2: 0.9551, test r2: 0.9424\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 21%|███▏ | 64/300 [1:57:08<6:56:48, 105.97s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 063, train loss: 114195.9180, val loss: 275956.5312, test loss : 380184.8438\n", + "Epoch: 063, train r2: 0.9903, val r2: 0.9433, test r2: 0.9385\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 22%|███▎ | 65/300 [1:58:53<6:54:29, 105.83s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 064, train loss: 146778.7567, val loss: 184500.1094, test loss : 302468.7500\n", + "Epoch: 064, train r2: 0.9935, val r2: 0.9587, test r2: 0.9505\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 22%|███▎ | 66/300 [2:00:39<6:52:23, 105.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 065, train loss: 190850.6695, val loss: 242826.7656, test loss : 407441.4375\n", + "Epoch: 065, train r2: 0.9906, val r2: 0.9487, test r2: 0.9338\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 22%|███▎ | 67/300 [2:02:24<6:49:54, 105.55s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 066, train loss: 139100.6251, val loss: 193405.6250, test loss : 324947.6562\n", + "Epoch: 066, train r2: 0.9951, val r2: 0.9581, test r2: 0.9472\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 23%|███▍ | 68/300 [2:04:10<6:49:19, 105.86s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 067, train loss: 169263.2204, val loss: 448521.5312, test loss : 575590.6250\n", + "Epoch: 067, train r2: 0.9645, val r2: 0.8984, test r2: 0.9072\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 23%|███▍ | 69/300 [2:05:55<6:45:59, 105.45s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 068, train loss: 149675.3205, val loss: 496486.1562, test loss : 511164.1875\n", + "Epoch: 068, train r2: 0.9305, val r2: 0.9042, test r2: 0.9095\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 23%|███▌ | 70/300 [2:07:42<6:45:46, 105.85s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 069, train loss: 125260.9804, val loss: 213267.1406, test loss : 344770.7812\n", + "Epoch: 069, train r2: 0.9887, val r2: 0.9520, test r2: 0.9431\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 24%|███▌ | 71/300 [2:09:29<6:45:38, 106.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 070, train loss: 127189.0690, val loss: 155336.9844, test loss : 301275.7188\n", + "Epoch: 070, train r2: 0.9930, val r2: 0.9652, test r2: 0.9506\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 24%|███▌ | 72/300 [2:11:14<6:42:37, 105.95s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 071, train loss: 129350.9779, val loss: 244490.3281, test loss : 340578.6562\n", + "Epoch: 071, train r2: 0.9935, val r2: 0.9523, test r2: 0.9465\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 24%|███▋ | 73/300 [2:13:00<6:40:57, 105.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 072, train loss: 161380.6352, val loss: 313484.6562, test loss : 473220.5625\n", + "Epoch: 072, train r2: 0.9846, val r2: 0.9295, test r2: 0.9263\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 25%|███▋ | 74/300 [2:14:46<6:39:23, 106.03s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 073, train loss: 160648.3015, val loss: 273589.9062, test loss : 447357.5938\n", + "Epoch: 073, train r2: 0.9905, val r2: 0.9377, test r2: 0.9278\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 25%|███▊ | 75/300 [2:16:32<6:36:59, 105.86s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 074, train loss: 131119.9616, val loss: 411595.3438, test loss : 392116.3438\n", + "Epoch: 074, train r2: 0.9731, val r2: 0.9354, test r2: 0.9331\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 25%|███▊ | 76/300 [2:18:18<6:35:23, 105.91s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 075, train loss: 178799.3916, val loss: 394150.4688, test loss : 507701.2812\n", + "Epoch: 075, train r2: 0.9720, val r2: 0.9185, test r2: 0.9189\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 26%|███▊ | 77/300 [2:20:04<6:33:40, 105.92s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 076, train loss: 138429.8584, val loss: 319659.0938, test loss : 464828.1562\n", + "Epoch: 076, train r2: 0.9888, val r2: 0.9287, test r2: 0.9252\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 26%|███▉ | 78/300 [2:21:49<6:31:24, 105.79s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 077, train loss: 101138.5343, val loss: 265005.7812, test loss : 364137.0938\n", + "Epoch: 077, train r2: 0.9876, val r2: 0.9432, test r2: 0.9387\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 26%|███▉ | 79/300 [2:23:36<6:30:44, 106.08s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 078, train loss: 135610.2838, val loss: 280353.9688, test loss : 331703.4375\n", + "Epoch: 078, train r2: 0.9888, val r2: 0.9441, test r2: 0.9443\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 27%|████ | 80/300 [2:25:34<6:42:02, 109.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 079, train loss: 111544.4720, val loss: 363735.2500, test loss : 436353.9375\n", + "Epoch: 079, train r2: 0.9855, val r2: 0.9248, test r2: 0.9312\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 27%|████ | 81/300 [2:27:22<6:38:28, 109.17s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 080, train loss: 129121.7445, val loss: 305617.5938, test loss : 400430.2188\n", + "Epoch: 080, train r2: 0.9890, val r2: 0.9389, test r2: 0.9360\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 27%|████ | 82/300 [2:29:07<6:32:30, 108.03s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 081, train loss: 149079.8652, val loss: 343487.5000, test loss : 483052.0625\n", + "Epoch: 081, train r2: 0.9826, val r2: 0.9258, test r2: 0.9220\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 28%|████▏ | 83/300 [2:30:50<6:24:17, 106.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 082, train loss: 164701.2023, val loss: 257849.9531, test loss : 379985.8125\n", + "Epoch: 082, train r2: 0.9949, val r2: 0.9471, test r2: 0.9380\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 28%|████▏ | 84/300 [2:32:33<6:18:59, 105.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 083, train loss: 163619.5027, val loss: 214482.7656, test loss : 319643.5938\n", + "Epoch: 083, train r2: 0.9872, val r2: 0.9571, test r2: 0.9455\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 28%|████▎ | 85/300 [2:34:16<6:14:57, 104.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 084, train loss: 156351.0835, val loss: 234119.4531, test loss : 432351.6875\n", + "Epoch: 084, train r2: 0.9781, val r2: 0.9484, test r2: 0.9256\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 29%|████▎ | 86/300 [2:35:58<6:10:35, 103.90s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 085, train loss: 165290.4870, val loss: 416387.7188, test loss : 513222.4375\n", + "Epoch: 085, train r2: 0.9771, val r2: 0.9162, test r2: 0.9199\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 29%|████▎ | 87/300 [2:37:39<6:05:49, 103.05s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 086, train loss: 209717.0724, val loss: 262358.3750, test loss : 496264.8125\n", + "Epoch: 086, train r2: 0.9792, val r2: 0.9414, test r2: 0.9148\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 29%|████▍ | 88/300 [2:39:23<6:05:01, 103.31s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 087, train loss: 126061.3678, val loss: 214102.0781, test loss : 314349.8125\n", + "Epoch: 087, train r2: 0.9950, val r2: 0.9589, test r2: 0.9499\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 30%|████▍ | 89/300 [2:41:10<6:07:20, 104.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 088, train loss: 227312.2776, val loss: 588302.0000, test loss : 480484.7500\n", + "Epoch: 088, train r2: 0.9760, val r2: 0.9277, test r2: 0.9227\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 30%|████▌ | 90/300 [2:42:57<6:07:48, 105.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 089, train loss: 141925.7484, val loss: 292317.4375, test loss : 407211.0938\n", + "Epoch: 089, train r2: 0.9952, val r2: 0.9413, test r2: 0.9350\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 30%|████▌ | 91/300 [2:44:43<6:07:20, 105.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 090, train loss: 133176.4393, val loss: 242586.7344, test loss : 432830.9062\n", + "Epoch: 090, train r2: 0.9796, val r2: 0.9458, test r2: 0.9257\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 31%|████▌ | 92/300 [2:46:27<6:03:58, 104.99s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 091, train loss: 174983.3419, val loss: 396960.5938, test loss : 486965.5625\n", + "Epoch: 091, train r2: 0.9815, val r2: 0.9210, test r2: 0.9227\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 31%|████▋ | 93/300 [2:48:10<6:00:18, 104.44s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 092, train loss: 197366.9301, val loss: 509278.1562, test loss : 612266.5625\n", + "Epoch: 092, train r2: 0.9658, val r2: 0.8914, test r2: 0.9004\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 31%|████▋ | 94/300 [2:49:51<5:55:18, 103.49s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 093, train loss: 203831.8039, val loss: 564526.6250, test loss : 679809.0000\n", + "Epoch: 093, train r2: 0.9555, val r2: 0.8718, test r2: 0.8905\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 32%|████▊ | 95/300 [2:51:34<5:53:02, 103.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 094, train loss: 202326.9013, val loss: 225690.7656, test loss : 379987.2188\n", + "Epoch: 094, train r2: 0.9948, val r2: 0.9520, test r2: 0.9368\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 32%|████▊ | 96/300 [2:53:17<5:50:57, 103.22s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 095, train loss: 137668.5286, val loss: 501272.5938, test loss : 411950.0312\n", + "Epoch: 095, train r2: 0.9636, val r2: 0.9300, test r2: 0.9279\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 32%|████▊ | 97/300 [2:55:01<5:50:17, 103.54s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 096, train loss: 143799.9808, val loss: 307549.8125, test loss : 446354.5000\n", + "Epoch: 096, train r2: 0.9898, val r2: 0.9379, test r2: 0.9276\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 33%|████▉ | 98/300 [2:56:45<5:48:57, 103.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 097, train loss: 121733.9399, val loss: 321550.7812, test loss : 460630.5000\n", + "Epoch: 097, train r2: 0.9867, val r2: 0.9294, test r2: 0.9255\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 33%|████▉ | 99/300 [2:58:30<5:48:15, 103.96s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 098, train loss: 120936.9121, val loss: 267212.4062, test loss : 385436.6562\n", + "Epoch: 098, train r2: 0.9938, val r2: 0.9405, test r2: 0.9374\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 33%|████▋ | 100/300 [3:00:20<5:52:05, 105.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 099, train loss: 121237.9653, val loss: 1559905.8750, test loss : 1400055.1250\n", + "Epoch: 099, train r2: 0.7513, val r2: 0.6609, test r2: 0.7497\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 34%|████▋ | 101/300 [3:02:05<5:50:27, 105.67s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 100, train loss: 137222.3865, val loss: 303758.3438, test loss : 431210.8125\n", + "Epoch: 100, train r2: 0.9913, val r2: 0.9397, test r2: 0.9296\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 34%|████▊ | 102/300 [3:03:52<5:49:44, 105.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 101, train loss: 137958.4064, val loss: 408041.1562, test loss : 505721.2812\n", + "Epoch: 101, train r2: 0.9709, val r2: 0.9076, test r2: 0.9196\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 34%|████▊ | 103/300 [3:05:44<5:54:13, 107.89s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 102, train loss: 144620.2964, val loss: 370949.5000, test loss : 461580.2188\n", + "Epoch: 102, train r2: 0.9809, val r2: 0.9187, test r2: 0.9263\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 35%|████▊ | 104/300 [3:07:30<5:50:44, 107.37s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 103, train loss: 175205.9388, val loss: 216317.8750, test loss : 320743.8438\n", + "Epoch: 103, train r2: 0.9855, val r2: 0.9517, test r2: 0.9450\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 35%|████▉ | 105/300 [3:09:18<5:48:51, 107.34s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 104, train loss: 141740.8505, val loss: 295955.2188, test loss : 411957.8438\n", + "Epoch: 104, train r2: 0.9748, val r2: 0.9446, test r2: 0.9280\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 35%|████▉ | 106/300 [3:11:03<5:44:36, 106.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 105, train loss: 126811.6662, val loss: 228611.2656, test loss : 317187.6875\n", + "Epoch: 105, train r2: 0.9848, val r2: 0.9496, test r2: 0.9458\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 36%|████▉ | 107/300 [3:12:49<5:43:10, 106.69s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 106, train loss: 80616.9820, val loss: 322456.2188, test loss : 434358.9688\n", + "Epoch: 106, train r2: 0.9876, val r2: 0.9267, test r2: 0.9295\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 36%|█████ | 108/300 [3:14:35<5:40:29, 106.41s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 107, train loss: 100242.3198, val loss: 419923.8438, test loss : 464210.8438\n", + "Epoch: 107, train r2: 0.9537, val r2: 0.9075, test r2: 0.9188\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 36%|█████ | 109/300 [3:16:21<5:38:21, 106.29s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 108, train loss: 137638.9869, val loss: 359504.8438, test loss : 416286.5625\n", + "Epoch: 108, train r2: 0.9921, val r2: 0.9328, test r2: 0.9336\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 37%|█████▏ | 110/300 [3:18:12<5:40:47, 107.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 109, train loss: 178980.3816, val loss: 205023.3594, test loss : 267964.5000\n", + "Epoch: 109, train r2: 0.9914, val r2: 0.9534, test r2: 0.9559\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 37%|█████▏ | 111/300 [3:19:57<5:36:38, 106.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 110, train loss: 123319.5958, val loss: 213841.8281, test loss : 315268.7188\n", + "Epoch: 110, train r2: 0.9969, val r2: 0.9523, test r2: 0.9497\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 37%|█████▏ | 112/300 [3:21:42<5:32:48, 106.21s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 111, train loss: 121884.9718, val loss: 241884.5781, test loss : 349704.2500\n", + "Epoch: 111, train r2: 0.9932, val r2: 0.9488, test r2: 0.9442\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 38%|█████▎ | 113/300 [3:23:26<5:29:27, 105.71s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 112, train loss: 122669.3720, val loss: 333587.5938, test loss : 448219.3125\n", + "Epoch: 112, train r2: 0.9916, val r2: 0.9352, test r2: 0.9277\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 38%|█████▎ | 114/300 [3:25:11<5:26:37, 105.36s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 113, train loss: 112134.4226, val loss: 640469.0625, test loss : 381259.3438\n", + "Epoch: 113, train r2: 0.9915, val r2: 0.9461, test r2: 0.9403\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 38%|█████▎ | 115/300 [3:26:54<5:22:59, 104.76s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 114, train loss: 129641.6177, val loss: 309005.7188, test loss : 455935.6562\n", + "Epoch: 114, train r2: 0.9875, val r2: 0.9304, test r2: 0.9279\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 39%|█████▍ | 116/300 [3:28:38<5:20:21, 104.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 115, train loss: 134696.6591, val loss: 635868.5000, test loss : 594231.5625\n", + "Epoch: 115, train r2: 0.9641, val r2: 0.8907, test r2: 0.9053\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 39%|█████▍ | 117/300 [3:30:22<5:17:55, 104.24s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 116, train loss: 84630.5378, val loss: 238333.6406, test loss : 355117.3438\n", + "Epoch: 116, train r2: 0.9953, val r2: 0.9470, test r2: 0.9434\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 39%|█████▌ | 118/300 [3:32:06<5:16:26, 104.32s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 117, train loss: 174407.6795, val loss: 270470.4375, test loss : 303925.6562\n", + "Epoch: 117, train r2: 0.9885, val r2: 0.9472, test r2: 0.9496\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 40%|█████▌ | 119/300 [3:33:50<5:14:25, 104.23s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 118, train loss: 143822.9493, val loss: 346783.4688, test loss : 498874.0000\n", + "Epoch: 118, train r2: 0.9805, val r2: 0.9221, test r2: 0.9202\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 40%|█████▌ | 120/300 [3:35:39<5:16:27, 105.49s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 119, train loss: 124751.8904, val loss: 427488.1562, test loss : 408403.1875\n", + "Epoch: 119, train r2: 0.9843, val r2: 0.9354, test r2: 0.9330\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 40%|█████▋ | 121/300 [3:37:25<5:15:21, 105.71s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 120, train loss: 135447.4336, val loss: 283498.9062, test loss : 363998.0000\n", + "Epoch: 120, train r2: 0.9715, val r2: 0.9356, test r2: 0.9367\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 41%|█████▋ | 122/300 [3:39:12<5:14:56, 106.16s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 121, train loss: 165906.7026, val loss: 321105.0938, test loss : 375284.9688\n", + "Epoch: 121, train r2: 0.9965, val r2: 0.9495, test r2: 0.9383\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 41%|█████▋ | 123/300 [3:40:59<5:13:30, 106.27s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 122, train loss: 165519.0493, val loss: 252905.0781, test loss : 357842.8125\n", + "Epoch: 122, train r2: 0.9972, val r2: 0.9489, test r2: 0.9418\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 41%|█████▊ | 124/300 [3:42:46<5:12:44, 106.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 123, train loss: 123927.3125, val loss: 241552.2656, test loss : 363955.4062\n", + "Epoch: 123, train r2: 0.9911, val r2: 0.9451, test r2: 0.9394\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 42%|█████▊ | 125/300 [3:44:31<5:09:06, 105.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 124, train loss: 177239.0577, val loss: 286833.4688, test loss : 417159.4688\n", + "Epoch: 124, train r2: 0.9927, val r2: 0.9363, test r2: 0.9338\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 42%|█████▉ | 126/300 [3:46:19<5:09:34, 106.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 125, train loss: 122459.8563, val loss: 1047027.3125, test loss : 612186.5625\n", + "Epoch: 125, train r2: 0.9708, val r2: 0.8970, test r2: 0.9046\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 42%|█████▉ | 127/300 [3:48:07<5:08:32, 107.01s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 126, train loss: 125085.2040, val loss: 212592.8281, test loss : 348959.0312\n", + "Epoch: 126, train r2: 0.9974, val r2: 0.9555, test r2: 0.9430\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 43%|█████▉ | 128/300 [3:49:54<5:06:40, 106.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 127, train loss: 146806.6271, val loss: 1013018.8125, test loss : 1136250.6250\n", + "Epoch: 127, train r2: 0.8155, val r2: 0.7753, test r2: 0.7991\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 43%|██████ | 129/300 [3:51:42<5:05:40, 107.26s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 128, train loss: 142562.1131, val loss: 368619.6250, test loss : 482304.7188\n", + "Epoch: 128, train r2: 0.9827, val r2: 0.9258, test r2: 0.9243\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 43%|██████ | 130/300 [3:53:33<5:07:21, 108.48s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 129, train loss: 139179.7673, val loss: 249947.7969, test loss : 378670.7812\n", + "Epoch: 129, train r2: 0.9950, val r2: 0.9432, test r2: 0.9402\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 44%|██████ | 131/300 [3:55:21<5:04:53, 108.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 130, train loss: 128446.7841, val loss: 417907.4062, test loss : 546910.8125\n", + "Epoch: 130, train r2: 0.9769, val r2: 0.9087, test r2: 0.9134\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 44%|██████▏ | 132/300 [3:57:08<5:02:20, 107.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 131, train loss: 102015.0515, val loss: 270656.8750, test loss : 344460.4375\n", + "Epoch: 131, train r2: 0.9895, val r2: 0.9387, test r2: 0.9442\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 44%|██████▏ | 133/300 [3:58:59<5:03:31, 109.05s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 132, train loss: 101659.5770, val loss: 234138.3750, test loss : 339099.5625\n", + "Epoch: 132, train r2: 0.9983, val r2: 0.9533, test r2: 0.9462\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 45%|██████▎ | 134/300 [4:00:52<5:04:22, 110.01s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 133, train loss: 203473.0317, val loss: 603354.0000, test loss : 711202.4375\n", + "Epoch: 133, train r2: 0.9473, val r2: 0.8627, test r2: 0.8835\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 45%|██████▎ | 135/300 [4:02:39<5:00:25, 109.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 134, train loss: 155772.2500, val loss: 509697.9062, test loss : 472069.4688\n", + "Epoch: 134, train r2: 0.9776, val r2: 0.9239, test r2: 0.9235\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 45%|██████▎ | 136/300 [4:04:25<4:55:44, 108.20s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 135, train loss: 147808.5523, val loss: 208663.4531, test loss : 305810.6875\n", + "Epoch: 135, train r2: 0.9939, val r2: 0.9558, test r2: 0.9493\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 46%|██████▍ | 137/300 [4:06:13<4:53:32, 108.05s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 136, train loss: 159942.9671, val loss: 301050.2812, test loss : 358645.7188\n", + "Epoch: 136, train r2: 0.9692, val r2: 0.9488, test r2: 0.9369\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 46%|██████▍ | 138/300 [4:07:59<4:50:18, 107.52s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 137, train loss: 221704.8306, val loss: 421423.2188, test loss : 468413.2188\n", + "Epoch: 137, train r2: 0.9768, val r2: 0.9131, test r2: 0.9257\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 46%|██████▍ | 139/300 [4:09:47<4:48:51, 107.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 138, train loss: 150380.0616, val loss: 208282.1875, test loss : 354865.5312\n", + "Epoch: 138, train r2: 0.9835, val r2: 0.9552, test r2: 0.9403\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 47%|██████▌ | 140/300 [4:11:37<4:49:07, 108.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 139, train loss: 175607.5585, val loss: 859015.0625, test loss : 633995.0000\n", + "Epoch: 139, train r2: 0.9090, val r2: 0.8604, test r2: 0.8871\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 47%|██████▌ | 141/300 [4:13:26<4:47:18, 108.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 140, train loss: 127183.9692, val loss: 222280.4531, test loss : 363087.9688\n", + "Epoch: 140, train r2: 0.9930, val r2: 0.9505, test r2: 0.9425\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 47%|██████▋ | 142/300 [4:15:13<4:44:40, 108.10s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 141, train loss: 133329.7857, val loss: 703641.8125, test loss : 743272.6250\n", + "Epoch: 141, train r2: 0.9377, val r2: 0.8508, test r2: 0.8810\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 48%|██████▋ | 143/300 [4:17:00<4:42:09, 107.83s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 142, train loss: 143360.3273, val loss: 265068.6875, test loss : 364730.9375\n", + "Epoch: 142, train r2: 0.9942, val r2: 0.9397, test r2: 0.9415\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 48%|██████▋ | 144/300 [4:18:48<4:40:37, 107.94s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 143, train loss: 122585.7474, val loss: 192245.7031, test loss : 301627.8438\n", + "Epoch: 143, train r2: 0.9936, val r2: 0.9563, test r2: 0.9501\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 48%|██████▊ | 145/300 [4:20:36<4:39:03, 108.02s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 144, train loss: 103165.4768, val loss: 241478.2031, test loss : 333012.1562\n", + "Epoch: 144, train r2: 0.9974, val r2: 0.9540, test r2: 0.9466\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 49%|██████▊ | 146/300 [4:22:26<4:38:17, 108.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 145, train loss: 77309.9853, val loss: 245035.8281, test loss : 356220.6562\n", + "Epoch: 145, train r2: 0.9970, val r2: 0.9534, test r2: 0.9432\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 49%|██████▊ | 147/300 [4:24:14<4:36:34, 108.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 146, train loss: 95317.3814, val loss: 195698.7500, test loss : 320952.2188\n", + "Epoch: 146, train r2: 0.9975, val r2: 0.9560, test r2: 0.9482\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 49%|██████▉ | 148/300 [4:26:02<4:34:07, 108.21s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 147, train loss: 99675.6960, val loss: 241806.8906, test loss : 333168.9375\n", + "Epoch: 147, train r2: 0.9979, val r2: 0.9510, test r2: 0.9479\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 50%|██████▉ | 149/300 [4:27:50<4:31:58, 108.07s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 148, train loss: 129877.6245, val loss: 543266.7500, test loss : 620913.6875\n", + "Epoch: 148, train r2: 0.9653, val r2: 0.8836, test r2: 0.9023\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 50%|███████ | 150/300 [4:29:40<4:32:02, 108.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 149, train loss: 123638.0362, val loss: 357242.9688, test loss : 451203.0938\n", + "Epoch: 149, train r2: 0.9824, val r2: 0.9236, test r2: 0.9275\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 50%|███████ | 151/300 [4:31:26<4:28:15, 108.03s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 150, train loss: 129253.6232, val loss: 211770.9531, test loss : 331099.8125\n", + "Epoch: 150, train r2: 0.9957, val r2: 0.9553, test r2: 0.9457\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 51%|███████ | 152/300 [4:33:11<4:23:55, 107.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 151, train loss: 115507.2336, val loss: 247512.0781, test loss : 359191.0938\n", + "Epoch: 151, train r2: 0.9961, val r2: 0.9528, test r2: 0.9423\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 51%|███████▏ | 153/300 [4:34:56<4:20:39, 106.39s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 152, train loss: 103415.1033, val loss: 256026.0625, test loss : 391002.7812\n", + "Epoch: 152, train r2: 0.9906, val r2: 0.9418, test r2: 0.9385\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 51%|███████▏ | 154/300 [4:36:44<4:19:46, 106.76s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 153, train loss: 95559.5996, val loss: 238214.7969, test loss : 382746.0000\n", + "Epoch: 153, train r2: 0.9949, val r2: 0.9463, test r2: 0.9398\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 52%|███████▏ | 155/300 [4:38:36<4:22:03, 108.44s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 154, train loss: 122010.4205, val loss: 377250.7500, test loss : 514213.4062\n", + "Epoch: 154, train r2: 0.9807, val r2: 0.9207, test r2: 0.9188\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 52%|███████▎ | 156/300 [4:40:22<4:18:34, 107.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 155, train loss: 114142.0666, val loss: 257270.9844, test loss : 367176.5625\n", + "Epoch: 155, train r2: 0.9969, val r2: 0.9476, test r2: 0.9417\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 52%|███████▎ | 157/300 [4:42:09<4:15:48, 107.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 156, train loss: 107535.5233, val loss: 258412.5156, test loss : 334884.9062\n", + "Epoch: 156, train r2: 0.9952, val r2: 0.9544, test r2: 0.9455\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 53%|███████▎ | 158/300 [4:43:55<4:13:04, 106.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 157, train loss: 96407.6097, val loss: 760244.7500, test loss : 425348.0625\n", + "Epoch: 157, train r2: 0.9908, val r2: 0.9350, test r2: 0.9337\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 53%|███████▍ | 159/300 [4:45:42<4:11:40, 107.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 158, train loss: 164839.4223, val loss: 192907.3281, test loss : 310627.9375\n", + "Epoch: 158, train r2: 0.9976, val r2: 0.9561, test r2: 0.9502\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 53%|███████▍ | 160/300 [4:47:37<4:15:39, 109.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 159, train loss: 192168.2547, val loss: 444752.7500, test loss : 544523.6250\n", + "Epoch: 159, train r2: 0.9748, val r2: 0.9027, test r2: 0.9114\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 54%|███████▌ | 161/300 [4:49:24<4:11:31, 108.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 160, train loss: 179077.6569, val loss: 609273.7500, test loss : 312491.0312\n", + "Epoch: 160, train r2: 0.9930, val r2: 0.9502, test r2: 0.9494\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 54%|███████▌ | 162/300 [4:51:09<4:07:26, 107.59s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 161, train loss: 130132.9262, val loss: 483702.7500, test loss : 585694.0000\n", + "Epoch: 161, train r2: 0.9729, val r2: 0.8957, test r2: 0.9082\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 54%|███████▌ | 163/300 [4:52:55<4:04:33, 107.10s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 162, train loss: 111676.4296, val loss: 252722.6719, test loss : 379673.3438\n", + "Epoch: 162, train r2: 0.9938, val r2: 0.9426, test r2: 0.9373\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 55%|███████▋ | 164/300 [4:54:41<4:02:10, 106.84s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 163, train loss: 124852.5318, val loss: 210396.6250, test loss : 357311.9375\n", + "Epoch: 163, train r2: 0.9819, val r2: 0.9521, test r2: 0.9388\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 55%|███████▋ | 165/300 [4:56:26<3:59:00, 106.23s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 164, train loss: 155348.7874, val loss: 338586.5000, test loss : 580804.5625\n", + "Epoch: 164, train r2: 0.9543, val r2: 0.9366, test r2: 0.8970\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 55%|███████▋ | 166/300 [4:58:12<3:57:13, 106.22s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 165, train loss: 157115.9407, val loss: 274362.3438, test loss : 378802.0000\n", + "Epoch: 165, train r2: 0.9926, val r2: 0.9380, test r2: 0.9395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 56%|███████▊ | 167/300 [5:00:00<3:56:28, 106.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 166, train loss: 151858.0144, val loss: 324794.8438, test loss : 446144.5000\n", + "Epoch: 166, train r2: 0.9840, val r2: 0.9292, test r2: 0.9288\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 56%|███████▊ | 168/300 [5:01:47<3:54:42, 106.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 167, train loss: 133311.4607, val loss: 305711.9375, test loss : 377210.0625\n", + "Epoch: 167, train r2: 0.9933, val r2: 0.9353, test r2: 0.9393\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 56%|███████▉ | 169/300 [5:03:33<3:52:44, 106.60s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 168, train loss: 126046.2430, val loss: 233521.1875, test loss : 306497.0625\n", + "Epoch: 168, train r2: 0.9977, val r2: 0.9563, test r2: 0.9501\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 57%|███████▉ | 170/300 [5:05:25<3:54:14, 108.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 169, train loss: 124743.8334, val loss: 301101.7188, test loss : 385588.0000\n", + "Epoch: 169, train r2: 0.9915, val r2: 0.9347, test r2: 0.9402\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 57%|███████▉ | 171/300 [5:07:11<3:51:08, 107.51s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 170, train loss: 82804.1151, val loss: 225232.2500, test loss : 330396.7188\n", + "Epoch: 170, train r2: 0.9979, val r2: 0.9488, test r2: 0.9476\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 57%|████████ | 172/300 [5:08:57<3:48:37, 107.17s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 171, train loss: 108944.3391, val loss: 332483.0625, test loss : 404582.0625\n", + "Epoch: 171, train r2: 0.9951, val r2: 0.9353, test r2: 0.9357\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 58%|████████ | 173/300 [5:10:44<3:46:56, 107.22s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 172, train loss: 108658.1947, val loss: 734188.1875, test loss : 416643.4062\n", + "Epoch: 172, train r2: 0.9735, val r2: 0.9198, test r2: 0.9300\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 58%|████████ | 174/300 [5:12:31<3:44:43, 107.02s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 173, train loss: 138169.9141, val loss: 596593.8125, test loss : 335652.4062\n", + "Epoch: 173, train r2: 0.9960, val r2: 0.9524, test r2: 0.9458\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 58%|████████▏ | 175/300 [5:14:17<3:42:30, 106.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 174, train loss: 98852.4139, val loss: 240421.3750, test loss : 288908.9688\n", + "Epoch: 174, train r2: 0.9942, val r2: 0.9621, test r2: 0.9523\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 59%|████████▏ | 176/300 [5:16:05<3:41:01, 106.95s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 175, train loss: 144835.4286, val loss: 251473.3906, test loss : 377599.7812\n", + "Epoch: 175, train r2: 0.9946, val r2: 0.9432, test r2: 0.9401\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 59%|████████▎ | 177/300 [5:17:49<3:37:51, 106.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 176, train loss: 161073.9431, val loss: 1102538.1250, test loss : 727815.0625\n", + "Epoch: 176, train r2: 0.8796, val r2: 0.8124, test r2: 0.8699\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 59%|████████▎ | 178/300 [5:19:34<3:35:08, 105.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 177, train loss: 195798.8512, val loss: 262148.7188, test loss : 447024.8125\n", + "Epoch: 177, train r2: 0.9863, val r2: 0.9410, test r2: 0.9258\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 60%|████████▎ | 179/300 [5:21:18<3:32:24, 105.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 178, train loss: 140515.0121, val loss: 367727.3750, test loss : 507582.2812\n", + "Epoch: 178, train r2: 0.9772, val r2: 0.9178, test r2: 0.9210\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 60%|████████▍ | 180/300 [5:23:07<3:32:51, 106.43s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 179, train loss: 129865.9286, val loss: 209877.6406, test loss : 343032.2500\n", + "Epoch: 179, train r2: 0.9938, val r2: 0.9546, test r2: 0.9453\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 60%|████████▍ | 181/300 [5:24:54<3:31:12, 106.49s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 180, train loss: 125283.9490, val loss: 490622.3438, test loss : 448221.1562\n", + "Epoch: 180, train r2: 0.9753, val r2: 0.9423, test r2: 0.9238\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 61%|████████▍ | 182/300 [5:26:41<3:29:34, 106.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 181, train loss: 192910.3398, val loss: 948055.1875, test loss : 1001243.8750\n", + "Epoch: 181, train r2: 0.9081, val r2: 0.8076, test r2: 0.8404\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 61%|████████▌ | 183/300 [5:28:29<3:29:00, 107.18s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 182, train loss: 138006.8215, val loss: 632812.5625, test loss : 335863.8125\n", + "Epoch: 182, train r2: 0.9936, val r2: 0.9507, test r2: 0.9454\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 61%|████████▌ | 184/300 [5:30:17<3:27:45, 107.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 183, train loss: 97567.7406, val loss: 283224.9688, test loss : 359812.1875\n", + "Epoch: 183, train r2: 0.9975, val r2: 0.9493, test r2: 0.9429\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 62%|████████▋ | 185/300 [5:32:10<3:29:09, 109.12s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 184, train loss: 94420.7461, val loss: 258111.8906, test loss : 351926.0000\n", + "Epoch: 184, train r2: 0.9976, val r2: 0.9556, test r2: 0.9435\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 62%|████████▋ | 186/300 [5:34:06<3:31:06, 111.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 185, train loss: 127230.2666, val loss: 223747.0625, test loss : 377797.0625\n", + "Epoch: 185, train r2: 0.9956, val r2: 0.9514, test r2: 0.9381\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 62%|████████▋ | 187/300 [5:35:54<3:27:21, 110.10s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 186, train loss: 149647.4378, val loss: 239372.7656, test loss : 349929.6562\n", + "Epoch: 186, train r2: 0.9972, val r2: 0.9472, test r2: 0.9444\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 63%|████████▊ | 188/300 [5:37:41<3:23:47, 109.18s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 187, train loss: 156584.3331, val loss: 243773.3906, test loss : 363677.0938\n", + "Epoch: 187, train r2: 0.9969, val r2: 0.9451, test r2: 0.9435\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 63%|████████▊ | 189/300 [5:39:27<3:20:16, 108.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 188, train loss: 118885.6531, val loss: 390397.0000, test loss : 513445.4688\n", + "Epoch: 188, train r2: 0.9875, val r2: 0.9214, test r2: 0.9160\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 63%|████████▊ | 190/300 [5:41:17<3:19:42, 108.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 189, train loss: 146577.6631, val loss: 576862.4375, test loss : 599173.3750\n", + "Epoch: 189, train r2: 0.9162, val r2: 0.8761, test r2: 0.8939\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 64%|████████▉ | 191/300 [5:43:02<3:15:45, 107.76s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 190, train loss: 114606.8038, val loss: 579171.3750, test loss : 659175.0625\n", + "Epoch: 190, train r2: 0.9616, val r2: 0.8789, test r2: 0.8947\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 64%|████████▉ | 192/300 [5:44:47<3:12:22, 106.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 191, train loss: 139174.4823, val loss: 201910.5781, test loss : 306984.9062\n", + "Epoch: 191, train r2: 0.9983, val r2: 0.9545, test r2: 0.9505\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 64%|█████████ | 193/300 [5:46:33<3:10:11, 106.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 192, train loss: 110288.3554, val loss: 292640.5000, test loss : 417682.3125\n", + "Epoch: 192, train r2: 0.9904, val r2: 0.9370, test r2: 0.9340\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 65%|█████████ | 194/300 [5:48:20<3:08:27, 106.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 193, train loss: 135046.3437, val loss: 426211.9062, test loss : 491099.1562\n", + "Epoch: 193, train r2: 0.9742, val r2: 0.9117, test r2: 0.9207\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 65%|█████████ | 195/300 [5:50:06<3:06:19, 106.47s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 194, train loss: 119121.3870, val loss: 285683.0938, test loss : 414999.8438\n", + "Epoch: 194, train r2: 0.9941, val r2: 0.9360, test r2: 0.9332\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 65%|█████████▏ | 196/300 [5:51:54<3:05:11, 106.84s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 195, train loss: 119385.7939, val loss: 310195.0938, test loss : 351334.6875\n", + "Epoch: 195, train r2: 0.9805, val r2: 0.9381, test r2: 0.9404\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 66%|█████████▏ | 197/300 [5:53:41<3:03:44, 107.04s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 196, train loss: 126720.4455, val loss: 401105.4688, test loss : 468251.5625\n", + "Epoch: 196, train r2: 0.9600, val r2: 0.9115, test r2: 0.9201\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 66%|█████████▏ | 198/300 [5:55:29<3:02:19, 107.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 197, train loss: 173541.4693, val loss: 259799.5781, test loss : 365754.1875\n", + "Epoch: 197, train r2: 0.9916, val r2: 0.9533, test r2: 0.9415\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 66%|█████████▎ | 199/300 [5:57:15<2:59:39, 106.73s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 198, train loss: 178022.7861, val loss: 503157.7812, test loss : 758322.6875\n", + "Epoch: 198, train r2: 0.8939, val r2: 0.8855, test r2: 0.8643\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 67%|█████████▎ | 200/300 [5:59:05<2:59:47, 107.88s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 199, train loss: 100943.3107, val loss: 488985.5000, test loss : 509401.7812\n", + "Epoch: 199, train r2: 0.9789, val r2: 0.9146, test r2: 0.9206\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 67%|█████████▍ | 201/300 [6:00:53<2:58:00, 107.88s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 200, train loss: 128466.6019, val loss: 573781.9375, test loss : 625383.4375\n", + "Epoch: 200, train r2: 0.9593, val r2: 0.8801, test r2: 0.9006\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 67%|█████████▍ | 202/300 [6:02:41<2:56:10, 107.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 201, train loss: 107260.5581, val loss: 247474.2500, test loss : 326231.9375\n", + "Epoch: 201, train r2: 0.9953, val r2: 0.9444, test r2: 0.9482\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 68%|█████████▍ | 203/300 [6:04:28<2:54:08, 107.71s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 202, train loss: 115810.0132, val loss: 367094.2812, test loss : 432597.0938\n", + "Epoch: 202, train r2: 0.9832, val r2: 0.9187, test r2: 0.9312\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 68%|█████████▌ | 204/300 [6:06:17<2:53:01, 108.14s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 203, train loss: 113002.1748, val loss: 347898.1250, test loss : 426762.2188\n", + "Epoch: 203, train r2: 0.9857, val r2: 0.9222, test r2: 0.9314\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 68%|█████████▌ | 205/300 [6:08:04<2:50:44, 107.84s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 204, train loss: 123473.7042, val loss: 376262.7188, test loss : 485837.2812\n", + "Epoch: 204, train r2: 0.9788, val r2: 0.9153, test r2: 0.9246\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 69%|█████████▌ | 206/300 [6:09:53<2:49:12, 108.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 205, train loss: 121200.0506, val loss: 848895.6875, test loss : 901111.1250\n", + "Epoch: 205, train r2: 0.9166, val r2: 0.8135, test r2: 0.8555\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 69%|█████████▋ | 207/300 [6:11:40<2:47:04, 107.79s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 206, train loss: 135733.7799, val loss: 197915.5469, test loss : 308422.0000\n", + "Epoch: 206, train r2: 0.9830, val r2: 0.9550, test r2: 0.9478\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 69%|█████████▋ | 208/300 [6:13:29<2:45:35, 108.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 207, train loss: 122903.2123, val loss: 216154.2969, test loss : 330080.1562\n", + "Epoch: 207, train r2: 0.9966, val r2: 0.9536, test r2: 0.9465\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 70%|█████████▊ | 209/300 [6:15:17<2:43:47, 108.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 208, train loss: 108498.9098, val loss: 328111.5312, test loss : 340475.6875\n", + "Epoch: 208, train r2: 0.9954, val r2: 0.9403, test r2: 0.9453\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 70%|█████████▊ | 210/300 [6:17:08<2:43:25, 108.95s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 209, train loss: 105484.3191, val loss: 294842.6250, test loss : 396487.9688\n", + "Epoch: 209, train r2: 0.9936, val r2: 0.9338, test r2: 0.9370\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 70%|█████████▊ | 211/300 [6:18:52<2:39:34, 107.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 210, train loss: 150975.1704, val loss: 503402.0938, test loss : 590214.3750\n", + "Epoch: 210, train r2: 0.9234, val r2: 0.8863, test r2: 0.8958\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 71%|█████████▉ | 212/300 [6:20:38<2:36:59, 107.04s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 211, train loss: 104786.9359, val loss: 465462.2188, test loss : 554094.8750\n", + "Epoch: 211, train r2: 0.9739, val r2: 0.9017, test r2: 0.9126\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 71%|█████████▉ | 213/300 [6:22:23<2:34:10, 106.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 212, train loss: 152185.3639, val loss: 274958.9688, test loss : 378148.7812\n", + "Epoch: 212, train r2: 0.9958, val r2: 0.9386, test r2: 0.9399\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 71%|█████████▉ | 214/300 [6:24:08<2:31:57, 106.02s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 213, train loss: 132513.6860, val loss: 295459.1875, test loss : 371931.3438\n", + "Epoch: 213, train r2: 0.9800, val r2: 0.9384, test r2: 0.9369\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 72%|██████████ | 215/300 [6:25:53<2:29:55, 105.83s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 214, train loss: 137021.3178, val loss: 855121.1875, test loss : 844283.1875\n", + "Epoch: 214, train r2: 0.9187, val r2: 0.8107, test r2: 0.8646\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 72%|██████████ | 216/300 [6:27:39<2:28:05, 105.78s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 215, train loss: 159416.3770, val loss: 226154.2656, test loss : 309772.1562\n", + "Epoch: 215, train r2: 0.9910, val r2: 0.9514, test r2: 0.9480\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 72%|██████████▏ | 217/300 [6:29:24<2:26:07, 105.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 216, train loss: 125041.5679, val loss: 278869.2188, test loss : 362255.7188\n", + "Epoch: 216, train r2: 0.9719, val r2: 0.9366, test r2: 0.9368\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 73%|██████████▏ | 218/300 [6:31:08<2:23:42, 105.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 217, train loss: 164054.9483, val loss: 266730.5938, test loss : 382438.0000\n", + "Epoch: 217, train r2: 0.9900, val r2: 0.9421, test r2: 0.9372\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 73%|██████████▏ | 219/300 [6:32:54<2:22:11, 105.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 218, train loss: 115158.6395, val loss: 258222.1875, test loss : 351415.0625\n", + "Epoch: 218, train r2: 0.9911, val r2: 0.9446, test r2: 0.9418\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 73%|██████████▎ | 220/300 [6:34:42<2:21:41, 106.27s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 219, train loss: 115848.9057, val loss: 188608.0000, test loss : 298759.9688\n", + "Epoch: 219, train r2: 0.9867, val r2: 0.9571, test r2: 0.9487\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 74%|██████████▎ | 221/300 [6:36:30<2:20:35, 106.77s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 220, train loss: 119203.2942, val loss: 177453.3906, test loss : 279427.4062\n", + "Epoch: 220, train r2: 0.9943, val r2: 0.9596, test r2: 0.9536\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 74%|██████████▎ | 222/300 [6:38:18<2:19:17, 107.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 221, train loss: 120884.5908, val loss: 308669.9688, test loss : 440787.7188\n", + "Epoch: 221, train r2: 0.9890, val r2: 0.9300, test r2: 0.9308\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 74%|██████████▍ | 223/300 [6:40:06<2:17:40, 107.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 222, train loss: 129712.2766, val loss: 314291.9688, test loss : 336087.5000\n", + "Epoch: 222, train r2: 0.9892, val r2: 0.9384, test r2: 0.9450\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 75%|██████████▍ | 224/300 [6:41:54<2:16:13, 107.55s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 223, train loss: 92780.4461, val loss: 284638.2188, test loss : 396043.8438\n", + "Epoch: 223, train r2: 0.9913, val r2: 0.9370, test r2: 0.9379\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 75%|██████████▌ | 225/300 [6:43:41<2:14:03, 107.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 224, train loss: 112448.0770, val loss: 751059.6875, test loss : 724831.5625\n", + "Epoch: 224, train r2: 0.9506, val r2: 0.8607, test r2: 0.8860\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 75%|██████████▌ | 226/300 [6:45:29<2:12:29, 107.43s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 225, train loss: 114944.3754, val loss: 422251.7500, test loss : 484343.8438\n", + "Epoch: 225, train r2: 0.9796, val r2: 0.9176, test r2: 0.9225\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 76%|██████████▌ | 227/300 [6:47:16<2:10:41, 107.41s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 226, train loss: 112774.0943, val loss: 264069.1562, test loss : 301198.0938\n", + "Epoch: 226, train r2: 0.9963, val r2: 0.9560, test r2: 0.9509\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 76%|██████████▋ | 228/300 [6:49:04<2:09:17, 107.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 227, train loss: 104959.9494, val loss: 561413.1875, test loss : 290002.8750\n", + "Epoch: 227, train r2: 0.9898, val r2: 0.9517, test r2: 0.9517\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 76%|██████████▋ | 229/300 [6:50:53<2:07:36, 107.83s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 228, train loss: 105870.3889, val loss: 346334.5938, test loss : 421559.4375\n", + "Epoch: 228, train r2: 0.9929, val r2: 0.9281, test r2: 0.9331\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 77%|██████████▋ | 230/300 [6:52:43<2:06:40, 108.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 229, train loss: 127531.4131, val loss: 705578.0000, test loss : 339355.3438\n", + "Epoch: 229, train r2: 0.9972, val r2: 0.9445, test r2: 0.9457\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 77%|██████████▊ | 231/300 [6:54:30<2:04:29, 108.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 230, train loss: 133307.3649, val loss: 226274.5469, test loss : 345061.5000\n", + "Epoch: 230, train r2: 0.9907, val r2: 0.9525, test r2: 0.9420\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 77%|██████████▊ | 232/300 [6:56:16<2:01:57, 107.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 231, train loss: 164608.8490, val loss: 314002.9062, test loss : 381926.4375\n", + "Epoch: 231, train r2: 0.9927, val r2: 0.9370, test r2: 0.9396\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 78%|██████████▊ | 233/300 [6:58:05<2:00:35, 108.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 232, train loss: 155765.7110, val loss: 278051.2188, test loss : 373286.7812\n", + "Epoch: 232, train r2: 0.9700, val r2: 0.9426, test r2: 0.9354\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 78%|██████████▉ | 234/300 [6:59:54<1:59:01, 108.20s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 233, train loss: 95011.2726, val loss: 950148.3125, test loss : 737578.9375\n", + "Epoch: 233, train r2: 0.9427, val r2: 0.8533, test r2: 0.8835\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 78%|██████████▉ | 235/300 [7:01:41<1:56:52, 107.88s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 234, train loss: 102711.7100, val loss: 664443.4375, test loss : 695191.6250\n", + "Epoch: 234, train r2: 0.9445, val r2: 0.8543, test r2: 0.8888\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 79%|███████████ | 236/300 [7:03:29<1:54:59, 107.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 235, train loss: 116831.5878, val loss: 298511.8750, test loss : 345158.0938\n", + "Epoch: 235, train r2: 0.9731, val r2: 0.9363, test r2: 0.9412\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 79%|███████████ | 237/300 [7:05:18<1:53:37, 108.21s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 236, train loss: 182690.3494, val loss: 593755.1875, test loss : 549649.8125\n", + "Epoch: 236, train r2: 0.9742, val r2: 0.9013, test r2: 0.9134\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 79%|███████████ | 238/300 [7:07:07<1:51:56, 108.33s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 237, train loss: 123569.4308, val loss: 218951.0156, test loss : 347085.4688\n", + "Epoch: 237, train r2: 0.9941, val r2: 0.9502, test r2: 0.9423\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 80%|███████████▏ | 239/300 [7:09:05<1:53:09, 111.31s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 238, train loss: 109345.3472, val loss: 201818.2344, test loss : 339158.4688\n", + "Epoch: 238, train r2: 0.9934, val r2: 0.9569, test r2: 0.9446\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 80%|███████████▏ | 240/300 [7:10:56<1:51:09, 111.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 239, train loss: 103492.2491, val loss: 533892.1875, test loss : 638672.0625\n", + "Epoch: 239, train r2: 0.9612, val r2: 0.8881, test r2: 0.9010\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 80%|███████████▏ | 241/300 [7:12:44<1:48:27, 110.30s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 240, train loss: 139313.3904, val loss: 524458.0000, test loss : 527870.3750\n", + "Epoch: 240, train r2: 0.9728, val r2: 0.8955, test r2: 0.9158\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 81%|███████████▎ | 242/300 [7:14:27<1:44:38, 108.26s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 241, train loss: 158392.3108, val loss: 289806.0000, test loss : 332692.5938\n", + "Epoch: 241, train r2: 0.9962, val r2: 0.9484, test r2: 0.9484\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 81%|███████████▎ | 243/300 [7:16:12<1:41:50, 107.20s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 242, train loss: 161283.9920, val loss: 332480.7812, test loss : 506482.2812\n", + "Epoch: 242, train r2: 0.9825, val r2: 0.9247, test r2: 0.9207\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 81%|███████████▍ | 244/300 [7:17:58<1:39:34, 106.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 243, train loss: 167364.1173, val loss: 204404.9531, test loss : 325054.1562\n", + "Epoch: 243, train r2: 0.9977, val r2: 0.9535, test r2: 0.9477\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 82%|███████████▍ | 245/300 [7:19:44<1:37:37, 106.50s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 244, train loss: 129976.7977, val loss: 320555.1875, test loss : 414436.0938\n", + "Epoch: 244, train r2: 0.9872, val r2: 0.9306, test r2: 0.9355\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 82%|███████████▍ | 246/300 [7:21:29<1:35:33, 106.17s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 245, train loss: 112743.2269, val loss: 260343.1719, test loss : 353125.9062\n", + "Epoch: 245, train r2: 0.9922, val r2: 0.9408, test r2: 0.9438\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 82%|███████████▌ | 247/300 [7:23:13<1:33:16, 105.59s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 246, train loss: 105657.4994, val loss: 320519.8750, test loss : 354743.5000\n", + "Epoch: 246, train r2: 0.9915, val r2: 0.9407, test r2: 0.9442\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 83%|███████████▌ | 248/300 [7:24:58<1:31:10, 105.20s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 247, train loss: 131512.7233, val loss: 258390.3125, test loss : 316328.9375\n", + "Epoch: 247, train r2: 0.9797, val r2: 0.9481, test r2: 0.9462\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 83%|███████████▌ | 249/300 [7:26:43<1:29:22, 105.14s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 248, train loss: 130703.4206, val loss: 255637.7344, test loss : 380817.4375\n", + "Epoch: 248, train r2: 0.9947, val r2: 0.9489, test r2: 0.9403\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 83%|███████████▋ | 250/300 [7:28:32<1:28:46, 106.52s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 249, train loss: 147218.8607, val loss: 244526.0000, test loss : 401931.8125\n", + "Epoch: 249, train r2: 0.9950, val r2: 0.9445, test r2: 0.9348\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 84%|███████████▋ | 251/300 [7:30:20<1:27:12, 106.79s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 250, train loss: 138399.3994, val loss: 293720.6562, test loss : 352796.8125\n", + "Epoch: 250, train r2: 0.9764, val r2: 0.9434, test r2: 0.9393\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 84%|███████████▊ | 252/300 [7:32:09<1:25:56, 107.43s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 251, train loss: 116232.5126, val loss: 484064.7812, test loss : 607418.3125\n", + "Epoch: 251, train r2: 0.9680, val r2: 0.8901, test r2: 0.9028\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 84%|███████████▊ | 253/300 [7:33:57<1:24:15, 107.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 252, train loss: 127929.2919, val loss: 882017.1875, test loss : 721127.0000\n", + "Epoch: 252, train r2: 0.8808, val r2: 0.8363, test r2: 0.8706\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 85%|███████████▊ | 254/300 [7:35:44<1:22:27, 107.55s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 253, train loss: 111034.9621, val loss: 381841.8438, test loss : 472619.2812\n", + "Epoch: 253, train r2: 0.9752, val r2: 0.9131, test r2: 0.9242\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 85%|███████████▉ | 255/300 [7:37:32<1:20:48, 107.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 254, train loss: 121484.4276, val loss: 641062.7500, test loss : 627172.3750\n", + "Epoch: 254, train r2: 0.9536, val r2: 0.8685, test r2: 0.8971\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 85%|███████████▉ | 256/300 [7:39:20<1:18:59, 107.72s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 255, train loss: 118027.6110, val loss: 294987.0938, test loss : 325682.5312\n", + "Epoch: 255, train r2: 0.9780, val r2: 0.9431, test r2: 0.9436\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 86%|███████████▉ | 257/300 [7:41:07<1:17:09, 107.67s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 256, train loss: 132540.3050, val loss: 383185.9062, test loss : 307753.9062\n", + "Epoch: 256, train r2: 0.9751, val r2: 0.9411, test r2: 0.9467\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 86%|████████████ | 258/300 [7:42:56<1:15:34, 107.95s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 257, train loss: 106980.8987, val loss: 295886.6875, test loss : 400027.7188\n", + "Epoch: 257, train r2: 0.9781, val r2: 0.9344, test r2: 0.9319\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 86%|████████████ | 259/300 [7:44:44<1:13:47, 107.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 258, train loss: 136564.2871, val loss: 419726.5938, test loss : 593739.3125\n", + "Epoch: 258, train r2: 0.9712, val r2: 0.9045, test r2: 0.9030\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 87%|████████████▏ | 260/300 [7:46:35<1:12:37, 108.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 259, train loss: 119471.3515, val loss: 587986.0000, test loss : 661971.4375\n", + "Epoch: 259, train r2: 0.9603, val r2: 0.8795, test r2: 0.8938\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 87%|████████████▏ | 261/300 [7:48:23<1:10:36, 108.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 260, train loss: 155603.4309, val loss: 194738.0781, test loss : 296764.8750\n", + "Epoch: 260, train r2: 0.9908, val r2: 0.9584, test r2: 0.9510\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 87%|████████████▏ | 262/300 [7:50:11<1:08:39, 108.41s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 261, train loss: 120239.0591, val loss: 542969.3125, test loss : 632098.8125\n", + "Epoch: 261, train r2: 0.9572, val r2: 0.8889, test r2: 0.8981\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 88%|████████████▎ | 263/300 [7:51:57<1:06:21, 107.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 262, train loss: 145639.5545, val loss: 312302.5312, test loss : 449566.1562\n", + "Epoch: 262, train r2: 0.9866, val r2: 0.9290, test r2: 0.9271\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 88%|████████████▎ | 264/300 [7:53:42<1:04:08, 106.91s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 263, train loss: 138549.1973, val loss: 202802.5469, test loss : 329402.7188\n", + "Epoch: 263, train r2: 0.9942, val r2: 0.9549, test r2: 0.9450\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 88%|████████████▎ | 265/300 [7:55:29<1:02:23, 106.96s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 264, train loss: 127895.7098, val loss: 297102.0000, test loss : 348519.0000\n", + "Epoch: 264, train r2: 0.9788, val r2: 0.9324, test r2: 0.9415\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 89%|████████████▍ | 266/300 [7:57:18<1:00:52, 107.44s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 265, train loss: 99948.0465, val loss: 723719.7500, test loss : 776637.6250\n", + "Epoch: 265, train r2: 0.9358, val r2: 0.8371, test r2: 0.8733\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 89%|██████████████▏ | 267/300 [7:59:07<59:24, 108.01s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 266, train loss: 196513.0115, val loss: 254612.6250, test loss : 341412.4688\n", + "Epoch: 266, train r2: 0.9765, val r2: 0.9508, test r2: 0.9400\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 89%|██████████████▎ | 268/300 [8:00:54<57:27, 107.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 267, train loss: 149020.9324, val loss: 205206.6094, test loss : 334888.7812\n", + "Epoch: 267, train r2: 0.9960, val r2: 0.9546, test r2: 0.9433\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 90%|██████████████▎ | 269/300 [8:02:42<55:40, 107.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 268, train loss: 117153.8368, val loss: 267569.0938, test loss : 363731.4375\n", + "Epoch: 268, train r2: 0.9838, val r2: 0.9392, test r2: 0.9378\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 90%|██████████████▍ | 270/300 [8:04:35<54:43, 109.45s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 269, train loss: 115661.5948, val loss: 332942.0000, test loss : 441144.4688\n", + "Epoch: 269, train r2: 0.9900, val r2: 0.9337, test r2: 0.9273\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 90%|██████████████▍ | 271/300 [8:06:24<52:44, 109.12s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 270, train loss: 92813.6948, val loss: 236724.9219, test loss : 401231.1562\n", + "Epoch: 270, train r2: 0.9857, val r2: 0.9462, test r2: 0.9307\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 91%|██████████████▌ | 272/300 [8:08:12<50:48, 108.87s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 271, train loss: 154775.2874, val loss: 266442.1562, test loss : 300305.4062\n", + "Epoch: 271, train r2: 0.9854, val r2: 0.9496, test r2: 0.9486\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 91%|██████████████▌ | 273/300 [8:09:59<48:41, 108.20s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 272, train loss: 121748.2694, val loss: 246088.9531, test loss : 307480.5625\n", + "Epoch: 272, train r2: 0.9876, val r2: 0.9496, test r2: 0.9475\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 91%|██████████████▌ | 274/300 [8:11:47<46:51, 108.14s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 273, train loss: 134082.5064, val loss: 532720.0000, test loss : 519565.5312\n", + "Epoch: 273, train r2: 0.9717, val r2: 0.9007, test r2: 0.9183\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 92%|██████████████▋ | 275/300 [8:13:34<44:59, 108.00s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 274, train loss: 128775.7465, val loss: 288038.1562, test loss : 382891.4688\n", + "Epoch: 274, train r2: 0.9915, val r2: 0.9371, test r2: 0.9390\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 92%|██████████████▋ | 276/300 [8:15:21<43:03, 107.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 275, train loss: 97901.0239, val loss: 265339.1250, test loss : 302734.4375\n", + "Epoch: 275, train r2: 0.9966, val r2: 0.9555, test r2: 0.9504\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 92%|██████████████▊ | 277/300 [8:17:08<41:13, 107.53s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 276, train loss: 120228.1397, val loss: 204575.2500, test loss : 326654.4062\n", + "Epoch: 276, train r2: 0.9973, val r2: 0.9546, test r2: 0.9461\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 93%|██████████████▊ | 278/300 [8:18:56<39:25, 107.54s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 277, train loss: 124457.1743, val loss: 646973.3750, test loss : 314542.1875\n", + "Epoch: 277, train r2: 0.9941, val r2: 0.9494, test r2: 0.9485\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 93%|██████████████▉ | 279/300 [8:20:42<37:30, 107.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 278, train loss: 100463.2185, val loss: 323996.9062, test loss : 407116.4375\n", + "Epoch: 278, train r2: 0.9863, val r2: 0.9347, test r2: 0.9361\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 93%|██████████████▉ | 280/300 [8:22:31<35:53, 107.67s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 279, train loss: 82284.5439, val loss: 430215.4688, test loss : 495841.1875\n", + "Epoch: 279, train r2: 0.9741, val r2: 0.9110, test r2: 0.9211\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 94%|██████████████▉ | 281/300 [8:24:19<34:05, 107.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 280, train loss: 116234.1271, val loss: 205426.9844, test loss : 300088.2500\n", + "Epoch: 280, train r2: 0.9990, val r2: 0.9565, test r2: 0.9526\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 94%|███████████████ | 282/300 [8:26:06<32:15, 107.55s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 281, train loss: 118501.8329, val loss: 619187.9375, test loss : 727822.5625\n", + "Epoch: 281, train r2: 0.9420, val r2: 0.8605, test r2: 0.8835\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 94%|███████████████ | 283/300 [8:27:53<30:27, 107.52s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 282, train loss: 87191.0093, val loss: 259249.0156, test loss : 404718.4375\n", + "Epoch: 282, train r2: 0.9915, val r2: 0.9411, test r2: 0.9356\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 95%|███████████████▏| 284/300 [8:29:46<29:03, 108.95s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 283, train loss: 82501.9451, val loss: 268910.6562, test loss : 395458.9688\n", + "Epoch: 283, train r2: 0.9962, val r2: 0.9406, test r2: 0.9368\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 95%|███████████████▏| 285/300 [8:31:36<27:19, 109.32s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 284, train loss: 241321.9808, val loss: 2064933.6250, test loss : 1433156.7500\n", + "Epoch: 284, train r2: 0.7496, val r2: 0.6436, test r2: 0.7445\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 95%|███████████████▎| 286/300 [8:33:24<25:26, 109.07s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 285, train loss: 205123.6540, val loss: 292104.1562, test loss : 686533.8750\n", + "Epoch: 285, train r2: 0.9585, val r2: 0.9335, test r2: 0.8815\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 96%|███████████████▎| 287/300 [8:35:13<23:34, 108.80s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 286, train loss: 139356.4706, val loss: 379740.4062, test loss : 492119.4375\n", + "Epoch: 286, train r2: 0.9812, val r2: 0.9141, test r2: 0.9224\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 96%|███████████████▎| 288/300 [8:37:01<21:45, 108.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 287, train loss: 164119.2237, val loss: 210453.4375, test loss : 304338.6875\n", + "Epoch: 287, train r2: 0.9957, val r2: 0.9529, test r2: 0.9514\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 96%|███████████████▍| 289/300 [8:38:49<19:51, 108.30s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 288, train loss: 137080.4509, val loss: 216771.7500, test loss : 331605.9062\n", + "Epoch: 288, train r2: 0.9960, val r2: 0.9507, test r2: 0.9462\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 97%|███████████████▍| 290/300 [8:40:39<18:09, 108.91s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 289, train loss: 97886.9401, val loss: 207916.3125, test loss : 309891.7188\n", + "Epoch: 289, train r2: 0.9919, val r2: 0.9536, test r2: 0.9482\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 97%|███████████████▌| 291/300 [8:42:35<16:40, 111.12s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 290, train loss: 79947.3233, val loss: 176569.9531, test loss : 261401.4219\n", + "Epoch: 290, train r2: 0.9979, val r2: 0.9598, test r2: 0.9581\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 97%|███████████████▌| 292/300 [8:44:26<14:49, 111.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 291, train loss: 95716.2594, val loss: 343028.0000, test loss : 383428.7500\n", + "Epoch: 291, train r2: 0.9911, val r2: 0.9386, test r2: 0.9399\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 98%|███████████████▋| 293/300 [8:46:15<12:53, 110.46s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 292, train loss: 130825.0580, val loss: 616132.0625, test loss : 362430.2500\n", + "Epoch: 292, train r2: 0.9968, val r2: 0.9467, test r2: 0.9398\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 98%|███████████████▋| 294/300 [8:48:00<10:53, 108.90s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 293, train loss: 148733.0140, val loss: 526250.9375, test loss : 332593.9688\n", + "Epoch: 293, train r2: 0.9725, val r2: 0.9222, test r2: 0.9428\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 98%|███████████████▋| 295/300 [8:49:48<09:01, 108.37s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 294, train loss: 116480.2838, val loss: 362791.9688, test loss : 446358.2500\n", + "Epoch: 294, train r2: 0.9817, val r2: 0.9215, test r2: 0.9287\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 99%|███████████████▊| 296/300 [8:51:35<07:12, 108.21s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 295, train loss: 124857.2964, val loss: 202028.8594, test loss : 346386.9375\n", + "Epoch: 295, train r2: 0.9944, val r2: 0.9541, test r2: 0.9421\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 99%|███████████████▊| 297/300 [8:53:22<05:23, 107.70s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 296, train loss: 94276.1454, val loss: 190652.1875, test loss : 335052.6562\n", + "Epoch: 296, train r2: 0.9927, val r2: 0.9590, test r2: 0.9438\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 99%|███████████████▉| 298/300 [8:55:08<03:34, 107.23s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 297, train loss: 102525.4083, val loss: 244123.6094, test loss : 332500.4062\n", + "Epoch: 297, train r2: 0.9807, val r2: 0.9453, test r2: 0.9433\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "100%|███████████████▉| 299/300 [8:56:55<01:47, 107.06s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 298, train loss: 87369.3017, val loss: 187155.6719, test loss : 293832.2188\n", + "Epoch: 298, train r2: 0.9965, val r2: 0.9577, test r2: 0.9534\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████| 300/300 [8:58:44<00:00, 107.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 299, train loss: 113805.1642, val loss: 563931.6875, test loss : 594887.6875\n", + "Epoch: 299, train r2: 0.9585, val r2: 0.8877, test r2: 0.9063\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "path = r'D:\\All_files\\pys\\AI_algos\\Mikes_Work\\viscosity-video-classification\\code_digdiscovery'\n", + "\n", + "(cnn3d, history) =train_epochs(model = cnn3d , \n", + " dataloaders = (train_dl, val_dl, test_dl), \n", + " optimizer = Adam(cnn3d.parameters(),lr=1e-4),\n", + " criterion=nn.MSELoss(), \n", + " epochs = 300 , \n", + " early_stop = None,\n", + " device = device,\n", + " path = os.path.join(path,'weights'),\n", + " save_weights_frequency = 10)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Honey_Regression_Inference.ipynb b/Honey_Regression_Inference.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..7501e1af25611a4d5b6e7cb5ff190fec80467823 --- /dev/null +++ b/Honey_Regression_Inference.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2fdf5e9e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\biplabd\\Anaconda3\\envs\\pyg\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "import numpy as np\n", + "import torch\n", + "from torch import nn\n", + "import torchvision.transforms as transforms\n", + "from tqdm import tqdm\n", + "from utils.loaders_viscosity import create_datasets, Dataset_3DCNN\n", + "from models.viscosity_models import CNNLayers, CNN3D\n", + "from utils.helper_fun import conv3D_output_size\n", + "from models.feedforward import LinLayers\n", + "from utils.datastruct import CNNData, LinData, NetData\n", + "from models.inference import get_inference, combine_train_and_val" + ] + }, + { + "cell_type": "markdown", + "id": "ecf5e266", + "metadata": {}, + "source": [ + "## Dataloaders" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0ad0faae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "length test set 33\n" + ] + } + ], + "source": [ + "base_path = r'D:\\All_files\\pys\\AI_algos\\Mikes_Work\\viscosity-video-classification\\viscosity_reg_modeling'\n", + "train_dl, test_dl, val_dl = create_datasets(path = os.path.join(base_path,'new_honey_164'), # absolute path\n", + " validation_split = 0.2,\n", + " test_split = 0.2,\n", + " batch_size = 5,\n", + " transform = transforms.Compose([transforms.Resize([256, 342]),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.5], std=[0.5])]),\n", + " random_seed = 112, # same seed as training\n", + " shuffle = True,\n", + " selected_frames = np.arange(2,62,2))" + ] + }, + { + "cell_type": "markdown", + "id": "019f8b58", + "metadata": {}, + "source": [ + "## Model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "da587c00", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CNN3D(\n", + " (cnn3d): CNNLayers(\n", + " (layers): Sequential(\n", + " (0): Sequential(\n", + " (0): Conv3d(1, 32, kernel_size=(5, 5, 5), stride=(2, 2, 2))\n", + " (1): BatchNorm3d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (2): ReLU()\n", + " )\n", + " (1): Sequential(\n", + " (0): Conv3d(32, 48, kernel_size=(3, 3, 3), stride=(2, 2, 2))\n", + " (1): BatchNorm3d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (2): ReLU()\n", + " )\n", + " )\n", + " )\n", + " (lin): LinLayers(\n", + " (layers): Sequential(\n", + " (0): Sequential(\n", + " (0): Linear(in_features=1499904, out_features=256, bias=True)\n", + " (1): ReLU()\n", + " (2): Dropout(p=0.2, inplace=False)\n", + " )\n", + " (1): Sequential(\n", + " (0): Linear(in_features=256, out_features=256, bias=True)\n", + " (1): ReLU()\n", + " )\n", + " (2): Sequential(\n", + " (0): Linear(in_features=256, out_features=1, bias=True)\n", + " )\n", + " )\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "# CNN3D Layer's architecture\n", + "cnndata = CNNData(in_dim = 1,\n", + " n_f =[32,48],\n", + " kernel_size=[(5,5,5), (3,3,3)],\n", + " activations=[nn.ReLU(),nn.ReLU()],\n", + " bns = [True, True],\n", + " dropouts = [0, 0],\n", + " paddings = [(0,0,0),(0,0,0)],\n", + " strides = [(2,2,2),(2,2,2)])\n", + "\n", + "# Feedforward layer's architecture\n", + "lindata = LinData(in_dim = conv3D_output_size(cnndata, [30, 256, 342]),\n", + " hidden_layers= [256,256,1],\n", + " activations=[nn.ReLU(),nn.ReLU(),None],\n", + " bns=[False,False,False],\n", + " dropouts =[0.2, 0, 0])\n", + "\n", + "# combined architecture\n", + "args = NetData(cnndata, lindata)\n", + "\n", + "# weight file\n", + "weight_file = 'cnn3d_epoch_300.pt'\n", + " \n", + "# CNN3D model\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "cnn3d = CNN3D(args).to(device)\n", + "cnn3d.load_state_dict(torch.load(os.path.join(base_path,'weights',weight_file)))\n", + "cnn3d.eval()\n", + "print(cnn3d)" + ] + }, + { + "cell_type": "markdown", + "id": "426c39d2", + "metadata": {}, + "source": [ + "## Inference" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "7647e406", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjUAAAHqCAYAAABMTMx9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAADnIElEQVR4nOzde1yUZf7/8fcAiqgMnhUdDLNUOm0HNc1QqK1ILXJCNm032kxzM4NK3dxO2laudhByK7OsbH9pKU5WVtgJElMzy7YTWpiEIJWWCoiKDPP7w+/MMjAzDMNwfj2/Dx6Pm7mv+7ou8PvY7g+f67o+BpvNZhMAAAAAAAAAAEAzF9DUEwAAAAAAAAAAAPAGSQ0AAAAAAAAAANAikNQAAAAAAAAAAAAtAkkNAAAAAAAAAADQIpDUAAAAAAAAAAAALQJJDQAAAAAAAAAA0CKQ1AAAAAAAAAAAAC0CSQ0AAAAAAAAAANAikNQAAAAAAAAAAAAtAkkNAAAAAAAAAADQIpDUAAA0OKvVqg8//FCzZs3SRRddpO7du6tdu3bq1q2bLrroIj3yyCM6ePBgU0/TJ+Xl5XriiSc0bNgwhYWFqXPnzjr77LP1wAMPqKSkpN79f/LJJ7ruuusUERGh4OBg9ezZU5dccolWrFghm81W5/6mT58ug8Egg8GgyMhIr57Jzc3VXXfdpbPOOkthYWHq1KmTTj31VF1zzTV6+umn6zwHAAAAoDbEEL6rbwzxyy+/6K677tLgwYMVEhKibt26KTo6Ws8//7zXMQgxBICGZLD58hcRAADqYOrUqXr++ecd3wcEBMhoNOrQoUOOz3r37q1169ZpxIgRTTBD3xw8eFCXXnqpduzYIUkKDg5WYGCgysrKJEmnnHKKPv74Y51yyik+9X/vvffq4YcfdnzfpUsXlZWVqby8XJIUFxendevWKTg42Kv+srKydMkllzgCkVNOOUV5eXken0lNTdXdd9+t48ePS5JCQkIUFBTkCLbCwsKc/h0BAAAAfyCGaJoY4vPPP9cVV1yh3377TZLUuXNnHTt2TBUVFZKkyy+/XG+++abHGIQYAkBDY6cGAKDBnThxQr169dKsWbO0efNmHTt2TAcPHlRJSYmef/55de/eXb/88ovGjRun/fv3N/V0vXb99ddrx44dMhqNeu2111RWVqYjR47ovffeU3h4uH766SddddVVslqtde77+eefdwQj1113nfbu3ev4nf2///f/FBoaqoyMDM2cOdOr/srKynTzzTcrKChIQ4cO9eqZJ554QnfccYfKy8s1Y8YM7dy5U2VlZSouLtbBgwf13nvv6eabb67zzwYAAADUhhii8WOIw4cPa/z48frtt980ZMgQffbZZyopKdGRI0f073//W+3atdN7772nO+64w+0ciCEANAobAAANbOvWrbaysjK39zdv3myTZJNk++c//9mIM/PdBx984JjzqlWratyv+jM9//zzdeq7oqLC1qdPH5sk2/nnn2+rrKys0ebFF1+0SbIFBATYvvrqq1r7TElJsUmy3XPPPbakpCSbJNspp5zitv1XX31la9eunU2SLS0trU7zBwAAAOqLGKLxY4h7773XJskWEhJi+/HHH2vcf+SRR2ySbIGBgbZdu3bVuE8MAaCxsFMDAOCzmJgYGQwGzZs3TydOnNDjjz+uoUOHqkuXLjIYDMrKypIkXXjhhQoJCXHbz8iRI3XGGWdIkj777LPGmHq9rVixQpJ06qmn6k9/+lON+yNHjlRMTIwk6eWXX65T39u3b9fPP/8sSbrrrrtkMBhqtElKSlLv3r1VWVnpmIs7W7du1ZNPPqlBgwbp3nvv9WoOjzzyiE6cOKHhw4fr9ttvr9P8AQAAAHeIIZpvDGEf87rrrtOAAQNq3J85c6Y6d+4sq9WqV155pcZ9YggAjYWkBgCg3o4dO6aYmBjNmjVL//3vfxUQUPf/vHTo0EGSfNpm3RTef/99SSfPpHUVMEjSlVdeKUnatGmTjh496nXfP/30k+PaHqhVZzAYNHjwYElSRkaG276OHz+um266STabTc8++6zj9+zJkSNHtHbtWknSTTfd5PW8AQAAAG8RQzSvGGLXrl3Kz893mkN1nTt3VnR0tCTpvffec7pHDAGgMZHUAADU21NPPaWvvvpKL774ooqLi/X777/rwIEDOuecc7x6/sCBA/rmm28kSWeffXZDTtUvfv/9d8cqqLPOOsttO/u9yspK5eTk+DSWpwDNfm/Xrl2Own/VPfjgg8rJydGUKVMcq75qs23bNp04cUKSNGbMGGVmZmr8+PHq0aOHOnTooFNPPVVTpkzRt99+W7cfBgAAAPg/xBCuNVUMYf9deju/7777zulzYggAjYmkBgCg3kpLS7Vy5UrdeOONji3i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nj1bBw8edFwDAAAAzYXPSY1ff/1VTz75pFatWlVr21deeUVPPvmkDhw44OtwftEaC/RR6A8AADQXRSVFfm0HuNPYscj999+vjh07SpLmzZunq6++WmvXrtWOHTu0ZcsWLV68WOeee66+++47SdKll16qyy+/3KmPQYMGadasWZJOHg81atQovfbaa9q+fbtee+01jRo1Stu3b5d0Molw+umnu5zL7NmzHbsm5syZo1tuuUWZmZnaunWrFixYoMsvv1wVFRUKCQlRamqqyz7atWunJ598UgEBASouLtaoUaP073//W9u2bdOGDRuUkJCgp59+WtLJo6r+8pe/+Py7AwAAAPzN65oa1f2///f/NHv2bM2bN6/Wtv/973/1+OOPS5JjZVFTaI0F+nz5mYKCgnTaaad5bAsAAFBX4aHhfm0HuNPYsciQIUP0xhtvaNKkSTpw4IDeeustvfXWWy7bXnLJJVqzZo3Lew8//LB+/fVXvfDCC9qxY4euu+66Gm2mTJmihx56yO1cQkND9fbbb2vs2LH64YcftGzZMi1btsypjdFo1CuvvKJzzz3XbT9jx47V0qVLddttt+mXX35x7BKpavjw4Xr99dcVGBjoth8AAACgsfm8U+PNN9+UJF177bW1tv3LX/4im82mN954w9fh/MJeoE+SXwv0ueNNgT5JjgJ97ngq0Dds2DBHgXBPcykvL3ec3Vv1GQAAAH+J7h8tk9Ekgwwu7xtkUIQxQtH9oxt5ZmhtmiIW+eMf/6idO3dq4cKFiomJUc+ePdWuXTuFhIRowIABSkxM1Lp16/TBBx+oa9euLvsICAjQ8uXL9fbbbys+Pl59+/ZV+/bt1bdvX8XHx+udd97R888/r4AAz2Haaaedph07dmjhwoUaOnSounTpoo4dO2rw4MG644479NVXX9U4/sqVqVOn6vPPP9fUqVN16qmnqkOHDurevbsuvvhiPfPMM/rkk0/Uo0cPn35fAAAAQEMx2NxVl6tFRESEioqKdPToUbVr185j2/LycoWEhCgiIkJ5eXm+DOdSXl6eowBfUlKS2yJ3Vd1666165plnJJ08b9bVLoutW7dq5MiRjvZPPfWU0/3y8nL16tVLhw8fVlRUlL799tsaRfwkafr06Xr22WclSdu2batxnu3q1av1pz/9SdLJs2zvvvvuGn2UlZXJZDLp4MGDOuOMM/Ttt9/WaDN27Fi9++67CgoK0p49e5yOpLJ79dVXNWnSJEnSokWLvD4Xt7i4WGFhYTp8+DD1NQAAQK0sORYlrE6QJKeC4fZER3piusxR5iaZGxpXQ75HNodYBJ4RRwAAAKCuvH2H9Hmnxv79+9WlS5dagwjpZEG7Ll266JdffvF1OL9pjQX67GfzVlRUaMaMGbJarU73Dxw44Cha2KVLF918880u+wEAAKgvc5RZ6Ynp6mfs5/S5yWgioQG/aamxCAAAAID683mnRs+ePXXo0CGVlJSoQ4cOHtseO3ZMoaGhMhqN+u2333yaqCRt2rRJubm5ju8PHDjg+EP/qFGjavyx/sYbb3TZz9y5c/Wvf/1LknTeeefp73//uwYOHKjdu3dr4cKF2rFjh6PdI4884rKPkpISDR06VN9//70kadq0abruuusUEhKizMxMPfLIIyotLVVISIg2b97s9jzbd955R1dddZUqKyvVu3dv3XvvvRo+fLgOHjyo5557zlG74+KLL1ZWVpbb82wnTZqkV199VZIUGxurlJQU9e3bV19//bUefvhhR8Jk6dKluuWWW1z24QorrAAAgC+slVZl52erqKRI4aHhiu4frcAAzuVvSxryPbIpYhHUDXEEAABtF7EAfOXtO6TPSY2YmBhlZ2frtddeU0JCgse2a9as0Z/+9CeNHDlSn3zyiS/DSTqZpFixYoXX7d39aJWVlZo6dapeeOEFt89OmTJFy5Yt83iebW5urqNAnyv2An21nWf73HPP6bbbblN5ebnL+8OHD9fbb7/t8Tzbo0ePKiEhQe+8847L+wEBAbrvvvu8KqZYFcEIAAAAfNGQ75FNEYugbogjAABomyw5FiVnJKuguMDxmcloUlpcGru2UasGP37q6quvls1m06xZs7Rv3z637QoLCzVr1iwZDAZdc801vg7nV62xQF9ISIjefvttvfLKK7rsssvUq1cvtW/fXhEREZo8ebI2bdpU54QGAAAA0By15FgEAACgtbLX16ua0JCkwuJCJaxOkCXH0kQzQ2vj806NsrIyDRkyRIWFherevbvmzp2r8ePH65RTTpEk/fTTT3rrrbf0r3/9SwcOHJDJZFJOTo46derk1x8ADYsVVgAAAPBFQ75HEos0f8QRAAC0LdZKqyLTImskNOwMMshkNGlP8h6OooJbDX78lCR98cUXiouL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f8SIEVq/fr26d+/usZ/qWGEFAGhurJVWRaZFqrC4sNaaGXWx0rxSk86e5Lf+gLauMd8jW1Is0lYQRwAAAKCuGuX4qZaooqJC559/viOhcc455+jOO+/U4MGDVVJSok2bNunxxx/XkSNHJEmLFi3S7Nmza/Rzzz336JFHHpEknXfeeZozZ44GDhyo3bt3a9GiRdqxY4ej3UMPPeRyLqWlpRo2bJh27twpSZo6daquu+46hYSEKDMzUwsWLFBpaak6duyoLVu26JxzznHZz4YNGzR27FhVVlaqd+/euueee3ThhRfq999/13PPPSeLxSJJGj16tDIzMxUQ4P0GHYIRAEBzY6206uHsh/VA1gN+7TczKVMxkTF+7RNoy3iPbNv49wcAAEBdNXhS48EHH1Tnzp115513etX+ySef1KFDh3T//ff7MpzfrF27VgkJCZKkkSNHKjs7W4GBzudnf/755xo5cqROnDihrl276tdff1VQUJDjfm5urqKiolRRUaGhQ4dq48aNCgkJcdwvKyvTmDFjtH37dgUFBWnnzp0aOHBgjbnMmzdP8+fPl+Q6ebJlyxaNHj1aFRUVio2N1UcffVSjj4qKCkVFRSk3N1dGo1FffPFFjbFmzJihp59+WpK0YsUK3XDDDV7/vghGAADNiSXHouSMZBUUF/itT2pqAA2jId8jW2os0pYQRwAAAKCuGjypERAQoD59+mjfvn1etR8wYIDy8/NltVp9Gc5v7rzzTi1evFiS9Oabb+qqq65y2c5sNuv111+XJH399dc666yzHPeqJgm2bNmiESNG1Hh+69atGjlypCTptttu05IlS5zunzhxQr169dKhQ4cUFRWlb775xuUOiunTp+vZZ5+VJG3fvl0XXHCB0/01a9YoMTFRkrRgwQLdfffdNfooKyuTyWTSwYMHddZZZ9V67FZVBCMAgObCkmNRwuoEt0dO3fiHG/XSf1+qU58GnTwiMj0xXeYoc32nCKCKhnyPbKmxSFtCHAEAAIC6apRC4S1ReXm54/rUU091267qboeqdSpsNpveeOMNSdKQIUNcJjSkkzUsBg8eLElat26dqueOsrKydOjQIUlSUlKS2yOhbrzxRse1/RipqtatW+eybVUdO3Z0JD6++eYb/fDDDy7bAQDQXFkrrUrOSHab0DDIoA9+/ECmUJMjUeFKoMF5J4bJaCKh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GJSXl6e33npL3377rWw2m6699lqtWbPG16HQRAhGAKBtq+uRUwYZZDKatCd5j97Y9YaSM5KdittFGCOUGpfKizfQBjT0eySxSPNGHAEALYe10qrs/GwVlRQpPDRc0f2jFRgQ2NTTwv+x5FiIq9BmNEpS4+jRo7rxxhsdAYLB4Lwdyt71ddddp+XLlyskJMTXodBECEYAoO2yrwpyVRTcHYMMTquFCJCAtquh3yOJRZo34ggAaBlc/cHcZDQpLS6NP5g3I8RVaCsaJalh99FHH+mFF17Q5s2b9fPPP8tgMKhPnz666KKLNGXKFMXExNR3CDQRghEAaJuslVZFpkU6BTe16dmxp5aOX0rwA0BS471HEos0T8QRAND8uVvExNFGAJpKoyY10HoRjABA21F19c8vR37RHRvu8PrZnh17quCOArUPat+AMwTQkvAe2bbx7w8AzVtti5iqHivLjgAAjcXbd8iARpwTAABopiw5FkWmRSp2RawmWybXKaFhkEFLxy8loQGgTThw4IAWLVqkUaNGqU+fPgoODlbfvn114YUXavbs2dqyZUutfWRkZMhsNstkMik4OFgmk0lms1kZGRlez6OsrEyPPvqohg8frm7duqlz586KiorSrFmzlJ+f73U/3377raZPn67TTjtNISEh6tmzp0aPHq1nn31WFRUVXvcDAGhZsvOzPe7KtsmmvcV7lZ2f3YizAgDvsFMDHrHCCgBaN2ulVQ9nP6wHsh7w6fmw4DC9EP8C29IB1NAa3yPXrFmjv/3tb/rtt9/ctomPj9e6detc3rPZbJo+fbqWLVvm9vlp06Zp6dKlNWqEVLV7926NGzdOu3btcnk/LCxMK1eu1NixY932IUnLly/XjBkzdPz4cZf3R4wYofXr16t79+4e+3GlNf77A0BrsurrVZpsmVxru5XmlZp09qRGmBEAeP8OGeRNZxs3bpQkdezYUUOHDnX6rK5Gjx7t03MAAMC/LDkWJb+brIIS7+tmVLfkyiUkNAA0qOYSi7z88sv661//qsrKSvXq1Ut/+9vfdPHFF6tbt276+eeftXv3br311ltq166d2z7uvfdeR0LjvPPO05w5czRw4EDt3r1bixYt0o4dO7Rs2TL17NlTDz30kMs+SktLNX78eEdCY+rUqbruuusUEhKizMxMLViwQIcPH9bEiRO1ZcsWnXPOOS772bBhg6ZNm6bKykr17t1b99xzjy688EL9/vvveu6552SxWLR161aZzWZlZmYqIIBN/gDQmoSHhvu1HQA0Jq92agQEBMhgMGjIkCH69ttvnT6r02AGA1uYWxhWWAFA6+SuKGBdZSZlKiYyxj+TAtCq+Os9sjnEIjk5OTrvvPN0/PhxRUdH66233lJYWJjLtuXl5WrfvuZxfLm5uYqKilJFRYWGDh2qjRs3KiQkxHG/rKxMY8aM0fbt2xUUFKSdO3dq4MCBNfqZN2+e5s+fL0latGiRZs+e7XR/y5YtGj16tCoqKhQbG6uPPvqoRh8VFRWKiopSbm6ujEajvvjiixpjzZgxQ08//bQkacWKFbrhhhtq+S05I44AgObNXlOjsLjQZUxATQ0ATcHvNTVsNpsqKytrfFaXr+rPAwCAxmettCo5I7neCY0IY4Si+0f7aVYA4F5TxyIzZ87U8ePH1aNHD1ksFrcJDUkuExqStHjxYkdSZcmSJU4JDenkTpQlS5ZIOpl0SE1NrdHHiRMnlJaWJkmKiorSXXfdVaPNyJEjNWXKFElSZmamPv/88xptXn/9deXm5kqS5s6d6zJ58uijj6pr166OawBA6xIYEKi0uJP/TTHIeaGA/fvUuFQSGgCaJa+SGpWVlaqsrFROTk6Nz+r6BQAA6sZaaVVWXpZWfb1KWXlZslZa69W+tqKAtTH83/8R5ABoDE0di+zcuVMffvihJOm2225Tjx496tyHzWbTG2+8IUkaMmSIRowY4bLdiBEjNHjwYEnSunXrVH1TfVZWlg4dOiRJSkpKcnsk1I033ui4tlgsNe5XrflRtW1VHTt2VGJioiTpm2++0Q8//OCyHQCg5TJHmZWemK5+xn5On5uMJqUnpnPMLIBmy6uaGgAAoGlYcixKzkh2SkKYjCalxaW5DDK8aV9UUlSnOQQaAmW1/S8xYjKalBqXSpADoE1Ys2aN43rixImO64MHD+rAgQPq1q1brYW09+zZo8LCQknSmDFjPLYdM2aMdu3apYKCAuXl5WnAgAGOe9nZ2U7t3Bk6dKg6deqkI0eOaNOmTTXu2/sZPHiw+vTp43Euzz77rCRp06ZNOv300z3OHQDQ8pijzIofHK/s/GwVlRQpPDRc0f2jWbwEoFkjqQEAQDPlru5FYXGhElYn1Fg95W37uhT7M8igVdeuUs9OPQlyALRJW7dulSSFhYUpKipKr7zyihYtWqSvvvrK0WbAgAFKSkrSXXfdpc6dO9foo+oukyFDhngcr+r9nJwcp6SGt/0EBQVp4MCB+uqrr5yekU4WGi8oKPBpLgCA1ikwIJA6eQBaFK9ragAAgMbjqe6F/bOUjBTH0VJ1aR/dP1omo6nG2bnVmUJPbjufeOZExUTGaNLZkxQTGUNCA0Cb8t1330mSIiMjNXPmTP35z392SmhIJ3dizJs3TyNHjtS+fftq9LF3717Htclk8jheRESEy+eqft+pUyd16dLFq37279+v48ePOz4vKChwHGtVn7kAAAAATcWrnRovv/yy3wa84YYb/NYXAACtVW11L2yyaW/xXmXnZysmMqbO7dPi0pSwOkEGGVwmQubHzNc90feQwADQ5Jo6Fvn9998lnayt8d///lddunTRv/71L5nNZhmNRn399de6//779e677+qbb77RxIkTlZ2d7VTvoqSkxHHtaidHVZ06dXJcl5aWOt2z91NbH676CQ4O9utcqjt+/LhT8qS4uLjWOQIAAAC+8CqpceONN8pg8Lya0xsGg4GkBgAAXvC27oW9XV3b24sCVq+/EWGMoF4GgGalqWORI0eOSDr5R/vAwEC9++67ToW+hw4dqvXr12v8+PF69913tXnzZlksFiUkJDjaHDt2zHHdvn17j+PZkw+SdPToUad79n5q68NTP/6aS3ULFizQ/Pnza50XAAAAUF9eJTX69+/vNpDYv3+/ysrKTnYWFOQokvfbb7+poqJC0skVPj169PDHfAEAaBO8rXthb9erUy+v2ldtR1FAAC1BU8ciHTp0cCQ2Jk6c6JTQsAsICNCjjz6qd999V5K0atUqp6RGhw4dHNfl5eUex6u62yEkJKTGXLzpw1M//ppLdXPnztWdd97p+L64uNjp+CoAAADAX7yqqZGXl6c9e/bU+Pr73/+uEydO6OKLL9aGDRtUUlKioqIiFRUVqbS0VBs2bFB0dLROnDihv//979qzZ09D/zwAALQKtdW9MMigCGOEovtH12sce1FA6mUAaK6aOhYJDQ11XF955ZVu25155pnq16+fJOmzzz5z20dtxzjZEyhSzeOh7P3U1oenfvw1l+qCg4NlNBqdvgAAAICG4HOh8I8++ki33XabrrrqKmVlZemyyy5z2p7cvn17XXbZZcrKytJVV12l2267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gMH7/3QZZJAkpcalUvsCAFqRlhiLAAAAAPAPn5MaF110kYqLi/X999/X2vb777/X4cOHdfHFF/s6nF906NDBcT1x4kSNGDGiRpuAgAA9+uijju9XrVrlto/y8nKP41U9KiokJMRlP7X14akff82lqrlz5+rw4cOOL46qAtCQ+of196pdx3YdlXJhijKTMvXata/J8H//VxuT0aT0xHSZo2pfyQsAaDlaYiwCAAAAwD98TmrcfffdateunW699VanP5hXV15erltvvVXt2rXT3Xff7etwfhEaGuq4tu/GcOXMM89Uv379JEmfffaZ2z48HeMk/W9niFTzeCh7P7X14akff82lquDgYBmNRqcvAGgolwy4xKt2rye+rsVxixUTGaOEMxOUnpiufsZ+Tm0ijBFak7BGmUmZWmleqcykTO1J3kNCAwBaoZYYiwAAAADwjyBfHxw6dKhWr16tpKQknXvuuZozZ45iY2MdyYDCwkJlZmbqscceU1FRkdLT03X++ef7beK+iIiI0M8//yzJu8LahYWF+vXXX50+r/pcQUGBxz6q7nKofoyTyWTSp59+qiNHjujQoUMei4Xb+7Efk+XvuQBAU4mJjFH3kO4ei4V3D+muS091LgJrjjIrfnC8svOzVVRSpPDQcEX3j+aIKQBoI1piLAIAAADAP3xOagQG/u8PR8XFxbr55ps9tr/mmmtcfm4wGFRRUeHrNOrkzDPPdOy8sFqtHtva7wcFOf+KzjjjDMf1zp07PfZR9X5UVFSNftauXeto5+ooLEmqqKjQ7t27XfbRuXNnRUREaO/evfWaCwDUlbXS6jKh4O5zdwIDArXsqmW6dvW1btssu2qZyz4CAwIVExnjjx8HANDCtMRYBAAAAIB/+Hz8lM1m89tXYxk9erTj2p4ocOfHH3+UJMdqL7sBAwaob9++kqSPP/7YYx8bN2509BEZGel0r+qZvp762b59u+PoqFGjRtW4b+9n165djl0orlQdw1U/AOAtS45FkWmRil0Rq8mWyYpdEavItEjNeX+Oy88tORaP/ZmjzFqbuFamUOcddCajSWsT13J8FACghpYYiwAAAADwD593amRmZvpzHo3i6quvVrt27XTixAlZLBZNnz7dZbuPP/5Yv/128iiU6Ohop3sGg0Hx8fF65plntHPnTm3dutXlLoutW7c6dkfEx8fLYHAu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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# training results\n", + "(df_train, r2_train) = get_inference(model = cnn3d, data_loader= train_dl, device = device)\n", + "\n", + "# validation results\n", + "(df_val, r2_val) = get_inference(model = cnn3d, data_loader= val_dl, device = device)\n", + "\n", + "# test results\n", + "(df_test, r2_test) = get_inference(model = cnn3d, data_loader= test_dl, device = device)\n", + "\n", + "\n", + "# plotting\n", + "(df_train, r2_train)=combine_train_and_val(df_train,df_val)\n", + "dfs = [df_train,df_test]\n", + "r2s = [r2_train,r2_test]\n", + "\n", + "fig, ax = plt.subplots(1,len(r2s), figsize = (16,5))\n", + "\n", + "for idx, (df,r2) in enumerate(zip(dfs,r2s)):\n", + " ax[idx].plot(df['y'],df['y_h'],'go')\n", + " ax[idx].set_xlabel('viscosity [cP]',fontsize = 18)\n", + " ax[idx].set_ylabel('viscosity predicted [cP]',fontsize = 18)\n", + " ax[idx].set_title('r2 = '+str(round(r2,3)),fontsize = 18)\n", + " ax[idx].xaxis.set_tick_params(labelsize=20)\n", + " ax[idx].yaxis.set_tick_params(labelsize=20)\n", + "\n", + "fig.tight_layout()\n", + "\n", + "plt.savefig('viscosity_pred.png',bbox_inches = 'tight')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/check_annotation.asv b/check_annotation.asv new file mode 100644 index 0000000000000000000000000000000000000000..efd66f6e8fd916b42c36c58a613bbf072891d6d4 --- /dev/null +++ b/check_annotation.asv @@ -0,0 +1,29 @@ +%% copy files randomly +copy_files = false; +path = 'D:\All_files\pys\AI_algos\Mikes_Work\viscosity-video-classification\code_digdiscovery\annotate\'; +file_path = 'D:\All_files\pys\AI_algos\Mikes_Work\viscosity-video-classification\code_digdiscovery\new_honey_164\'; +cropped_path = [path, 'cropped']; + +tot_frames = 1; +folders = dir(file_path); +if copy_files + for i = 1: length(folders) + + if ~strcmp(folders(i).name,'.') && ~strcmp(folders(i).name,'..') + frame_list = randperm(30,tot_frames); + for j = 1 : tot_frames + frames = ['frame_',num2str(frame_list(j)),'.jpg']; + copyfile([file_path,folders(i).name,'\',frames],[path,folders(i).name,'_',frames]); + end + end + + end +end + + +%% check a single image and crop the rest using the smale BBox +files = dir(path); +figure; +file = '2202_frame_6.jpg'; +img = imread(file);i + diff --git a/check_annotation.m b/check_annotation.m new file mode 100644 index 0000000000000000000000000000000000000000..f2dda921bea62faebe66ecdac1499826b01e4d0b --- /dev/null +++ b/check_annotation.m @@ -0,0 +1,44 @@ +%% copy files randomly +copy_files = false; +path = 'D:\All_files\pys\AI_algos\Mikes_Work\viscosity-video-classification\code_digdiscovery\annotate\'; +file_path = 'D:\All_files\pys\AI_algos\Mikes_Work\viscosity-video-classification\code_digdiscovery\new_honey_164\'; +cropped_path = [path, 'cropped\']; + +tot_frames = 1; +folders = dir(file_path); +if copy_files + for i = 1: length(folders) + + if ~strcmp(folders(i).name,'.') && ~strcmp(folders(i).name,'..') + frame_list = randperm(30,tot_frames); + for j = 1 : tot_frames + frames = ['frame_',num2str(frame_list(j)),'.jpg']; + copyfile([file_path,folders(i).name,'\',frames],[path,folders(i).name,'_',frames]); + end + end + + end +end + + +%% check a single image and crop the rest using the smale BBox +files = dir([path,'*.jpg']); +% figure; +% file = '2202_frame_6.jpg'; +% img = imread([path,file]);subplot(1,2,1);imshow(img); +% h = drawrectangle(); +% img_crop = imcrop(img,h.Position); +% subplot(1,2,2);imshow(img_crop); + + +for i = 1: length(files) + + if ~strcmp(files(i).name,'.') && ~strcmp(files(i).name,'..') + + img = imread([path,files(i).name]); + img_crop = imcrop(img,h.Position); + imwrite(img_crop,[cropped_path,files(i).name]) + + end +end + diff --git a/functions.py b/functions.py new file mode 100644 index 0000000000000000000000000000000000000000..67c1c22a92ffe78095e3b57f7156e0308f155ab2 --- /dev/null +++ b/functions.py @@ -0,0 +1,388 @@ +import os +import numpy as np +from PIL import Image +from torch.utils import data +import torch +import torch.nn as nn +import torch.nn.functional as F +import torchvision.models as models +import torchvision.transforms as transforms +from tqdm import tqdm + +## ------------------- label conversion tools ------------------ ## +def labels2cat(label_encoder, list): + return label_encoder.transform(list) + +def labels2onehot(OneHotEncoder, label_encoder, list): + return OneHotEncoder.transform(label_encoder.transform(list).reshape(-1, 1)).toarray() + +def onehot2labels(label_encoder, y_onehot): + return label_encoder.inverse_transform(np.where(y_onehot == 1)[1]).tolist() + +def cat2labels(label_encoder, y_cat): + return label_encoder.inverse_transform(y_cat).tolist() + + +## ---------------------- Dataloaders ---------------------- ## +# for 3DCNN +class Dataset_3DCNN(data.Dataset): + "Characterizes a dataset for PyTorch" + def __init__(self, data_path, folders, labels, frames, transform=None): + "Initialization" + self.data_path = data_path + self.labels = labels + self.folders = folders + self.transform = transform + self.frames = frames + + def __len__(self): + "Denotes the total number of samples" + return len(self.folders) + + def read_images(self, path, selected_folder, use_transform): + X = [] + for i in self.frames: + image = Image.open(os.path.join(path, selected_folder, 'frame_{:01d}.jpg'.format(i))).convert('L') + + if use_transform is not None: + image = use_transform(image) + + X.append(image.squeeze_(0)) + X = torch.stack(X, dim=0) + + return X + + def __getitem__(self, index): + "Generates one sample of data" + # Select sample + folder = self.folders[index] + + # Load data + X = self.read_images(self.data_path, folder, self.transform).unsqueeze_(0) # (input) spatial images + y = torch.LongTensor([self.labels[index]]) # (labels) LongTensor are for int64 instead of FloatTensor + + # print(X.shape) + return X, y + + +# for CRNN +class Dataset_CRNN(data.Dataset): + "Characterizes a dataset for PyTorch" + def __init__(self, data_path, folders, labels, frames, transform=None): + "Initialization" + self.data_path = data_path + self.labels = labels + self.folders = folders + self.transform = transform + self.frames = frames + + def __len__(self): + "Denotes the total number of samples" + return len(self.folders) + + def read_images(self, path, selected_folder, use_transform): + X = [] + for i in self.frames: + image = Image.open(os.path.join(path, selected_folder, 'frame{:01d}.jpg'.format(i))) + + if use_transform is not None: + image = use_transform(image) + + X.append(image) + X = torch.stack(X, dim=0) + + return X + + def __getitem__(self, index): + "Generates one sample of data" + # Select sample + folder = self.folders[index] + + # Load data + X = self.read_images(self.data_path, folder, self.transform) # (input) spatial images + y = torch.LongTensor([self.labels[index]]) # (labels) LongTensor are for int64 instead of FloatTensor + + # print(X.shape) + return X, y + +## ---------------------- end of Dataloaders ---------------------- ## + + + +## -------------------- (reload) model prediction ---------------------- ## +def Conv3d_final_prediction(model, device, loader): + model.eval() + + all_y_pred = [] + with torch.no_grad(): + for batch_idx, (X, y) in enumerate(tqdm(loader)): + # distribute data to device + X = X.to(device) + output = model(X) + y_pred = output.max(1, keepdim=True)[1] # location of max log-probability as prediction + + all_y_pred.append(y_pred.data.squeeze().numpy().tolist()) + + return all_y_pred + + +def CRNN_final_prediction(model, device, loader): + cnn_encoder, rnn_decoder = model + cnn_encoder.eval() + rnn_decoder.eval() + + all_y_pred = [] + with torch.no_grad(): + for batch_idx, (X, y) in enumerate(tqdm(loader)): + # distribute data to device + X = X.to(device) + output = rnn_decoder(cnn_encoder(X)) + y_pred = output.max(1, keepdim=True)[1] # location of max log-probability as prediction + all_y_pred.extend(y_pred.cpu().data.squeeze().numpy().tolist()) + + return all_y_pred + +## -------------------- end of model prediction ---------------------- ## + + + +## ------------------------ 3D CNN module ---------------------- ## +def conv3D_output_size(img_size, padding, kernel_size, stride): + # compute output shape of conv3D + outshape = (np.floor((img_size[0] + 2 * padding[0] - (kernel_size[0] - 1) - 1) / stride[0] + 1).astype(int), + np.floor((img_size[1] + 2 * padding[1] - (kernel_size[1] - 1) - 1) / stride[1] + 1).astype(int), + np.floor((img_size[2] + 2 * padding[2] - (kernel_size[2] - 1) - 1) / stride[2] + 1).astype(int)) + return outshape + +class CNN3D(nn.Module): + def __init__(self, t_dim=120, img_x=90, img_y=120, drop_p=0.2, fc_hidden1=256, fc_hidden2=128, num_classes=50): + super(CNN3D, self).__init__() + + # set video dimension + self.t_dim = t_dim + self.img_x = img_x + self.img_y = img_y + # fully connected layer hidden nodes + self.fc_hidden1, self.fc_hidden2 = fc_hidden1, fc_hidden2 + self.drop_p = drop_p + self.num_classes = num_classes + self.ch1, self.ch2 = 32, 48 + self.k1, self.k2 = (5, 5, 5), (3, 3, 3) # 3d kernel size + self.s1, self.s2 = (2, 2, 2), (2, 2, 2) # 3d strides + self.pd1, self.pd2 = (0, 0, 0), (0, 0, 0) # 3d padding + + # compute conv1 & conv2 output shape + self.conv1_outshape = conv3D_output_size((self.t_dim, self.img_x, self.img_y), self.pd1, self.k1, self.s1) + self.conv2_outshape = conv3D_output_size(self.conv1_outshape, self.pd2, self.k2, self.s2) + + self.conv1 = nn.Conv3d(in_channels=1, out_channels=self.ch1, kernel_size=self.k1, stride=self.s1, + padding=self.pd1) + self.bn1 = nn.BatchNorm3d(self.ch1) + self.conv2 = nn.Conv3d(in_channels=self.ch1, out_channels=self.ch2, kernel_size=self.k2, stride=self.s2, + padding=self.pd2) + self.bn2 = nn.BatchNorm3d(self.ch2) + self.relu = nn.ReLU(inplace=True) + self.drop = nn.Dropout3d(self.drop_p) + self.pool = nn.MaxPool3d(2) + self.fc1 = nn.Linear(self.ch2 * self.conv2_outshape[0] * self.conv2_outshape[1] * self.conv2_outshape[2], + self.fc_hidden1) # fully connected hidden layer + self.fc2 = nn.Linear(self.fc_hidden1, self.fc_hidden2) + self.fc3 = nn.Linear(self.fc_hidden2, self.num_classes) # fully connected layer, output = multi-classes + + def forward(self, x_3d): + # Conv 1 + x = self.conv1(x_3d) + x = self.bn1(x) + x = self.relu(x) + x = self.drop(x) + # Conv 2 + x = self.conv2(x) + x = self.bn2(x) + x = self.relu(x) + x = self.drop(x) + # FC 1 and 2 + x = x.view(x.size(0), -1) + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = F.dropout(x, p=self.drop_p, training=self.training) + x = self.fc3(x) + + return x + +## --------------------- end of 3D CNN module ---------------- ## + + + +## ------------------------ CRNN module ---------------------- ## + +def conv2D_output_size(img_size, padding, kernel_size, stride): + # compute output shape of conv2D + outshape = (np.floor((img_size[0] + 2 * padding[0] - (kernel_size[0] - 1) - 1) / stride[0] + 1).astype(int), + np.floor((img_size[1] + 2 * padding[1] - (kernel_size[1] - 1) - 1) / stride[1] + 1).astype(int)) + return outshape + + +# 2D CNN encoder train from scratch (no transfer learning) +class EncoderCNN(nn.Module): + def __init__(self, img_x=90, img_y=120, fc_hidden1=512, fc_hidden2=512, drop_p=0.3, CNN_embed_dim=300): + super(EncoderCNN, self).__init__() + + self.img_x = img_x + self.img_y = img_y + self.CNN_embed_dim = CNN_embed_dim + + # CNN architechtures + self.ch1, self.ch2, self.ch3, self.ch4 = 32, 64, 128, 256 + self.k1, self.k2, self.k3, self.k4 = (5, 5), (3, 3), (3, 3), (3, 3) # 2d kernal size + self.s1, self.s2, self.s3, self.s4 = (2, 2), (2, 2), (2, 2), (2, 2) # 2d strides + self.pd1, self.pd2, self.pd3, self.pd4 = (0, 0), (0, 0), (0, 0), (0, 0) # 2d padding + + # conv2D output shapes + self.conv1_outshape = conv2D_output_size((self.img_x, self.img_y), self.pd1, self.k1, self.s1) # Conv1 output shape + self.conv2_outshape = conv2D_output_size(self.conv1_outshape, self.pd2, self.k2, self.s2) + self.conv3_outshape = conv2D_output_size(self.conv2_outshape, self.pd3, self.k3, self.s3) + self.conv4_outshape = conv2D_output_size(self.conv3_outshape, self.pd4, self.k4, self.s4) + + # fully connected layer hidden nodes + self.fc_hidden1, self.fc_hidden2 = fc_hidden1, fc_hidden2 + self.drop_p = drop_p + + self.conv1 = nn.Sequential( + nn.Conv2d(in_channels=3, out_channels=self.ch1, kernel_size=self.k1, stride=self.s1, padding=self.pd1), + nn.BatchNorm2d(self.ch1, momentum=0.01), + nn.ReLU(inplace=True), + # nn.MaxPool2d(kernel_size=2), + ) + self.conv2 = nn.Sequential( + nn.Conv2d(in_channels=self.ch1, out_channels=self.ch2, kernel_size=self.k2, stride=self.s2, padding=self.pd2), + nn.BatchNorm2d(self.ch2, momentum=0.01), + nn.ReLU(inplace=True), + # nn.MaxPool2d(kernel_size=2), + ) + + self.conv3 = nn.Sequential( + nn.Conv2d(in_channels=self.ch2, out_channels=self.ch3, kernel_size=self.k3, stride=self.s3, padding=self.pd3), + nn.BatchNorm2d(self.ch3, momentum=0.01), + nn.ReLU(inplace=True), + # nn.MaxPool2d(kernel_size=2), + ) + + self.conv4 = nn.Sequential( + nn.Conv2d(in_channels=self.ch3, out_channels=self.ch4, kernel_size=self.k4, stride=self.s4, padding=self.pd4), + nn.BatchNorm2d(self.ch4, momentum=0.01), + nn.ReLU(inplace=True), + # nn.MaxPool2d(kernel_size=2), + ) + + self.drop = nn.Dropout2d(self.drop_p) + self.pool = nn.MaxPool2d(2) + self.fc1 = nn.Linear(self.ch4 * self.conv4_outshape[0] * self.conv4_outshape[1], self.fc_hidden1) # fully connected layer, output k classes + self.fc2 = nn.Linear(self.fc_hidden1, self.fc_hidden2) + self.fc3 = nn.Linear(self.fc_hidden2, self.CNN_embed_dim) # output = CNN embedding latent variables + + def forward(self, x_3d): + cnn_embed_seq = [] + for t in range(x_3d.size(1)): + # CNNs + x = self.conv1(x_3d[:, t, :, :, :]) + x = self.conv2(x) + x = self.conv3(x) + x = self.conv4(x) + x = x.view(x.size(0), -1) # flatten the output of conv + + # FC layers + x = F.relu(self.fc1(x)) + # x = F.dropout(x, p=self.drop_p, training=self.training) + x = F.relu(self.fc2(x)) + x = F.dropout(x, p=self.drop_p, training=self.training) + x = self.fc3(x) + cnn_embed_seq.append(x) + + # swap time and sample dim such that (sample dim, time dim, CNN latent dim) + cnn_embed_seq = torch.stack(cnn_embed_seq, dim=0).transpose_(0, 1) + # cnn_embed_seq: shape=(batch, time_step, input_size) + + return cnn_embed_seq + + +# 2D CNN encoder using ResNet-152 pretrained +class ResCNNEncoder(nn.Module): + def __init__(self, fc_hidden1=512, fc_hidden2=512, drop_p=0.3, CNN_embed_dim=300): + """Load the pretrained ResNet-152 and replace top fc layer.""" + super(ResCNNEncoder, self).__init__() + + self.fc_hidden1, self.fc_hidden2 = fc_hidden1, fc_hidden2 + self.drop_p = drop_p + + resnet = models.resnet152(pretrained=True) + modules = list(resnet.children())[:-1] # delete the last fc layer. + self.resnet = nn.Sequential(*modules) + self.fc1 = nn.Linear(resnet.fc.in_features, fc_hidden1) + self.bn1 = nn.BatchNorm1d(fc_hidden1, momentum=0.01) + self.fc2 = nn.Linear(fc_hidden1, fc_hidden2) + self.bn2 = nn.BatchNorm1d(fc_hidden2, momentum=0.01) + self.fc3 = nn.Linear(fc_hidden2, CNN_embed_dim) + + def forward(self, x_3d): + cnn_embed_seq = [] + for t in range(x_3d.size(1)): + # ResNet CNNFcnn + with torch.no_grad(): + x = self.resnet(x_3d[:, t, :, :, :]) # ResNet + x = x.view(x.size(0), -1) # flatten output of conv + + # FC layers + x = self.bn1(self.fc1(x)) + x = F.relu(x) + x = self.bn2(self.fc2(x)) + x = F.relu(x) + x = F.dropout(x, p=self.drop_p, training=self.training) + x = self.fc3(x) + + cnn_embed_seq.append(x) + + # swap time and sample dim such that (sample dim, time dim, CNN latent dim) + cnn_embed_seq = torch.stack(cnn_embed_seq, dim=0).transpose_(0, 1) + # cnn_embed_seq: shape=(batch, time_step, input_size) + + return cnn_embed_seq + + +class DecoderRNN(nn.Module): + def __init__(self, CNN_embed_dim=300, h_RNN_layers=3, h_RNN=256, h_FC_dim=128, drop_p=0.3, num_classes=50): + super(DecoderRNN, self).__init__() + + self.RNN_input_size = CNN_embed_dim + self.h_RNN_layers = h_RNN_layers # RNN hidden layers + self.h_RNN = h_RNN # RNN hidden nodes + self.h_FC_dim = h_FC_dim + self.drop_p = drop_p + self.num_classes = num_classes + + self.LSTM = nn.LSTM( + input_size=self.RNN_input_size, + hidden_size=self.h_RNN, + num_layers=h_RNN_layers, + batch_first=True, # input & output will has batch size as 1s dimension. e.g. (batch, time_step, input_size) + ) + + self.fc1 = nn.Linear(self.h_RNN, self.h_FC_dim) + self.fc2 = nn.Linear(self.h_FC_dim, self.num_classes) + + def forward(self, x_RNN): + + self.LSTM.flatten_parameters() + RNN_out, (h_n, h_c) = self.LSTM(x_RNN, None) + """ h_n shape (n_layers, batch, hidden_size), h_c shape (n_layers, batch, hidden_size) """ + """ None represents zero initial hidden state. RNN_out has shape=(batch, time_step, output_size) """ + + # FC layers + x = self.fc1(RNN_out[:, -1, :]) # choose RNN_out at the last time step + x = F.relu(x) + x = F.dropout(x, p=self.drop_p, training=self.training) + x = self.fc2(x) + + return x + +## ---------------------- end of CRNN module ---------------------- ## + diff --git a/models/__pycache__/feedforward.cpython-38.pyc b/models/__pycache__/feedforward.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4fcb7ed5f69ffc6dd755d68dd441bc66befda8e Binary files /dev/null and b/models/__pycache__/feedforward.cpython-38.pyc differ diff --git a/models/__pycache__/inference.cpython-38.pyc b/models/__pycache__/inference.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e18f1533120d93753367c51c3a45ce55541d189 Binary files /dev/null and b/models/__pycache__/inference.cpython-38.pyc differ diff --git a/models/__pycache__/training.cpython-38.pyc b/models/__pycache__/training.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fca5593b4cfa5fc4ec472f532467026101f96fc8 Binary files /dev/null and b/models/__pycache__/training.cpython-38.pyc differ diff --git a/models/__pycache__/viscosity_models.cpython-38.pyc b/models/__pycache__/viscosity_models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fb9c3576e8fa569e2223c2ce57d5f82a46e8b7b Binary files /dev/null and b/models/__pycache__/viscosity_models.cpython-38.pyc differ diff --git a/models/feedforward.py b/models/feedforward.py new file mode 100644 index 0000000000000000000000000000000000000000..5e7d9a01e6e55deeda172c3cf60cf9e0cc303582 --- /dev/null +++ b/models/feedforward.py @@ -0,0 +1,63 @@ +from torch import nn +import torch.nn.functional as F + +class LinLayers(nn.Module): + + def __init__(self, args): + super(LinLayers,self).__init__() + + in_dim= args.in_dim #16, + hidden_layers= args.hidden_layers #[512,256,128,2], + activations=args.activations#[nn.LeakyReLU(0.2),nn.LeakyReLU(0.2),nn.LeakyReLU(0.2)], + batchnorms=args.bns#[True,True,True], + dropouts = args.dropouts#[None, 0.2, 0.2] + + + assert len(hidden_layers) == len(activations) == len(batchnorms) == len(dropouts), 'dimensions mismatch!' + + + layers=nn.ModuleList() + + if hidden_layers: + old_dim=in_dim + for idx,layer in enumerate(hidden_layers): + sub_layers = nn.ModuleList() + sub_layers.append(nn.Linear(old_dim,layer)) + if batchnorms[idx] : sub_layers.append(nn.BatchNorm1d(num_features=layer)) + if activations[idx] : sub_layers.append(activations[idx]) + if dropouts[idx] : sub_layers.append(nn.Dropout(p=dropouts[idx])) + old_dim = layer + + sub_layers = nn.Sequential(*sub_layers) + + layers.append(sub_layers) + + + + else:# for single layer + layers.append(nn.Linear(in_dim,out_dim)) + if batchnorms : layers.append(nn.BatchNorm1d(num_features=out_dim)) + if activations : layers.append(activations) + if dropouts : layers.append(nn.Dropout(p=dropouts)) + + self.layers = nn.Sequential(*layers) + + + + def forward(self,x): + + x = self.layers(x) + + return x + + ''' + def _check_dimensions(self): + if isinstance(self.hidden_layers,list) : + assert len(self.hidden_layers)==len(self.activations) + assert len(self.hidden_layers)==len(self.batchnorms) + assert len(self.hidden_layers)==len(self.dropouts) + ''' + + + + diff --git a/models/inference.py b/models/inference.py new file mode 100644 index 0000000000000000000000000000000000000000..3d3c8af61d5ca99de0df130514e35a5f11c498f4 --- /dev/null +++ b/models/inference.py @@ -0,0 +1,40 @@ +from typing import List, Optional, Tuple +from models.viscosity_models import CNN3D +import torch +from torch.utils.data.dataloader import DataLoader +from sklearn.metrics import r2_score +import numpy as np +import pandas as pd + +@torch.no_grad() +def get_inference(model : CNN3D, data_loader : DataLoader, device : torch.device) -> Tuple[float, float]: + + y_h_all = [] + y_all =[] + for (X,y) in data_loader: + X = X.to(device) + + y = y.to(torch.float32) + + y_h = model(X) + + y_h_all.extend(y_h.detach().cpu().numpy()) + y_all.extend(y.numpy()) + + df = pd.DataFrame({'y': np.array(y_all).ravel(), 'y_h': np.array(y_h_all).ravel()}) + + return (df, r2_score(np.array(y_all),np.array(y_h_all))) + + + +def combine_train_and_val(df_train,df_val): + + df = pd.concat([df_train,df_val]) + + r2 = r2_score(df['y'],df['y_h']) + + return df,r2 + + + + \ No newline at end of file diff --git a/models/training.py b/models/training.py new file mode 100644 index 0000000000000000000000000000000000000000..d7db61a4fff149d7f0094b676632d9c61ce0a0b1 --- /dev/null +++ b/models/training.py @@ -0,0 +1,141 @@ +from torch import nn, tensor, float32 +import os +import torch +from torch.utils.data.dataloader import DataLoader +from sklearn.metrics import r2_score +import numpy as np +from models.viscosity_models import CNN3D +from pytorchtools import EarlyStopping +from typing import List, Optional, Callable, Tuple +from utils.datastruct import history, metrics +from tqdm import tqdm + +def train(model : CNN3D, + data_loader : DataLoader, + optimizer : torch.optim.Optimizer, + criterion : torch.nn.modules.loss._Loss, + device : torch.device) -> float: + + train_loss = [] + model.train() + + for (X,y) in data_loader: + X = X.to(device) + y = y.to(device) + + y = y.to(float32) + # zeroing grads + optimizer.zero_grad() + # model out + #out = model(data.x, data.edge_index, data.batch) + out = model(X) + #loss = criterion(out,data.y.reshape(-1,1)) + loss = criterion(out,y) + loss.backward() + optimizer.step() + train_loss.append(loss.item()) + + return np.mean(train_loss) + + +def test(model : CNN3D, data_loader : DataLoader, criterion : torch.nn.modules.loss._Loss, device : torch.device) -> Tuple[float, float]: + model.eval() + + y_h_all = [] + y_all =[] + test_loss = [] + + with torch.no_grad(): + for (X,y) in data_loader: + X = X.to(device) + + y = y.to(float32) + + y_h = model(X) + + loss = criterion(y_h.detach().cpu(),y) + test_loss.append(loss) + + y_h_all.extend(y_h.detach().cpu().numpy()) + y_all.extend(y.numpy()) + + return (np.mean(test_loss), r2_score(np.array(y_all),np.array(y_h_all))) + + + +def train_epochs(model : CNN3D , + dataloaders : List[DataLoader], + optimizer : torch.optim.Optimizer, ##Callable[torch.optim.Optimizer], + criterion : torch.nn.modules.loss._Loss, #Callable[], + epochs : int, + early_stop : Optional[int], + device : torch.device, + path : str, + save_weights_frequency : int) -> Tuple[CNN3D, history]: + + # parse dataloaders + ''' + if len(data_loader)>2 : + (train_loader, val_loader, test_loader) = dataloaders + else : + (train_loader, val_loader) = dataloaders + ''' + (train_loader, val_loader, test_loader) = dataloaders + + if early_stop : early_stopping = EarlyStopping(patience=early_stop, verbose=True) + + train_loss_list=[] + val_loss_list=[] + test_loss_list=[] + + train_r2_list=[] + val_r2_list=[] + test_r2_list=[] + + for epoch in tqdm(range(epochs)): + + loss = train(model, + data_loader=train_loader, + optimizer=optimizer, + criterion=criterion, + device = device) + + # performance evaluatons + (_,r2_train) = test(model = model,data_loader = train_loader, criterion = criterion, device = device) + (val_loss, r2_val) = test(model = model, data_loader=val_loader, criterion = criterion, device = device) + (test_loss, r2_test) = test(model = model, data_loader=test_loader, criterion = criterion, device = device) + (test_loss, r2_test) = test(model = model, data_loader=test_loader, criterion = criterion, device = device) + + # early stop + if early_stop : + early_stopping(val_loss, model) + if early_stopping.early_stop: + print("Early stopping") + break + # mse + train_loss_list.append(loss) + val_loss_list.append(val_loss) + test_loss_list.append(test_loss) + + # r2 + train_r2_list.append(r2_train) + val_r2_list.append(r2_val) + test_r2_list.append(r2_test) + + + #save params + if (epoch+1) % save_weights_frequency == 0: + torch.save(model.state_dict(), os.path.join(path,'cnn3d_epoch_'+str(epoch+1)+'.pt')) + + print(f'Epoch: {epoch:03d}, train loss: {loss : .4f}, val loss: {val_loss:.4f}, test loss : {test_loss:.4f}') + + print(f'Epoch: {epoch:03d}, train r2: {r2_train : .4f}, val r2: {r2_val:.4f}, test r2: {r2_test:.4f}') + + + return model, history(metrics(r2_train, train_loss_list), metrics(r2_val, val_loss_list), metrics(r2_test, test_loss_list)) + + + + + + diff --git a/models/viscosity_models.py b/models/viscosity_models.py new file mode 100644 index 0000000000000000000000000000000000000000..f92bf9bb60dd9493223abc5b22c3fd2a8051c03a --- /dev/null +++ b/models/viscosity_models.py @@ -0,0 +1,176 @@ +import torch +from torch import nn +from utils.datastruct import NetData +from models.feedforward import LinLayers + + +class CNN3D_Mike(nn.Module): + def __init__(self, t_dim=30, img_x=256 , img_y=342, drop_p=0, fc_hidden1=256, fc_hidden2=256): + super(CNN3D_Mike, self).__init__() # set video dimension + self.t_dim = t_dim + self.img_x = img_x + self.img_y = img_y + # fully connected layer hidden nodes + self.fc_hidden1, self.fc_hidden2 = fc_hidden1, fc_hidden2 + self.drop_p = drop_p + #self.num_classes = num_classes + self.ch1, self.ch2 = 32, 48 + self.k1, self.k2 = (5, 5, 5), (3, 3, 3) # 3d kernel size + self.s1, self.s2 = (2, 2, 2), (2, 2, 2) # 3d strides + self.pd1, self.pd2 = (0, 0, 0), (0, 0, 0) # 3d padding # compute conv1 & conv2 output shape + self.conv1_outshape = conv3D_output_size((self.t_dim, self.img_x, self.img_y), self.pd1, self.k1, self.s1) + self.conv2_outshape = conv3D_output_size(self.conv1_outshape, self.pd2, self.k2, self.s2) + self.conv1 = nn.Conv3d(in_channels=1, out_channels=self.ch1, kernel_size=self.k1, stride=self.s1, + padding=self.pd1) + self.bn1 = nn.BatchNorm3d(self.ch1) + self.conv2 = nn.Conv3d(in_channels=self.ch1, out_channels=self.ch2, kernel_size=self.k2, stride=self.s2, + padding=self.pd2) + self.bn2 = nn.BatchNorm3d(self.ch2) + self.relu = nn.ReLU(inplace=True) + self.drop = nn.Dropout3d(self.drop_p) + self.pool = nn.MaxPool3d(2) + self.fc1 = nn.Linear(self.ch2*self.conv2_outshape[0]*self.conv2_outshape[1]*self.conv2_outshape[2], + self.fc_hidden1) # fully connected hidden layer + self.fc2 = nn.Linear(self.fc_hidden1, self.fc_hidden2) + self.fc3 = nn.Linear(self.fc_hidden2,1) # fully connected layer, output = multi-classes + + + def forward(self, x_3d): + # Conv 1 + x = self.conv1(x_3d) + + x = self.bn1(x) + x = self.relu(x) + x = self.drop(x) + # Conv 2 + x = self.conv2(x) + x = self.bn2(x) + x = self.relu(x) + x = self.drop(x) + # FC 1 and 2 + x = x.view(x.size(0), -1) + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + + #x = F.relu(self.fc3(x)) + #x = F.relu(self.fc3(x)) + x = F.dropout(x, p=self.drop_p, training=self.training) + #x = self.fc3(x) + #x = F.softmax(self.fc2(x)) + + x = self.fc3(x) + + + + return x + + + +class CNNLayers(nn.Module): + + def __init__(self, args): + + super(CNNLayers, self).__init__() + + self.in_dim = args.in_dim# 1/3 + self.n_f = args.n_f#[32,64] + self.kernel_size = args.kernel_size # [(5,5,5), (3,3,3)] + self.activations = args.activations#['relu', 'relu'] + self.bns = args.bns #[True, True], + self.dropouts = args.dropouts #[True, True] + #self.dropouts_ps = args.dropouts_ps#[0.5,.7] + self.paddings = args.paddings #[(0,0,0),(0,0,0)] + self.strides = args.strides # strides [(1,1,1),(1,1,1),(1,1,1)]) + #self.poolings = args.poolings + + assert len(self.n_f) == len(self.activations) == len(self.bns) == len(self.dropouts), 'dimensions mismatch : check dimensions!' + + # generate layers seq of seq + self._get_layers() + + def _get_layers(self): + + layers =nn.ModuleList() + in_channels = self.in_dim + + for idx, chans in enumerate(self.n_f): + sub_layers = nn.ModuleList() + + sub_layers.append(nn.Conv3d(in_channels = in_channels, + out_channels = chans, #self.n_f[idx], + kernel_size = self.kernel_size[idx], + stride = self.strides[idx], + padding = self.paddings[idx] + )) + + + + if self.bns[idx] : sub_layers.append(nn.BatchNorm3d(num_features = self.n_f[idx])) + + #if self.dropouts[idx] : sub_layers.append(nn.Dropout3d(p = self.dropouts_ps[idx])) + + if self.dropouts[idx] : sub_layers.append(nn.Dropout3d(p = self.dropouts[idx])) + + #if self.activations[idx] : sub_layers.append(self.__class__.get_activation(self.activations[idx])) + + if self.activations[idx] : sub_layers.append(self.activations[idx]) + + sub_layers = nn.Sequential(*sub_layers) + + layers.append(sub_layers) + + in_channels = self.n_f[idx] + + self.layers = nn.Sequential(*layers) + + + @staticmethod + def get_activation(activation): + if activation == 'relu': + activation=nn.ReLU() + elif activation == 'leakyrelu': + activation=nn.LeakyReLU(negative_slope=0.1) + elif activation == 'selu': + activation=nn.SELU() + + return activation + + + + def forward(self, x): + + x = self.layers(x) + + return x + + + +class CNN3D(nn.Module): + + def __init__(self, args): + super(CNN3D,self).__init__() + # check datatype + if not isinstance(args, NetData): + raise TypeError("input must be a ParserClass") + + self.cnn3d = CNNLayers(args.cnn3d) + + self.lin = LinLayers(args.lin) + + self.in_dim = args.lin.in_dim + + + def forward(self, x): + + # cnn 3d + x = self.cnn3d(x) + + x = x.view(-1, self.in_dim) + + # feedforward + x = self.lin(x) + + return x + + + \ No newline at end of file diff --git a/utils/__pycache__/datastruct.cpython-38.pyc b/utils/__pycache__/datastruct.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e2590ddde0fa76ec2e1d51b92a80479ca7f5c54 Binary files /dev/null and b/utils/__pycache__/datastruct.cpython-38.pyc differ diff --git a/utils/__pycache__/helper_fun.cpython-38.pyc b/utils/__pycache__/helper_fun.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c2c316d0d748572b54e23c811063703e8877844 Binary files /dev/null and b/utils/__pycache__/helper_fun.cpython-38.pyc differ diff --git a/utils/__pycache__/loaders_viscosity.cpython-38.pyc b/utils/__pycache__/loaders_viscosity.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e5cd02765da12973feb2799a948cee99bfd7e38 Binary files /dev/null and b/utils/__pycache__/loaders_viscosity.cpython-38.pyc differ diff --git a/utils/datastruct.py b/utils/datastruct.py new file mode 100644 index 0000000000000000000000000000000000000000..28fbaf651b5a19080a876fc379fd2b49b74a528c --- /dev/null +++ b/utils/datastruct.py @@ -0,0 +1,84 @@ +from typing import NamedTuple, List, Callable, List, Tuple, Optional +import torch + +class LinData(NamedTuple): + in_dim : int # input dimension + hidden_layers : List[int] # hidden layers including the output layer + activations : List[Optional[Callable[[torch.Tensor],torch.Tensor]]] # list of activations + bns : List[bool] # list of bools + dropouts : List[Optional[float]] # list of dropouts probas + +class CNNData(NamedTuple): + in_dim : int # input dimension + n_f : List[int] # num filters + kernel_size : List[Tuple] # kernel size [(5,5,5), (3,3,3),(3,3,3)] + activations : List[Optional[Callable[[torch.Tensor],torch.Tensor]]] # activation list + bns : List[bool] # batch normialization [True, True, False] + dropouts : List[Optional[float]] # # list of dropouts probas [.5,0,0] + #dropouts_ps : list # [0.5,.7, 0] + paddings : List[Optional[Tuple]] #[(0,0,0),(0,0,0), (0,0,0)] + strides : List[Optional[Tuple]] #[(1,1,1),(1,1,1),(1,1,1)] + + +class NetData(NamedTuple): + cnn3d : CNNData + lin : LinData + + +''' +class LinData(NamedTuple): + in_dim : int + #num_classes : int + hidden_layers : list + activations : list + bns : list + dropouts : list + +class CNNData(NamedTuple): + in_dim : int # input dimension + n_f : list # num filters + kernel_size : list # kernel size [(5,5,5), (3,3,3),(3,3,3)] + activations : list # activation list + bns : list # batch normialization [True, True, False] + dropouts : list # [True, True, False] + #dropouts_ps : list # [0.5,.7, 0] + paddings : list #[(0,0,0),(0,0,0), (0,0,0)] + strides : list #[(1,1,1),(1,1,1),(1,1,1)] + +class NetData(NamedTuple): + cnn3d : CNNData + lin : LinData + + +class Mdata(NamedTuple): + cm : list + ba : float + sn : float + sp : float + tn : int + fp : int + fn : int + tp : int + +class MetricData(NamedTuple): + train : Mdata + test : Mdata + +''' + + +# for outputs +class history(): + def __init__(self, train, val, test): + self.train = train + self.test = test + self.val = val + +class metrics(): + def __init__(self, r2, loss): + self.r2 = r2 + self.loss = loss + + + + \ No newline at end of file diff --git a/utils/helper_fun.py b/utils/helper_fun.py new file mode 100644 index 0000000000000000000000000000000000000000..a850ab73eb42522dc7514261d9df46d99b3ccf50 --- /dev/null +++ b/utils/helper_fun.py @@ -0,0 +1,21 @@ +from utils.datastruct import CNNData +import numpy as np + +def conv3D_output_size(args, img_size): + + if not isinstance(args, CNNData): + raise TypeError("input must be a ParserClass") + + (cin, h , w) = img_size + # compute output shape of conv3D + for idx , chan in enumerate(args.kernel_size): + padding = args.paddings[idx] + stride = args.strides[idx] + (cin, h , w) = (np.floor((cin + 2 * padding[0] - chan[0] ) / stride[0] + 1).astype(int), + np.floor((h + 2 * padding[1] - chan[1] ) / stride[1] + 1).astype(int), + np.floor((w + 2 * padding[2] - chan[2] ) / stride[2] + 1).astype(int)) + + + final_dim = int(args.n_f[-1] * cin * h * w) + + return final_dim \ No newline at end of file diff --git a/utils/loaders_viscosity.py b/utils/loaders_viscosity.py new file mode 100644 index 0000000000000000000000000000000000000000..cdd2175759eff3b780075f3f2dda795571cc113d --- /dev/null +++ b/utils/loaders_viscosity.py @@ -0,0 +1,120 @@ +import os +import numpy as np +from PIL import Image +from torch.utils.data import DataLoader, Dataset +from torch.utils.data.sampler import SubsetRandomSampler +import torch +import torchvision.transforms as transforms +from tqdm import tqdm +from sklearn.model_selection import train_test_split +from typing import List, Optional +from glob import glob + + +# dataset class for 3DCNN +class Dataset_3DCNN(Dataset): + "Characterizes a dataset for PyTorch" + def __init__(self, + path : str, + folders : List[str], + labels : List[float], + frames : List[int], + transform : Optional[transforms.Compose] = None): + "Initialization" + self.path = path + self.labels = labels + self.folders = folders + self.transform = transform + self.frames = frames + + def __len__(self): + "Denotes the total number of samples" + return len(self.folders) + + def read_images(self, path, selected_folder, use_transform): + X = [] + for i in self.frames: + image = Image.open(os.path.join(path, selected_folder, 'frame_{:01d}.jpg'.format(i))).convert('L') + + if use_transform is not None: + image = use_transform(image) + else: + image = transforms.ToTensor()(image) + + X.append(image.squeeze_(0)) + X = torch.stack(X, dim=0) + + return X + + def __getitem__(self, index): + "Generates one sample of data" + # Select sample + folder = self.folders[index] + + # Load data + X = self.read_images(self.path, folder, self.transform).unsqueeze_(0) # (input) spatial images + y = torch.LongTensor([self.labels[index]]) # (labels) LongTensor are for int64 instead of FloatTensor + + # print(X.shape) + return X, y + + + + +# train test splitting +def create_datasets(path : str = r'D:\All_files\pys\AI_algos\Mikes_Work\viscosity-video-classification\code_digdiscovery\new_honey_164', # absolute path + validation_split : float = 0.2, + test_split : float = 0.2, + batch_size : int = 32, + transform : transforms.Compose = transforms.Compose([transforms.Resize([256, 342]), + transforms.ToTensor(), + transforms.Normalize(mean=[0.5], std=[0.5])]), + random_seed : int = 112, + shuffle : bool = True, + selected_frames : List[int] = [0,10,20]): + + + all_X_list = [filename for filename in os.listdir(path)] + all_y_list = [int(filename) for filename in os.listdir(path)] + + # train, test split + train_list, test_list, train_label, test_label = train_test_split(all_X_list, all_y_list, test_size=test_split, random_state=random_seed) + + + + train_set, test_set = Dataset_3DCNN(path, train_list, train_label, selected_frames, transform=transform), \ + Dataset_3DCNN(path, test_list, test_label, selected_frames, transform=transform) + print('length test set ', len(test_set)) + + # split into training and validation batches + num_train = len(train_list) + indices = list(range(num_train)) + + if shuffle : + np.random.seed(random_seed) + np.random.shuffle(indices) + + split = int(np.floor(validation_split * num_train)) + train_idx, valid_idx = indices[split:], indices[:split] + + train_sampler = SubsetRandomSampler(train_idx) + + valid_sampler = SubsetRandomSampler(valid_idx) + + # loading train, validation and test data + train_loader = DataLoader(train_set, + batch_size=batch_size, + sampler=train_sampler, + num_workers=0) + valid_loader = DataLoader(train_set, + batch_size=batch_size, + sampler=valid_sampler, + num_workers=0) + + test_loader = DataLoader(test_set, + batch_size=batch_size, + num_workers=0) + + + + return train_loader, test_loader, valid_loader \ No newline at end of file diff --git a/viscosity_pred.png b/viscosity_pred.png new file mode 100644 index 0000000000000000000000000000000000000000..2456726552e17270cebf8ed4c3e10f38e016db89 Binary files /dev/null and b/viscosity_pred.png differ