1+
2+ #################################################################
3+ # Following block install additional packages used in this example #
4+ # If your environment is already set up, install them manually to avoid version conflicts #
5+ #################################################################
6+
7+ try :
8+ import numpy as np
9+ except ImportError :
10+ print (f'numpy not found, installing' )
11+ import pip
12+ pip .main (["install" , "numpy" ])
13+ import numpy as np
14+
15+ try :
16+ import matplotlib .pyplot as plt
17+ except ImportError :
18+ print (f'matplotlib not found, installing' )
19+ import pip
20+ pip .main (["install" , "matplotlib" ])
21+ import matplotlib .pyplot as plt
22+
23+ try :
24+ import pandas as pd
25+ except ImportError :
26+ print (f'pandas not found, installing' )
27+ import pip
28+ pip .main (["install" , "pandas" ])
29+ import pandas as pd
30+
31+ try :
32+ from pytorch_msssim import ssim
33+ except ImportError :
34+ print (f'pytorch_msssim not found, installing' )
35+ import pip
36+ pip .main (["install" , "pytorch_msssim" ])
37+ from pytorch_msssim import ssim
38+
39+ #################################################################
40+
41+
42+ import time
43+ import torch
44+ import torch .nn as nn
45+ import torch .optim as optim
46+ from torch .utils .data import DataLoader
47+ from torchcnnbuilder .preprocess import multi_output_tensor
48+ from torchcnnbuilder .models import ForecasterBase
49+ from data_loader import get_timespatial_series
50+
51+ # This script generate 2D CNN with 5 layers and train it with saving weights of model
52+
53+ device = torch .device ("cuda" if torch .cuda .is_available () else "cpu" )
54+ print (f'Calculating on device: { device } ' )
55+
56+ sea_name = 'kara'
57+ start_date = '19790101'
58+ end_date = '20200101'
59+ sea_data , dates = get_timespatial_series (sea_name , start_date , end_date )
60+ sea_data = sea_data [::7 ]
61+ dates = dates [::7 ]
62+
63+ pre_history_size = 104
64+ forecast_size = 52
65+
66+ dataset = multi_output_tensor (data = sea_data ,
67+ forecast_len = forecast_size ,
68+ pre_history_len = pre_history_size )
69+ dataloader = DataLoader (dataset , batch_size = 200 , shuffle = False )
70+ print ('Loader created' )
71+
72+ encoder = ForecasterBase (input_size = (sea_data .shape [1 ], sea_data .shape [2 ]),
73+ n_layers = 5 ,
74+ in_time_points = pre_history_size ,
75+ out_time_points = forecast_size )
76+ encoder .to (device )
77+ print (encoder )
78+
79+ optimizer = optim .Adam (encoder .parameters (), lr = 0.001 )
80+ criterion = nn .L1Loss ()
81+
82+ losses = []
83+ start = time .time ()
84+ epochs = 1000
85+ best_loss = 999
86+ best_model = None
87+ for epoch in range (epochs ):
88+ loss = 0
89+ for train_features , test_features in dataloader :
90+ train_features = train_features .to (device )
91+ test_features = test_features .to (device )
92+ optimizer .zero_grad ()
93+ outputs = encoder (train_features )
94+ train_loss = criterion (outputs , test_features )
95+ train_loss .backward ()
96+ optimizer .step ()
97+ loss += train_loss .item ()
98+
99+ loss = loss / len (dataloader )
100+ if loss is None :
101+ break
102+ if loss < best_loss and loss is not None :
103+ print ('Upd best model' )
104+ best_model = encoder
105+ best_loss = loss
106+ losses .append (loss )
107+
108+ print ("epoch : {}/{}, recon loss = {:.8f}" .format (epoch + 1 , epochs , loss ))
109+
110+ end = time .time () - start
111+ print (f'Runtime seconds: { end } ' )
112+ torch .save (encoder .state_dict (), f"models/{ sea_name } _{ pre_history_size } _{ forecast_size } _l1({ start_date } -{ end_date } ){ epochs } .pt" )
113+ plt .plot (np .arange (len (losses )), losses )
114+ plt .xlabel ('Epoch' )
115+ plt .ylabel ('Loss' )
116+ plt .title (f'Runtime={ end } ' )
117+ plt .savefig (f"models/{ sea_name } _{ pre_history_size } _{ forecast_size } _l1({ start_date } -{ end_date } ){ epochs } .png" )
118+ plt .show ()
0 commit comments