| --- |
| language: en |
| license: mit |
| tags: |
| - pytorch |
| - regression |
| - dot-product |
| - bilinear-networks |
| metrics: |
| - loss |
| pipeline_tag: tabular-regression |
|
|
| --- |
| |
| # SBL-NET (Scalar Bilinear Linear Network) |
|
|
| A hybrid PyTorch neural network designed to **highly accurately compute the scalar (dot) product** of split sub-vectors without any data normalization (Z-score, etc.). |
|
|
| ## 🔬 Architecture & Features |
|
|
| The main highlight of this model is the integration of a rare **bilinear layer (`nn.Bilinear`)** at the input stage, combined with classic fully connected layers (`nn.Linear`) and the `SELU` activation function. |
| * The network accepts an input tensor of shape `[batch, 4]` and splits it into two vectors: `A [batch, 2]` and `B [batch, 2]`. |
| * The bilinear layer efficiently extracts cross-features between the vectors, allowing the model to reduce the error to an impressive **0.185%**. |
|
|
| ## 📊 Training Results |
|
|
| * **Loss Function:** Smooth L1 Loss |
| * **Optimizer:** Adam (with StepLR scheduler) |
| * **Error Rate:** ~0.185% |
| * **Extreme Test Case:** |
| * Input: `[[-6.0, 70.0, 4.0, -196.0]]` |
| * Expected Mathematical Answer: `-13744.0000` |
| * Actual Network Prediction: `-13769.5225` |
|
|
| ## 🧮 Model Statistics |
|
|
| * **Total Parameters:** 52,101 |
| * **Trainable Parameters:** 52,101 |
| * **Non-trainable Parameters:** 0 |
| * **Model Size:** ~208 KB (Weights in FP32) |
| * **Input Shape:** `[batch_size, 4]` |
| * **Output Shape:** `[batch_size, 1]` |
|
|
| ## 💻 How to Use |
|
|
| You can download the architecture file and the model weights directly from this repository: |
|
|
| ```python |
| import torch as t |
| import torch.nn as nn |
| import torch.optim as opt |
| from torch.utils.data import DataLoader, Dataset |
| |
| class WebAISC(nn.Module): |
| |
| def __init__(self): |
| super().__init__() |
| self.bilinear = nn.Bilinear(in1_features=2, in2_features=2, out_features=250) |
| |
| self.x2 = nn.Linear(250, 100) |
| self.x3 = nn.Linear(100, 250) |
| self.x4 = nn.Linear(250, 1) |
| self.selu = nn.SELU() |
| |
| def forward(self, x): |
| a = x[:, 0:2] |
| b = x[:, 2:4] |
| |
| x = self.selu(self.bilinear(a, b)) |
| |
| x = self.selu(self.x2(x)) |
| x = self.selu(self.x3(x)) |
| x = self.x4(x) |
| return x |
| |
| model = WebAISC() |
| |
| test_input = t.tensor([[-6.0, 70.0, 4.0, -196.0]], dtype=t.float32) |
| with t.no_grad(): |
| prediction = model(test_input) |
| print(f"Model prediction: {prediction.item():.4f}") |
| ``` |
|
|