Örnekle Derin Öğrenme için PyTorch Transfer Öğrenimi

İçindekiler:

Anonim

Transfer Öğrenimi nedir?

Transfer Öğrenimi , başka bir ilgili görevi çözmek için eğitimli bir model kullanma tekniğidir. Belirli bir problemi çözerken kazanılan bilgileri depolayan ve aynı bilgiyi farklı ancak ilişkili başka bir problemi çözmek için kullanan bir Makine Öğrenimi araştırma yöntemidir. Bu, önceden öğrenilen görevden toplanan bilgileri yeniden kullanarak verimliliği artırır.

Eğitim sürenizi azaltmak için diğer ağ modeli ağırlığını kullanmak popülerdir çünkü bir ağ modelini eğitmek için çok fazla veriye ihtiyacınız vardır. Eğitim süresini azaltmak için, diğer ağları ve ağırlığını kullanırsınız ve sorunumuzu çözmek için son katmanı değiştirirsiniz. Avantajı, son katmanı eğitmek için küçük bir veri kümesi kullanabilmenizdir.

Bu PyTorch Transfer öğrenme öğreticisinin sonraki bölümünde, Transfer Öğrenmeyi PyTorch ile nasıl kullanacağımızı öğreneceğiz.

Veri Kümesi Yükleniyor

Kaynak: Alien vs. Predator Kaggle

Transfer Learning PyTorch'u kullanmaya başlamadan önce, kullanacağınız veri setini anlamanız gerekir. Bu Transfer Öğrenimi PyTorch örneğinde, bir Alien ve bir Predator'ı yaklaşık 700 görüntüden sınıflandıracaksınız. Bu teknik için, eğitmek için gerçekten büyük miktarda veriye ihtiyacınız yok. Veri kümesini Kaggle: Alien vs. Predator'dan indirebilirsiniz.

Transfer Öğrenimi Nasıl Kullanılır?

İşte PyTorch ile Derin Öğrenme için Transfer Öğrenmenin nasıl kullanılacağına dair adım adım bir süreç:

Adım 1) Verileri Yükleyin

İlk adım, verilerimizi yüklemek ve ağ gereksinimlerini karşılaması için görüntülere bazı dönüşümler yapmaktır.

Verileri torchvision.dataset ile bir klasörden yükleyeceksiniz. Modül, verileri tren ve doğrulama için bölmek üzere klasörde yinelenecektir. Dönüştürme işlemi, görüntüleri merkezden kırpacak, yatay bir çevirme gerçekleştirecek, normalleştirecek ve son olarak Derin Öğrenme kullanarak tensöre dönüştürecektir.

from __future__ import print_function, divisionimport osimport timeimport torchimport torchvisionfrom torchvision import datasets, models, transformsimport torch.optim as optimimport numpy as npimport matplotlib.pyplot as pltdata_dir = "alien_pred"input_shape = 224mean = [0.5, 0.5, 0.5]std = [0.5, 0.5, 0.5]#data transformationdata_transforms = {'train': transforms.Compose([transforms.CenterCrop(input_shape),transforms.ToTensor(),transforms.Normalize(mean, std)]),'validation': transforms.Compose([transforms.CenterCrop(input_shape),transforms.ToTensor(),transforms.Normalize(mean, std)]),}image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),transform=data_transforms[x])for x in ['train', 'validation']}dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=32,shuffle=True, num_workers=4)for x in ['train', 'validation']}dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'validation']}print(dataset_sizes)class_names = image_datasets['train'].classesdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

PyTorch Transfer Learning için veri setimizi görselleştirelim. Görselleştirme süreci, tren veri yükleyicilerinden ve etiketlerinden bir sonraki görüntü grubunu alacak ve bunu matplot ile gösterecektir.

images, labels = next(iter(dataloaders['train']))rows = 4columns = 4fig=plt.figure()for i in range(16):fig.add_subplot(rows, columns, i+1)plt.title(class_names[labels[i]])img = images[i].numpy().transpose((1, 2, 0))img = std * img + meanplt.imshow(img)plt.show()

Adım 2) Modeli Tanımlayın

Bu Derin Öğrenme sürecinde, torchvision modülünden ResNet18'i kullanacaksınız.

Önceden eğitilmiş ağırlık True olarak ayarlanmış resnet18'i yüklemek için torchvision.models'i kullanacaksınız. Bundan sonra, bu katmanların eğitilebilir olmaması için katmanları donduracaksınız. Ayrıca son katmanı, 2 sınıf olan ihtiyaçlarımıza uyacak şekilde bir Doğrusal katmanla değiştirirsiniz. CrossEntropyLoss'u çok sınıflı kayıp işlevi için de kullanırsınız ve optimize edici için aşağıdaki PyTorch Transfer Öğrenme örneğinde gösterildiği gibi 0.0001 öğrenme oranı ve 0.9'luk bir momentum ile SGD kullanacaksınız.

## Load the model based on VGG19vgg_based = torchvision.models.vgg19(pretrained=True)## freeze the layersfor param in vgg_based.parameters():param.requires_grad = False# Modify the last layernumber_features = vgg_based.classifier[6].in_featuresfeatures = list(vgg_based.classifier.children())[:-1] # Remove last layerfeatures.extend([torch.nn.Linear(number_features, len(class_names))])vgg_based.classifier = torch.nn.Sequential(*features)vgg_based = vgg_based.to(device)print(vgg_based)criterion = torch.nn.CrossEntropyLoss()optimizer_ft = optim.SGD(vgg_based.parameters(), lr=0.001, momentum=0.9)

Çıktı modeli yapısı

