import torch import torch.nn as nn import torch.optim as optim import numpy as np from sklearn.preprocessing import StandardScaler # 1. Generate Synthetic Non-Linear Data (Y = X^2 + 3) np.random.seed(42) X_raw = np.random.uniform(-5, 5, (500, 1)) y_raw = (X_raw ** 2) + 3 + np.random.normal(0, 0.5, (500, 1)) # Added noise # Scale features for better neural network convergence scaler = StandardScaler() X_scaled = scaler.fit_transform(X_raw) # Convert to PyTorch Tensors X_tensor = torch.tensor(X_scaled, dtype=torch.float32) y_tensor = torch.tensor(y_raw, dtype=torch.float32) # 2. Define an Advanced Architecture (Multi-Layer Perceptron) class DeepRegressionNet(nn.Module): def __init__(self): super(DeepRegressionNet, self).__init__() self.network = nn.Sequential( nn.Linear(1, 64), # Input layer to hidden layer 1 nn.ReLU(), # Non-linear activation nn.Linear(64, 32), # Hidden layer 1 to hidden layer 2 nn.ReLU(), # Non-linear activation nn.Linear(32, 1) # Output layer ) def forward(self, x): return self.network(x) model = DeepRegressionNet() # 3. Define Loss Function and Optimizer criterion = nn.MSELoss() # Mean Squared Error optimizer = optim.Adam(model.parameters(), lr=0.01) # Advanced gradient descent # 4. Training Loop epochs = 200 for epoch in range(epochs): model.train() # Forward pass: Compute predicted y by passing x to the model predictions = model(X_tensor) loss = criterion(predictions, y_tensor) # Backward pass and optimization optimizer.zero_grad() # Clear gradients from previous step loss.backward() # Backpropagation (compute gradients) optimizer.step() # Update weights if (epoch + 1) % 40 == 0: print(f"Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}") # 5. Inference (Predicting a new value) model.eval() with torch.no_grad(): new_input = np.array([[4.0]]) # We expect roughly 4^2 + 3 = 19 new_input_scaled = scaler.transform(new_input) new_input_tensor = torch.tensor(new_input_scaled, dtype=torch.float32) prediction = model(new_input_tensor) print(f"\nPrediction for X=4: {prediction.item():.4f} (Expected close to 19.0)")