timm documentation
Hızlı Başlangıç
Hızlı Başlangıç
Bu hızlı başlangıç, kodun içine dalmaya hazır ve timm'i model eğitim iş akışlarına nasıl entegre edeceklerine dair bir örnek görmek isteyen geliştiriciler içindir.
Öncelikle timm paketini yüklemeniz gerekir. Kurulum hakkında daha fazla bilgi için Kurulum bölümüne bakın.
pip install timm
Önceden Eğitilmiş Bir Model Yükleyin
Önceden eğitilmiş modeller create_model() kullanılarak yüklenebilir.
Burada, önceden eğitilmiş mobilenetv3_large_100 modelini yüklüyoruz.
>>> import timm
>>> m = timm.create_model('mobilenetv3_large_100', pretrained=True)
>>> m.eval()Note: The returned PyTorch model is set to train mode by default, so you must call .eval() on it if you plan to use it for inference.
Önceden Eğitilmiş Ağırlıklara Sahip Modelleri Listele
timm ile paketlenmiş modelleri listelemek için list_models() işlevini kullanabilirsiniz. pretrained=True belirtirseniz, bu işlev yalnızca ilişkili önceden eğitilmiş ağırlıkları bulunan model adlarını döndürür.
>>> import timm
>>> from pprint import pprint
>>> model_names = timm.list_models(pretrained=True)
>>> pprint(model_names)
[
'adv_inception_v3',
'cspdarknet53',
'cspresnext50',
'densenet121',
'densenet161',
'densenet169',
'densenet201',
'densenetblur121d',
'dla34',
'dla46_c',
]Ayrıca, adlarında belirli bir desen içeren modelleri de listeleyebilirsiniz.
>>> import timm
>>> from pprint import pprint
>>> model_names = timm.list_models('*resne*t*')
>>> pprint(model_names)
[
'cspresnet50',
'cspresnet50d',
'cspresnet50w',
'cspresnext50',
...
]Önceden Eğitilmiş Bir Modeli İnce Ayarlayın
Herhangi bir önceden eğitilmiş modeli, yalnızca sınıflandırıcıyı (son katmanı) değiştirerek ince ayarlayabilirsiniz.
>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True, num_classes=NUM_FINETUNE_CLASSES)Kendi veri setinizde ince ayar yapmak için bir PyTorch eğitim döngüsü yazmanız veya timm'in eğitim betiğini veri setinizi kullanacak şekilde uyarlamanız gerekir.
Farklı giriş kanalları için in_chans değerini modelin hedef kanal sayısına ayarlayın;
önceden eğitilmiş yapılandırma, kaynak ağırlıkları açıklamalıdır. Kanal dönüşümü ve uyarlanmış
modellerin mevcut yapılandırmalarıyla kaydedilmesi için Modelleri Uyarlayın ve Dışa Aktarın bölümüne bakın.
Özellik Çıkarımı İçin Ön Eğitilmiş Bir Model Kullanın
Ağı değiştirmeden, normalde kullanılan model(input) yerine herhangi bir modelde model.forward_features(input) çağrılabilir. Bu, ağlar için sınıflandırıcı başlığını ve küresel havuzlamayı atlar.
Özellik çıkarımı için timm kullanımı hakkında daha ayrıntılı bir kılavuz için Özellik Çıkarımı bölümüne bakın.
>>> import timm
>>> import torch
>>> x = torch.randn(1, 3, 224, 224)
>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True)
>>> features = model.forward_features(x)
>>> print(features.shape)
torch.Size([1, 960, 7, 7])Görüntü Artırma
Görselleri bir model için geçerli girdilere dönüştürmek için, modelin beklediği input_size değerini sağlayarak timm.data.create_transform() işlevini kullanabilirsiniz.
Bu, makul varsayılanları kullanan genel bir dönüştürme (transform) döndürür.
>>> timm.data.create_transform((3, 224, 224))
Compose(
Resize(size=256, interpolation=bilinear, max_size=None, antialias=True)
CenterCrop(size=(224, 224))
MaybeToTensor()
Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)Önceden eğitilmiş modeller, eğitim sırasında modellere verilen görüntülere uygulanan belirli dönüşümlere sahiptir. Görüntünüzde yanlış dönüşümü kullanırsanız, model ne gördüğünü anlamaz!
Belirli bir önceden eğitilmiş model için hangi dönüşümlerin kullanıldığını anlamak için, pretrained_cfg değerine bakarak başlayabiliriz.
>>> model.pretrained_cfg
{'url': 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_large_100_ra-f55367f5.pth',
'hf_hub_id': 'timm/mobilenetv3_large_100.ra_in1k',
'architecture': 'mobilenetv3_large_100',
'tag': 'ra_in1k',
'custom_load': False,
'input_size': (3, 224, 224),
'fixed_input_size': False,
'interpolation': 'bicubic',
'crop_pct': 0.875,
'crop_mode': 'center',
'mean': (0.485, 0.456, 0.406),
'std': (0.229, 0.224, 0.225),
'num_classes': 1000,
'pool_size': (7, 7),
'first_conv': 'conv_stem',
'classifier': 'classifier',
'license': 'apache-2.0'}Ardından, yalnızca veriyle ilgili yapılandırmayı timm.data.resolve_model_data_config() kullanarak çözebiliriz.
>>> timm.data.resolve_model_data_config(model)
{'input_size': (3, 224, 224),
'interpolation': 'bicubic',
'mean': (0.485, 0.456, 0.406),
'std': (0.229, 0.224, 0.225),
'crop_pct': 0.875,
'crop_mode': 'center'}Bu veri yapılandırmasını timm.data.create_transform() işlevine ileterek modelin ilişkili dönüşümünü başlatabiliriz.
>>> data_cfg = timm.data.resolve_model_data_config(model)
>>> transform = timm.data.create_transform(**data_cfg)
>>> transform
Compose(
Resize(size=256, interpolation=bicubic, max_size=None, antialias=True)
CenterCrop(size=(224, 224))
MaybeToTensor()
Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)Note: Here, the pretrained model's config happens to be the same as the generic config we made earlier. This is not always the case. So, it's safer to use the data config to create the transform as we did here instead of using the generic transform.
Çıkarım İçin Ön Eğitilmiş Modellerin Kullanılması
Burada, yukarıdaki bölümleri bir araya getirecek ve çıkarım için önceden eğitilmiş bir model kullanacağız.
Öncelikle çıkarım yapacağımız bir görsel gerekiyor. Burada bir yaprak fotoğrafını web'den yüklüyoruz:
>>> import requests
>>> from PIL import Image
>>> from io import BytesIO
>>> url = 'https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/timm/cat.jpg'
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> imageYüklediğimiz görüntü:
Şimdi, modelimizi ve dönüşümlerimizi yeniden oluşturacağız. Bu sefer, modelimizi değerlendirme moduna ayarlamaya özen gösteriyoruz.
>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True).eval()
>>> transform = timm.data.create_transform(
**timm.data.resolve_model_data_config(model)
)Bu görüntüyü modele hazırlamak için onu transform'a iletebiliriz.
>>> image_tensor = transform(image)
>>> image_tensor.shape
torch.Size([3, 224, 224])Şimdi tahminleri almak için bu görüntüyü modele iletebiliriz. Bu durumda unsqueeze(0) kullanıyoruz çünkü model bir batch boyutu bekliyor.
>>> output = model(image_tensor.unsqueeze(0))
>>> output.shape
torch.Size([1, 1000])Tahmin edilen olasılıkları almak için çıktıya softmax uygularız. Bu, (num_classes,) biçiminde bir tensör bırakır.
>>> probabilities = torch.nn.functional.softmax(output[0], dim=0)
>>> probabilities.shape
torch.Size([1000])Şimdi torch.topk kullanarak tahmin edilen sınıf indekslerinin ve değerlerinin ilk 5’ini bulacağız.
>>> values, indices = torch.topk(probabilities, 5)
>>> indices
tensor([281, 282, 285, 673, 670])En üst indeksteki imagenet etiketlerini kontrol edersek, modelin ne tahmin ettiğini görebiliriz…
>>> IMAGENET_1k_URL = 'https://storage.googleapis.com/bit_models/ilsvrc2012_wordnet_lemmas.txt'
>>> IMAGENET_1k_LABELS = requests.get(IMAGENET_1k_URL).text.strip().split('\n')
>>> [{'label': IMAGENET_1k_LABELS[idx], 'value': val.item()} for val, idx in zip(values, indices)]
[{'label': 'tabby, tabby_cat', 'value': 0.5101025700569153},
{'label': 'tiger_cat', 'value': 0.22490699589252472},
{'label': 'Egyptian_cat', 'value': 0.1835290789604187},
{'label': 'mouse, computer_mouse', 'value': 0.006752475164830685},
{'label': 'motor_scooter, scooter', 'value': 0.004942195490002632}]