Spaces:
Sleeping
Sleeping
File size: 6,126 Bytes
a83bace |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# 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! |