Recurrent Neural Networks: Pytorch
Recurrent Neural Networks: Pytorch
PyTorch:
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
class ComplexRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size, num_layers, bidirectional=False,
dropout=0.0):
super(ComplexRNN, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.bidirectional = bidirectional
self.rnn = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True,
bidirectional=bidirectional, dropout=dropout)
self.fc = nn.Linear(hidden_size * (2 if bidirectional else 1), output_size)
# Hyperparameters
input_size = 1 # number of features (in this case, it's just the number of passengers)
hidden_size = 64
output_size = 1
num_layers = 2
bidirectional = True
dropout = 0.2
learning_rate = 0.001
num_epochs = 100
# Training loop
losses = []
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
# Forward pass
outputs = model(x_train)
loss = criterion(outputs, y_train)
losses.append(loss.item())
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
TensorFlow:
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
from scipy.stats import pearsonr
# Step 1: Load and Preprocess Data
# Hyperparameters
input_size = 1 # number of features (in this case, it's just the number of passengers)
hidden_size = 64
output_size = 1
num_layers = 2
bidirectional = False
dropout = 0.2
learning_rate = 0.001
num_epochs = 100
l2_lambda = 0.001 # L2 regularization parameter
patience = 10 # Early stopping patience
losses = []
for epoch in range(num_epochs):
if early_stop:
print("Early stopping")
break
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.numpy():.4f}')
# Plot correlation
correlation, _ = pearsonr(y_train_orig.flatten(), predicted.flatten())
plt.figure(figsize=(10, 5))
plt.scatter(y_train_orig, predicted, label=f'Correlation: {correlation:.2f}')
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('Correlation between Actual and Predicted')
plt.legend()
plt.show()