Suchith-nj
image classifier
a83bace
# Install required packages
!pip install -q datasets transformers accelerate evaluate pillow
# Complete Food-101 Training - Single Cell
# 1. Setup
from google.colab import userdata
import os
import torch
from datasets import load_dataset
from transformers import (
AutoImageProcessor,
AutoModelForImageClassification,
TrainingArguments,
Trainer
)
import evaluate
import numpy as np
# Setup HF token
hf_token = userdata.get('HF_TOKEN')
os.environ['HF_TOKEN'] = hf_token
# Check GPU
print(f"GPU Available: {torch.cuda.is_available()}")
print(f"GPU Name: {torch.cuda.get_device_name(0)}\n")
# 2. Load Dataset
print("Loading Food-101 dataset...")
dataset = load_dataset("food101")
print(f"Train samples: {len(dataset['train']):,}")
print(f"Test samples: {len(dataset['validation']):,}\n")
# Get class names
class_names = dataset['train'].features['label'].names
print(f"Number of classes: {len(class_names)}\n")
# 3. Setup Preprocessing
model_name = "microsoft/resnet-50"
processor = AutoImageProcessor.from_pretrained(model_name)
def preprocess_dataset(example):
image = example['image'].convert("RGB")
inputs = processor(image, return_tensors="pt")
return {
'pixel_values': inputs['pixel_values'].squeeze(0),
'labels': example['label']
}
# 4. Split and Preprocess Data
print("Splitting dataset...")
train_val = dataset['train'].train_test_split(test_size=0.1, seed=42)
print("Preprocessing train dataset (this takes 5-10 minutes)...")
train_dataset = train_val['train'].map(
preprocess_dataset,
remove_columns=['image', 'label'],
batched=False
)
print("Preprocessing validation dataset...")
val_dataset = train_val['test'].map(
preprocess_dataset,
remove_columns=['image', 'label'],
batched=False
)
print("Preprocessing test dataset...")
test_dataset = dataset['validation'].map(
preprocess_dataset,
remove_columns=['image', 'label'],
batched=False
)
# Set format
train_dataset.set_format(type='torch', columns=['pixel_values', 'labels'])
val_dataset.set_format(type='torch', columns=['pixel_values', 'labels'])
test_dataset.set_format(type='torch', columns=['pixel_values', 'labels'])
print(f"\nTrain: {len(train_dataset):,}")
print(f"Validation: {len(val_dataset):,}")
print(f"Test: {len(test_dataset):,}\n")
# 5. Load Model
print("Loading model...")
id2label = {i: label for i, label in enumerate(class_names)}
label2id = {label: i for i, label in enumerate(class_names)}
model = AutoModelForImageClassification.from_pretrained(
model_name,
num_labels=len(class_names),
id2label=id2label,
label2id=label2id,
ignore_mismatched_sizes=True
)
print(f"Model loaded: {model_name}")
print(f"Total parameters: {sum(p.numel() for p in model.parameters()):,}\n")
# 6. Setup Metrics
accuracy_metric = evaluate.load("accuracy")
f1_metric = evaluate.load("f1")
def compute_metrics(eval_pred):
predictions, labels = eval_pred
predictions = np.argmax(predictions, axis=1)
accuracy = accuracy_metric.compute(predictions=predictions, references=labels)
f1 = f1_metric.compute(predictions=predictions, references=labels, average='weighted')
return {
'accuracy': accuracy['accuracy'],
'f1': f1['f1']
}
# 7. Training Arguments
training_args = TrainingArguments(
output_dir="./food101-resnet50",
num_train_epochs=5,
per_device_train_batch_size=64,
per_device_eval_batch_size=64,
learning_rate=2e-5,
weight_decay=0.01,
warmup_steps=500,
logging_steps=100,
eval_strategy="epoch",
save_strategy="epoch",
save_total_limit=2,
load_best_model_at_end=True,
metric_for_best_model="accuracy",
greater_is_better=True,
fp16=True,
dataloader_num_workers=0,
push_to_hub=True,
hub_model_id="suchithnj12/food101-resnet50",
hub_strategy="end",
report_to="none"
)
# 8. Create Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
compute_metrics=compute_metrics
)
# 9. Train
print("Starting training (this takes 2-3 hours)...")
print("-" * 60)
train_result = trainer.train()
print("\nTraining completed!")
print(f"Final train loss: {train_result.metrics['train_loss']:.4f}")
print(f"Training time: {train_result.metrics['train_runtime']/60:.2f} minutes\n")
# 10. Evaluate on Test Set
print("Evaluating on test set...")
test_results = trainer.evaluate(test_dataset)
print("\nTest Results:")
print(f"Accuracy: {test_results['eval_accuracy']:.4f}")
print(f"F1 Score: {test_results['eval_f1']:.4f}\n")
# 11. Push to Hub
print("Pushing model to HuggingFace Hub...")
trainer.push_to_hub(commit_message="Food-101 ResNet-50 trained model")
print(f"\nModel available at: https://huggingface.co/suchithnj12/food101-resnet50")
print("Training pipeline completed successfully!")
ing builder script: 
 4.20k/? [00:00<00:00, 416kB/s]
Downloading builder script: 
 6.79k/? [00:00<00:00, 645kB/s]
Starting training (this takes 2-3 hours)...
------------------------------------------------------------
[5330/5330 1:56:41, Epoch 5/5]
Epoch Training Loss Validation Loss Accuracy F1
1 4.496600 4.458635 0.166337 0.154736
2 3.814000 3.742320 0.298614 0.261986
3 3.257200 3.191649 0.362508 0.330396
4 2.935900 2.900200 0.397096 0.368665
5 2.847600 2.818526 0.408317 0.380199
Training completed!
Final train loss: 3.6109
Training time: 116.77 minutes
Evaluating on test set...
[395/395 05:23]
Test Results:
Accuracy: 0.4450
F1 Score: 0.4139
Pushing model to HuggingFace Hub...
Processing Files (2 / 2)      : 100%
 95.1MB / 95.1MB, 9.91MB/s  
New Data Upload               : 100%
 95.1MB / 95.1MB, 9.91MB/s  
  ...esnet50/model.safetensors: 100%
 95.1MB / 95.1MB            
  ...esnet50/training_args.bin: 100%
 5.84kB / 5.84kB            
Model available at: https://huggingface.co/suchithnj12/food101-resnet50
Training pipeline completed successfully!