| # 🏠 Mô hình Wide & Deep Neural Network - Dự đoán Giá Nhà California | |
| ## 📝 Mô tả | |
| Đây là một mô hình **Wide & Deep Neural Network** được huấn luyện trên tập dữ liệu **California Housing** để dự đoán giá nhà trung bình (`MedHouseVal`). Mô hình được xây dựng bằng **PyTorch**, dựa trên kiến trúc trong cuốn *Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow* của **Aurélien Géron**. | |
| ## 📌 Nhiệm vụ | |
| Dự đoán giá nhà dựa trên dữ liệu bảng (tabular regression) với 8 đặc trưng đầu vào. | |
| ## 📥 Đầu vào | |
| - **Số chiều**: `[batch_size, 8]` | |
| - **Kiểu dữ liệu**: `torch.FloatTensor` | |
| - **Các đặc trưng đầu vào**: | |
| - `'MedInc'` – Thu nhập trung vị | |
| - `'HouseAge'` – Tuổi trung bình của căn nhà | |
| - `'AveRooms'` – Số phòng trung bình | |
| - `'AveBedrms'` – Số phòng ngủ trung bình | |
| - `'Population'` – Dân số | |
| - `'AveOccup'` – Số người trung bình trên mỗi hộ | |
| - `'Latitude'` – Vĩ độ | |
| - `'Longitude'` – Kinh độ | |
| ## 📤 Đầu ra | |
| - **Kiểu**: `torch.FloatTensor` có shape `[batch_size, 1]` | |
| - **Ý nghĩa**: Giá nhà trung bình dự đoán (giá trị thực). | |
| ## 🧪 Cách sử dụng mô hình | |
| Dưới đây là ví dụ về cách sử dụng mô hình với dữ liệu đầu vào giả lập: | |
| ```python | |
| import torch | |
| import torch.nn as nn | |
| from huggingface_hub import PyTorchModelHubMixin | |
| # Tạo dữ liệu đầu vào giả lập (batch 1, 8 features) | |
| x_input = torch.randn(1, 8) | |
| print("Mock input:") | |
| print(x_input) | |
| # Định nghĩa mô hình Wide & Deep Neural Network | |
| class WideAndDeepNet(nn.Module, PyTorchModelHubMixin): | |
| def __init__(self): | |
| super().__init__() | |
| self.hidden1 = nn.Linear(6, 30) | |
| self.hidden2 = nn.Linear(30, 30) | |
| self.main_head = nn.Linear(35, 1) | |
| self.aux_head = nn.Linear(30, 1) | |
| self.main_loss_fn = nn.MSELoss(reduction='sum') | |
| self.aux_loss_fn = nn.MSELoss(reduction='sum') | |
| def forward(self, input_wide, input_deep, label=None): | |
| act = torch.relu(self.hidden1(input_deep)) | |
| act = torch.relu(self.hidden2(act)) | |
| concat = torch.cat([input_wide, act], dim=1) | |
| main_output = self.main_head(concat) | |
| aux_output = self.aux_head(act) | |
| if label is not None: | |
| main_loss = self.main_loss_fn(main_output.squeeze(), label) | |
| aux_loss = self.aux_loss_fn(aux_output.squeeze(), label) | |
| return WideAndDeepNetOutput(main_output=main_output, aux_output=aux_output) | |
| # Tải mô hình từ Hugging Face Hub | |
| model = WideAndDeepNet.from_pretrained("sadhaklal/wide-and-deep-net-california-housing-v3") | |
| model.eval() | |
| # Dự đoán với mô hình | |
| with torch.no_grad(): | |
| prediction = model(x_input) | |
| print(f"Giá nhà dự đoán (mock input): {prediction.item():.3f}") | |
| ``` |