File size: 2,424 Bytes
2429091 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import sys
from pathlib import Path
# 获取项目根目录(train.py上级的上级)
root_path = Path(__file__).parent.parent
sys.path.append(str(root_path))
import glob
import os
import h5py
import numpy as np
import torch
from tqdm import tqdm
from onescience.datapipes.climate import CMEMSDatapipe
from model.xihe import Xihe
from onescience.utils.YParams import YParams
def get_stats(data_dir, stats_dir, channels):
h5_files = sorted(glob.glob(os.path.join(data_dir, "data", "*.h5")))
with h5py.File(h5_files[0], "r") as f:
ds = f["fields"]
all_variables = [v.decode() if isinstance(v, bytes) else v for v in ds.attrs["variables"]]
channel_indices = [all_variables.index(v) for v in channels]
mu = np.load(os.path.join(stats_dir, "global_means.npy"))
std = np.load(os.path.join(stats_dir, "global_stds.npy"))
means = mu[:, channel_indices, :, :]
stds = std[:, channel_indices, :, :]
return means, stds
if __name__ == "__main__":
current_path = os.getcwd()
sys.path.append(current_path)
config_file_path = os.path.join(current_path, "conf/config.yaml")
cfg = YParams(config_file_path, "model")
cfg_data = YParams(config_file_path, "datapipe")
means, stds = get_stats(
cfg_data.dataset.data_dir,
cfg_data.dataset.stats_dir,
cfg_data.dataset.channels,
)
datapipe = CMEMSDatapipe(
dataset_dir=cfg_data.dataset.data_dir,
used_variables=cfg_data.dataset.channels,
used_years=cfg_data.dataset.test_time,
distributed=False,
batch_size=1,
num_workers=cfg_data.dataloader.num_workers,
)
test_dataloader, _ = datapipe.get_dataloader("test")
ckpt = torch.load(f"{cfg.checkpoint_dir}/model_bak.pth", map_location="cuda:0")
model = Xihe(cfg).to("cuda:0")
model.load_state_dict(ckpt["model_state_dict"])
model.eval()
os.makedirs("result/output/", exist_ok=True)
print("📂 samples will be generated to './result/output/'")
with torch.no_grad():
for data in tqdm(test_dataloader, desc="Inferring testset", unit="batch"):
invar = data[0].to("cuda:0", dtype=torch.float32)
filename = data[4][-1][0]
outvar_pred = model(invar)
pred_var = outvar_pred.cpu().numpy()
pred_var = pred_var * stds + means
np.save(f"result/output/{filename}.npy", pred_var)
|