File size: 2,400 Bytes
0b0933a |
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 |
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import json
import torch
import numpy as np
import pandas as pd
import argparse
from models.forecasting.lstm import LSTMForecaster
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
def load_model(model_path="pipeline/trained_models/lstm_forecaster.pt", config_path="pipeline/trained_models/config.json"):
if not os.path.exists(config_path):
raise FileNotFoundError(f"β Missing config file: {config_path}")
if not os.path.exists(model_path):
raise FileNotFoundError(f"β Missing model file: {model_path}")
with open(config_path, "r") as f:
config = json.load(f)
model = LSTMForecaster(
input_size=config["input_size"],
hidden_size=config["hidden_size"],
num_layers=config["num_layers"],
output_size=config["output_size"]
).to(device)
model.load_state_dict(torch.load(model_path, map_location=device))
model.eval()
return model
def predict_batch(input_data, model=None):
"""
input_data: numpy array of shape [batch_size, seq_len, input_size]
returns: list of predictions
"""
if model is None:
model = load_model()
if isinstance(input_data, list):
input_data = np.array(input_data)
input_tensor = torch.tensor(input_data, dtype=torch.float32).to(device)
with torch.no_grad():
outputs = model(input_tensor)
return outputs.cpu().numpy().flatten().tolist()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Batch Inference for LSTM Forecasting")
parser.add_argument("--input", type=str, required=True, help="Path to .npy or .csv input file")
args = parser.parse_args()
if args.input.endswith(".npy"):
input_data = np.load(args.input)
elif args.input.endswith(".csv"):
df = pd.read_csv(args.input).dropna().select_dtypes(include=[np.number])
data = df.values
if len(data.shape) == 2:
input_data = np.expand_dims(data, axis=0)
else:
input_data = data
else:
raise ValueError("Input must be a .npy or .csv file")
model = load_model()
predictions = predict_batch(input_data, model)
print("π Predictions:", predictions)
|