VGG((features): Sequential((0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(3): ReLU(inplace)(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(6): ReLU(inplace)(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(8): ReLU(inplace)(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace)(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(13): ReLU(inplace)(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(15): ReLU(inplace)(16): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(17): ReLU(inplace)(18): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(19): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(20): ReLU(inplace)(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(22): ReLU(inplace)(23): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(24): ReLU(inplace)(25): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(26): ReLU(inplace)(27): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(29): ReLU(inplace)(30): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(31): ReLU(inplace)(32): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(33): ReLU(inplace)(34): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(35): ReLU(inplace)(36): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(classifier): Sequential((0): Linear(in_features=25088, out_features=4096, bias=True)(1): ReLU(inplace)(2): Dropout(p=0.5)(3): Linear(in_features=4096, out_features=4096, bias=True)(4): ReLU(inplace)(5): Dropout(p=0.5)(6): Linear(in_features=4096, out_features=2, bias=True)))

Adım 3) Modeli Eğitin ve Test Edin

Modelimizi eğitmemize ve değerlendirmemize yardımcı olması için Transfer Öğrenimi PyTorch Eğitiminden bazı işlevleri kullanacağız.

def train_model(model, criterion, optimizer, num_epochs=25):since = time.time()for epoch in range(num_epochs):print('Epoch {}/{}'.format(epoch, num_epochs - 1))print('-' * 10)#set model to trainable# model.train()train_loss = 0# Iterate over data.for i, data in enumerate(dataloaders['train']):inputs , labels = datainputs = inputs.to(device)labels = labels.to(device)optimizer.zero_grad()with torch.set_grad_enabled(True):outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item() * inputs.size(0)print('{} Loss: {:.4f}'.format('train', train_loss / dataset_sizes['train']))time_elapsed = time.time() - sinceprint('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))return modeldef visualize_model(model, num_images=6):was_training = model.trainingmodel.eval()images_so_far = 0fig = plt.figure()with torch.no_grad():for i, (inputs, labels) in enumerate(dataloaders['validation']):inputs = inputs.to(device)labels = labels.to(device)outputs = model(inputs)_, preds = torch.max(outputs, 1)for j in range(inputs.size()[0]):images_so_far += 1ax = plt.subplot(num_images//2, 2, images_so_far)ax.axis('off')ax.set_title('predicted: {} truth: {}'.format(class_names[preds[j]], class_names[labels[j]]))img = inputs.cpu().data[j].numpy().transpose((1, 2, 0))img = std * img + meanax.imshow(img)if images_so_far == num_images:model.train(mode=was_training)returnmodel.train(mode=was_training)

Son olarak, PyTorch'ta Transfer Öğrenimi örneğinde, eğitim sürecimize 25'e ayarlanmış dönem sayısı ile başlayalım ve eğitim sürecinden sonra değerlendirelim. Her eğitim adımında, model girdiyi alacak ve çıktıyı tahmin edecektir. Bundan sonra, tahmin edilen çıktı, kayıpları hesaplamak için kritere geçirilecektir. Daha sonra kayıplar, gradyanı hesaplamak ve son olarak ağırlıkları hesaplamak ve parametreleri autograd ile optimize etmek için bir backprop hesaplaması gerçekleştirecektir.

Görselleştirme modelinde, eğitimli ağ, etiketleri tahmin etmek için bir grup görüntü ile test edilecektir. Daha sonra matplotlib yardımı ile görselleştirilecektir.

vgg_based = train_model(vgg_based, criterion, optimizer_ft, num_epochs=25)visualize_model(vgg_based)plt.show()

Adım 4) Sonuçlar

Nihai sonuç,% 92'lik bir doğruluğa ulaşmanızdır.

Epoch 23/24----------train Loss: 0.0044train Loss: 0.0078train Loss: 0.0141train Loss: 0.0221train Loss: 0.0306train Loss: 0.0336train Loss: 0.0442train Loss: 0.0482train Loss: 0.0557train Loss: 0.0643train Loss: 0.0763train Loss: 0.0779train Loss: 0.0843train Loss: 0.0910train Loss: 0.0990train Loss: 0.1063train Loss: 0.1133train Loss: 0.1220train Loss: 0.1344train Loss: 0.1382train Loss: 0.1429train Loss: 0.1500Epoch 24/24----------train Loss: 0.0076train Loss: 0.0115train Loss: 0.0185train Loss: 0.0277train Loss: 0.0345train Loss: 0.0420train Loss: 0.0450train Loss: 0.0490train Loss: 0.0644train Loss: 0.0755train Loss: 0.0813train Loss: 0.0868train Loss: 0.0916train Loss: 0.0980train Loss: 0.1008train Loss: 0.1101train Loss: 0.1176train Loss: 0.1282train Loss: 0.1323train Loss: 0.1397train Loss: 0.1436train Loss: 0.1467Training complete in 2m 47s

Sonunda modelimizin çıktısı aşağıdaki matplot ile görselleştirilecektir:

Özet

Öyleyse, her şeyi özetleyelim! İlk faktör, PyTorch'un yeni başlayanlar için veya araştırma amaçlı büyüyen bir derin öğrenme çerçevesi olmasıdır. Yüksek hesaplama süresi, Dinamik Grafik, GPU desteği sunar ve tamamen Python ile yazılmıştır. Kendi ağ modülümüzü kolaylıkla tanımlayabilir ve eğitim sürecini kolay bir yineleme ile yapabilirsiniz. PyTorch'un yeni başlayanlar için derin öğrenmeyi keşfetmesi için ideal olduğu ve profesyonel araştırmacılar için daha hızlı hesaplama süresi ve ayrıca dinamik grafiğe yardımcı olmak için çok yararlı otomatik sınıflandırma işlevi ile çok yararlı olduğu açıktır.