Spaces:
No application file
No application file
| # lab5_functions.py | |
| """ | |
| Минимальный LSTM example для ЛР №5 (PyTorch). | |
| Если у вас нет torch — функции выбросят понятную ошибку. | |
| """ | |
| import numpy as np | |
| import pandas as pd | |
| try: | |
| import torch | |
| import torch.nn as nn | |
| TORCH_AVAILABLE = True | |
| except Exception: | |
| TORCH_AVAILABLE = False | |
| if TORCH_AVAILABLE: | |
| class SimpleLSTM(nn.Module): | |
| def __init__(self, input_size, hidden_size=64, num_layers=1, out_size=1): | |
| super().__init__() | |
| self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) | |
| self.fc = nn.Linear(hidden_size, out_size) | |
| def forward(self, x): | |
| out, _ = self.lstm(x) | |
| return self.fc(out[:, -1, :]) | |
| def create_sequences(series, lookback=30, horizon=1): | |
| X, y = [], [] | |
| for i in range(len(series) - lookback - horizon + 1): | |
| X.append(series[i:i+lookback]) | |
| y.append(series[i+lookback:i+lookback+horizon]) | |
| return np.array(X), np.array(y) | |
| def train_lstm(series, lookback=30, epochs=20, lr=1e-3): | |
| X, y = create_sequences(series, lookback=lookback, horizon=1) | |
| X = torch.from_numpy(X).float().unsqueeze(-1) # (N, L, 1) | |
| y = torch.from_numpy(y).float().squeeze(-1) | |
| model = SimpleLSTM(input_size=1) | |
| opt = torch.optim.Adam(model.parameters(), lr=lr) | |
| loss_fn = nn.MSELoss() | |
| model.train() | |
| for ep in range(epochs): | |
| pred = model(X) | |
| loss = loss_fn(pred.squeeze(), y) | |
| opt.zero_grad(); loss.backward(); opt.step() | |
| return model | |
| else: | |
| def train_lstm(*args, **kwargs): | |
| raise ImportError("PyTorch не установлен. Установите torch, чтобы использовать LSTM.") | |