Skip to content
karim.semaan(open to work)
WorkExperienceAboutSkillsContactResume ↓
← All work
Deep CNN Image Classifier preview
ML / Data ScienceCompleted2026

Deep CNN Image Classifier

SE-ResNet · 16-class image classifier

Ranked 1st in the graduate cohort: the instructor's PA2 results announcement reported the best submitted model at 78% test accuracy, more than 20 points above the 57% base, and that was this one. A from-scratch pre-activation SE-ResNet with a modern training recipe (Mixup/CutMix, SE attention, stochastic depth, cosine LR), tuned across nine GPU-cluster experiments; 77.66% best validation accuracy.

16-class CNN · softmax explorerSynthetic preview · toy verdicts

Generated geometric tiles in the 32x32 spirit of the dataset. Click one for a deterministic toy verdict (seeded, same every time).

Pick a tile to see how a 16-way softmax verdict reads: top classes ranked with confidence bars.

Synthetic preview. No real data: the tiles are generated patterns and the verdicts are seeded toy numbers, not output of the coursework model (a from-scratch SE-ResNet, private, trained on a GPU cluster).

Real training runbest 77.66% · epoch 186 of 200

Course baseline 56.38% · best val 77.66% · graded 300-epoch run 77.12% at epoch 260. Real numbers, extracted verbatim from the HW2 training log and submission notes; not produced by the toy tiles above. The coursework repo is private.

Synthetic tiles and seeded toy verdicts, not the private coursework model. The training-run panel is real: extracted verbatim from the HW2 notebook log and submission notes.

Graduate Deep Learning coursework: both networks are written from scratch in PyTorch. The baseline is a plain conv/batch-norm/ReLU/pool stack built from a layer spec; the improved model is a wide pre-activation SE-ResNet (96/192/384 filters, 4 residual blocks per stage, Squeeze-and-Excitation channel attention) with linearly scheduled stochastic depth. The training recipe stacks batch-level augmentation (random flip, pad-4 crop, random erase), Mixup and CutMix, label smoothing at 0.05, gradient clipping at 5.0, cosine-annealed LR from 0.1 to 1e-6 with a 10-epoch warmup (300 epochs in the graded run; the 77.66% best Colab run used a 200-epoch budget), Nesterov SGD, best-checkpoint restoration, and test-time augmentation in the submission pipeline. Trained on 32,000 32×32 RGB images (6,400 validation, 9,600 test, 16 classes) through a Kaggle-style submission flow, with nine named experiments (exp_a..exp_i) sweeping width, depth, seeds, SWA, SAM, TTA and epoch budgets as SLURM batch jobs on a university GPU cluster. Net result: 56.38% baseline to 77.66% best validation accuracy.

  • PyTorch
  • Python
  • CNN / SE-ResNet
  • Matplotlib
  • SLURM
  • Kaggle
Cohort rank
1st of the class
Test accuracy · cohort best
78%
Baseline → improved
56.38% → 77.66%
Best val accuracy
77.66% (16 classes)

Where the numbers come from

  • ›1st in the cohort / 78% test: the course instructor's PA2 results…

    1st in the cohort / 78% test: the course instructor's PA2 results announcement reported the cohort's best submitted model at 78% test accuracy, more than 20 points above the 57% base model; this was Karim's submission (ranked 1st). The class grade distribution was mean 85.7 / median 90. The model's own validation log shows 77.66% best validation accuracy, consistent with the reported 78% test.

  • ›Two real runs of the same recipe: the best Colab run logged…

    Two real runs of the same recipe: the best Colab run logged 77.66% best validation accuracy on a 200-epoch budget, while the graded submission ran the saved 300-epoch config and finished at 77.12% (best checkpoint at epoch 260).

CS7150 HW2 image-categorization test leaderboard, final standings, ranked first with score 0.77989.
1st place. Final standings of the CS7150 HW2 image-categorization test competition, an in-class private Kaggle competition at Northeastern (NEU). Test score 0.77989 (~78%), matching the instructor's reported cohort best. The handle IU07 is Karim's anonymized course identity; the next figure ties it to his own submission log.
Kaggle My Submissions view from Karim's own account showing kaggle_improved_test_submission.csv at private and public score 0.77989.
The identity link. The same 0.77989 appears in Karim's own logged-in Kaggle submissions (kaggle_improved_test_submission.csv, private and public score 0.77989). The first-place leaderboard row and this submission are the same number, so the anonymized handle is his.

What I'd improve

The headline 77.66% is a best run, not a mean: the graded 300-epoch submission of the same recipe finished at 77.12% (the best run used a 200-epoch budget), and several of the nine experiments changed multiple variables at once (exp_d adds SAM while deepening to 6/6/6 blocks; exp_h widens, adds SAM and fixes SWA together), so attributing each point of accuracy to a specific trick is fuzzy. The next pass is a one-variable-at-a-time ablation grid with seed-averaged runs, so every component earns its place in the recipe. A fine-tuned pretrained backbone would be the pragmatic ceiling test, but the point of the coursework was building and training the network from scratch.

Request access
Want something like this? Get in touch →

Measured:30/30 chatbot evals·20-case Bastion eval·Serving·Calibration Lab

© 2026 Karim SemaanBuilt with Next.js, Tailwind & Supabase.LinkedIn ↗︎GitHub ↗︎