Download train_simvp2.py from Staty/LARRES: direct link, hf CLI and curl.
- Browser
- Download file 3.19 kB
-
https://huggingface.co/Staty/LARRES/resolve/main/train_simvp2.py
- Command line
-
hf download hf://Staty/LARRES/train_simvp2.py
-
curl -L -o train_simvp2.py https://huggingface.co/Staty/LARRES/resolve/main/train_simvp2.py
3.19 kB
| import os | |
| import torch | |
| import torch.nn.functional as F | |
| from torch import nn, Tensor | |
| import numpy as np | |
| import h5py | |
| from torch.utils.data import DataLoader, Dataset | |
| from torch.utils.data import Subset | |
| from sklearn.model_selection import train_test_split | |
| import torch.optim as optim | |
| from model_convlstm import ionexDataset, train_npy, nstepsin, nstepsout, stride, EncoderDecoderConvLSTM, max_epochs | |
| from model_LARRES import larres | |
| # ionexData = ionexDataset(train_npy, nstepsin=nstepsin, nstepsout=nstepsout, stride=stride) | |
| # train_data, val_data = ionexData.split_train_val(val_split=0.2) | |
| # | |
| # train_loader = DataLoader(train_data, batch_size=16, num_workers=0) | |
| # val_loader = DataLoader(val_data, batch_size=16, num_workers=0) | |
| ionexData = ionexDataset(train_npy, nstepsin=nstepsin, nstepsout=nstepsout, stride=stride) | |
| train_data, val_data = ionexData.split_train_val(val_split=0.2) | |
| train_loader = DataLoader(train_data, batch_size=16, num_workers=0) | |
| val_loader = DataLoader(val_data, batch_size=16, num_workers=0) | |
| for X, y in train_loader: | |
| print(f"Shape of X: {X.shape} {X.dtype} [N, C, H, W]") | |
| print(f"Shape of Y: {y.shape} {y.dtype}") | |
| break | |
| print(f"Training samples: {len(train_loader.dataset)}") | |
| # print(f"Validation samples: {len(val_loader.dataset)}") | |
| device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
| model=larres().to(device) | |
| # model.load_state_dict(torch.load("best_model.pth")) | |
| optimizer = optim.Adam(model.parameters(), lr=0.0001) | |
| criterion = nn.L1Loss() | |
| # 训练和验证 | |
| best_val_loss = float('inf') | |
| # num_epochs = 50 | |
| for epoch in range(max_epochs): | |
| # 训练阶段 | |
| model.train() | |
| all_loss = 0 | |
| for batch_idx, (data, target) in enumerate(train_loader): | |
| data, target = data.to(device), target.to(device) # 将数据和目标迁移到 CUDA | |
| optimizer.zero_grad() | |
| output = model(data) | |
| target_last = target - data[:, 24:36, :, :, :] | |
| # loss = criterion(output, target_last) # 使用 L1 损失 | |
| loss = criterion(output[:,:12,:,:71,:], target_last[:,:12,:,:71,:]) # 使用 L1 损失 | |
| print(loss) | |
| all_loss+=loss | |
| loss.backward() | |
| optimizer.step() | |
| print(f'Epoch {epoch + 1}/{max_epochs}, Train Loss: {all_loss.item():.4f}') | |
| # 验证阶段 | |
| model.eval() | |
| val_loss = 0.0 | |
| with torch.no_grad(): | |
| for data, target in val_loader: | |
| data, target = data.to(device), target.to(device) # 将数据和目标迁移到 CUDA | |
| output = model(data) | |
| target_last = target - data[:, 24:36, :, :, :] | |
| # loss = criterion(output, target_last) # 使用 L1 损失 | |
| loss = criterion(output[:, :12, :, :71, :], target_last[:, :12, :, :71, :]) # 使用 L1 损失 | |
| val_loss += loss.item() | |
| val_loss /= len(val_loader) | |
| print(f'Epoch {epoch + 1}/{max_epochs}, Val Loss: {val_loss:.4f}') | |
| # 保存最佳模型 | |
| if val_loss < best_val_loss: | |
| best_val_loss = val_loss | |
| torch.save(model.state_dict(), 'best_model.pth') | |
| print('Best model saved!') | |
| print('Training completed.') |