← Back to full index# Multimodal Product Price Prediction
A multimodal deep learning model that predicts product prices from text and images, developed for the Amazon ML Challenge 2025 and ranked 1565 among roughly 9,000 teams.
- Role: Team Lead · Machine Learning Engineer (team project)
- Date: Oct 2025
- Categories: project, hackathon
- Tech: Python, PyTorch, Scikit-learn, NumPy, Pandas, NLTK
- GitHub: https://github.com/AmulyaJain2004/Amazon-ML-Challenge-2025
## Overview
Product price depends on information spread across several modalities: the wording of a listing and the appearance of the item. This project, built for Amazon ML Challenge 2025, predicts price by learning jointly from product text and product images rather than from either alone.
## System Design
```mermaid
flowchart TD
CSV[("75k listings<br/>catalog text · image URL · price")] --> Text["Tokenise and clean<br/>12k vocabulary · 150 tokens"]
CSV --> DL["Image downloader"]
DL --> ResNet["Pretrained ResNet<br/>offline image embeddings"]
Text --> Emb["Embedding layer (256-d)"]
Emb --> LSTM["BiLSTM (128 per direction)"]
LSTM --> Attn["Attention pooling"]
ResNet --> Scale["RobustScaler<br/>embeddings + numeric features"]
Scale --> NumMLP["Dense branch (128)"]
Attn --> Fuse["Concatenate"]
NumMLP --> Fuse
Fuse --> Head["Dense 256 → 256 → 128 → 1<br/>with dropout"]
Head --> Out(["log price → price"])
```
- **Text branch:** catalog content is tokenised against a 12,000-word vocabulary and padded to 150 tokens, embedded, and encoded by a bidirectional LSTM. An attention layer pools the sequence so the model can focus on price-relevant words such as quantities and brand terms.
- **Image branch:** product images are downloaded once and passed through a pretrained ImageNet ResNet offline. The resulting embeddings are stored as features, so the expensive image model is not re-run on every training epoch.
- **Fusion:** image embeddings and numeric features are scaled with a RobustScaler and passed through a dense branch, then concatenated with the text representation and fed to a dense regression head.
## Training and Evaluation
Prices are heavily skewed, which destabilises naive regression. Training on **75,000** samples (with 15% held out for validation) was stabilised with robust feature scaling, log-transformed targets and a custom loss based on the symmetric mean absolute percentage error (SMAPE), the competition metric. The model trained for up to 50 epochs with weight decay, gradient accumulation, gradient clipping, mixed precision and early stopping.
## Results
The final model reached a SMAPE of **50.92**, ranking **1565** among roughly **9,000** teams.
## My Contribution
This was a group project, and I was the team lead. I worked with my teammates on model building and on improving the performance of the trained model, including training on A100 GPUs.
---
Back to the full index: /agent