Skip to content

CS229 Final Project Fall 2025 (Vincent Yip, Kyle Roh)

Notifications You must be signed in to change notification settings

vincent65/flowing-to-learn

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Learning to Flow by Flowing to Learn

CS229 Final Project - Fall 2025

A flow matching approach for learning attribute-aware representations in CLIP embedding space. The model learns a conditional vector field that transforms embeddings on a hypersphere to improve facial attribute classification.

FCLF learns a neural vector field v(z, y) that flows CLIP embeddings conditioned on facial attributes:

z_{t+1} = normalize(z_t + α · v_tan(z_t, y))

Key components:

  • Spherical geometry: Embeddings constrained to unit hypersphere
  • Conditional flow: Vector field conditioned on 5 binary attributes
  • Contrastive learning: Supervised contrastive loss for attribute clustering
  • Regularization: Curl and divergence penalties for smooth flows

Installation

pip install -r requirements.txt

Project Structure

├── fclf_model.py              # Core model (ConditionalVectorField)
├── celeba_embeddings.py       # Data loading utilities
├── configs/
│   └── fclf_config.yaml       # Training configuration
├── scripts/
│   ├── train_fclf.py          # Training script
│   ├── eval_fclf_metrics.py   # Comprehensive evaluation metrics
│   ├── eval_fclf_flows.py     # Flow-specific evaluation
│   ├── baseline_evals.py      # Baseline comparisons (raw CLIP, global direction)
│   ├── hp_search.py           # Hyperparameter search & ablations
│   ├── extended_analysis.py   # Extended analysis (cluster quality, etc.)
│   ├── describe_datasets.py   # Dataset statistics and visualization
│   ├── visualize_flows.py     # Flow trajectory visualization
│   ├── viz_utils.py           # Plotting utilities
│   └── precompute_embeddings.py  # CLIP embedding extraction
├── notebooks/
│   └── cs229.ipynb            # Experimental analysis notebook
└── data/                      # CelebA dataset (not included)

Usage

1. Precompute CLIP Embeddings

python scripts/precompute_embeddings.py --celeba_root data/celeba --output_dir data/embeddings

2. Train Model

python scripts/train_fclf.py --config configs/fclf_config.yaml --output_dir checkpoints/run1

3. Run Ablation Study

# Full 30-config ablation study
python scripts/hp_search.py --ablation

# View results
python scripts/hp_search.py --summarize

# Run full evaluation on best model
python scripts/hp_search.py --eval-best

4. Evaluate Model

python scripts/eval_fclf_metrics.py --checkpoint_path checkpoints/run1/fclf_last.pt

5. Extended Analysis

python scripts/extended_analysis.py --results_dir eval/param_search

Model Architecture

ConditionalVectorField: v(z, y) : R^512 × R^5 → R^512

Attribute MLP:    5 → 256 (GELU)
Main MLP:         768 → 256 → 256 → 512 (GELU)
Output:           tanh(·) × scale

Configuration

Key hyperparameters in configs/fclf_config.yaml:

Parameter Default Description
embedding_dim 512 CLIP embedding dimension
hidden_dim 256 MLP hidden size
num_epochs 50 Training epochs
batch_size 512 Batch size
learning_rate 1e-4 Adam learning rate
alpha 0.1 Flow step size
temperature 0.1 Contrastive temperature (0.5 is optimal)
lambda_contrastive 0.7 Contrastive loss weight
lambda_identity 0.3 Identity loss weight
num_flow_steps 10 Inference flow steps

Attributes

The model is trained on 5 CelebA attributes:

  • Smiling
  • Young
  • Male
  • Eyeglasses
  • Mustache

License

MIT License

About

CS229 Final Project Fall 2025 (Vincent Yip, Kyle Roh)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published