• কম্পিউটার ভিশন টিউটোরিয়ালের জন্য স্থানান্তর শিক্ষা 1

    কম্পিউটার ভিশন টিউটোরিয়ালের জন্য স্থানান্তর শিক্ষা


    এই টিউটোরিয়ালে, আপনি শিখবেন কীভাবে স্থানান্তর শিখন ব্যবহার করে চিত্রের শ্রেণিবিন্যাসের জন্য একটি কনভোলশনাল নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দেওয়া যায়। আপনি সিএস 231 এন নোটে ট্রান্সফার শেখার বিষয়ে আরও পড়তে পারেন
    এই নোটগুলি উদ্ধৃত করে,
    অনুশীলনে, খুব কম লোকই স্ক্র্যাচ থেকে একটি সম্পূর্ণ কনভলিউশনাল নেটওয়ার্ককে প্রশিক্ষণ দেয় (এলোমেলো সূচনা সহ), কারণ পর্যাপ্ত আকারের ডেটাসেট তুলনামূলকভাবে বিরল। পরিবর্তে, একটি খুব বড় ডেটাসেটে (যেমন ইমেজনেট, যেখানে 1000 টি বিভাগ সহ 1.2 মিলিয়ন চিত্র রয়েছে) একটি কনভনেটকে প্রিট্রেইন করা সাধারণ, এবং তারপরে আগ্রহের কাজটির জন্য কনভনেটটিকে আরম্ভ বা নির্দিষ্ট বৈশিষ্ট্য এক্সট্র্যাক্টর হিসাবে ব্যবহার করুন।
    এই দুটি প্রধান স্থানান্তর শিখনের পরিস্থিতি নীচে দেখুন:
    • কনফিটকে শেষ করা : এলোমেলো ইনিশিয়ালইয়নটির পরিবর্তে, আমরা ইমেজনেট 1000 ডেটাসেটের প্রশিক্ষণপ্রাপ্ত নেটওয়ার্কের মতো একটি পূর্বনির্ধারিত নেটওয়ার্ক দিয়ে নেটওয়ার্কটি সূচনা করি। বাকি প্রশিক্ষণ যথারীতি দেখায়।
    • কনভনেট স্থির বৈশিষ্ট্য নিষ্কর্ষক হিসাবে : এখানে, আমরা চূড়ান্তভাবে সম্পূর্ণরূপে সংযুক্ত স্তর ব্যতীত সমস্ত নেটওয়ার্কের জন্য ওজন হিম করে দেব। এই শেষটি সম্পূর্ণরূপে সংযুক্ত স্তরটি এলোমেলো ওজনের সাথে একটি নতুনের সাথে প্রতিস্থাপন করা হয়েছে এবং কেবল এই স্তরটি প্রশিক্ষিত trained
    # License: BSD
    # Author: Sasank Chilamkurthy
    
    from __future__ import print_function, division
    
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.optim import lr_scheduler
    import numpy as np
    import torchvision
    from torchvision import datasets, models, transforms
    import matplotlib.pyplot as plt
    import time
    import os
    import copy
    
    plt.ion()   # interactive mode
    

    লোড তথ্য

    ডেটা লোড করার জন্য আমরা টর্চভিশন এবং টর্চ.ইটিলস.ডাটা প্যাকেজ ব্যবহার করব।
    আমরা আজ যে সমস্যার সমাধান করতে যাচ্ছি তা হ'ল পিঁপড়া এবং মৌমাছিদের শ্রেণিবদ্ধ করার জন্য একটি মডেলকে প্রশিক্ষণ দেওয়া । আমাদের পিঁপড়া এবং মৌমাছিদের জন্য প্রায় 120 টি প্রশিক্ষণ চিত্র রয়েছে। প্রতিটি শ্রেণীর জন্য 75 টি বৈধতা চিত্র রয়েছে। সাধারণত, স্ক্র্যাচ থেকে প্রশিক্ষিত হলে এটি সাধারণকরণের জন্য খুব ছোট একটি ডেটাসেট। যেহেতু আমরা স্থানান্তর শেখা ব্যবহার করছি, আমাদের যুক্তিসঙ্গতভাবে ভাল করতে সক্ষম হওয়া উচিত।
    এই ডেটাসেটটি ইমেজনেটের একটি খুব ছোট উপসেট।
    বিঃদ্রঃ
    এখান থেকে ডেটা ডাউনলোড করুন এবং এটি বর্তমান ডিরেক্টরিতে এক্সট্রাক্ট করুন।
    # Data augmentation and normalization for training
    # Just normalization for validation
    data_transforms = {
        'train': transforms.Compose([
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
        'val': transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
    }
    
    data_dir = 'data/hymenoptera_data'
    image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
                                              data_transforms[x])
                      for x in ['train', 'val']}
    dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
                                                 shuffle=True, num_workers=4)
                  for x in ['train', 'val']}
    dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
    class_names = image_datasets['train'].classes
    
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    

    কয়েকটি চিত্র ভিজ্যুয়ালাইজ করুন

    আসুন কয়েকটি প্রশিক্ষণ চিত্রটি ভিজ্যুয়ালাইজ করা যাক যাতে ডেটা বৃদ্ধিগুলি বোঝা যায়।
    def imshow(inp, title=None):
        """Imshow for Tensor."""
        inp = inp.numpy().transpose((1, 2, 0))
        mean = np.array([0.485, 0.456, 0.406])
        std = np.array([0.229, 0.224, 0.225])
        inp = std * inp + mean
        inp = np.clip(inp, 0, 1)
        plt.imshow(inp)
        if title is not None:
            plt.title(title)
        plt.pause(0.001)  # pause a bit so that plots are updated
    
    
    # Get a batch of training data
    inputs, classes = next(iter(dataloaders['train']))
    
    # Make a grid from batch
    out = torchvision.utils.make_grid(inputs)
    
    imshow(out, title=[class_names[x] for x in classes])
    
    ../_images/sphx_glr_transfer_learning_tutorial_001.png

    মডেল প্রশিক্ষণ

    এখন, একটি মডেল প্রশিক্ষণ জন্য একটি সাধারণ ফাংশন লিখুন। এখানে, আমরা বর্ণনা করব:
    • শেখার হার নির্ধারণ
    • সেরা মডেল সংরক্ষণ করা
    নিম্নলিখিতটিতে, প্যারামিটারটি schedulerএকটি এলআর শিডিয়ুলার অবজেক্ট torch.optim.lr_scheduler
    def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
        since = time.time()
    
        best_model_wts = copy.deepcopy(model.state_dict())
        best_acc = 0.0
    
        for epoch in range(num_epochs):
            print('Epoch {}/{}'.format(epoch, num_epochs - 1))
            print('-' * 10)
    
            # Each epoch has a training and validation phase
            for phase in ['train', 'val']:
                if phase == 'train':
                    model.train()  # Set model to training mode
                else:
                    model.eval()   # Set model to evaluate mode
    
                running_loss = 0.0
                running_corrects = 0
    
                # Iterate over data.
                for inputs, labels in dataloaders[phase]:
                    inputs = inputs.to(device)
                    labels = labels.to(device)
    
                    # zero the parameter gradients
                    optimizer.zero_grad()
    
                    # forward
                    # track history if only in train
                    with torch.set_grad_enabled(phase == 'train'):
                        outputs = model(inputs)
                        _, preds = torch.max(outputs, 1)
                        loss = criterion(outputs, labels)
    
                        # backward + optimize only if in training phase
                        if phase == 'train':
                            loss.backward()
                            optimizer.step()
    
                    # statistics
                    running_loss += loss.item() * inputs.size(0)
                    running_corrects += torch.sum(preds == labels.data)
                if phase == 'train':
                    scheduler.step()
    
                epoch_loss = running_loss / dataset_sizes[phase]
                epoch_acc = running_corrects.double() / dataset_sizes[phase]
    
                print('{} Loss: {:.4f} Acc: {:.4f}'.format(
                    phase, epoch_loss, epoch_acc))
    
                # deep copy the model
                if phase == 'val' and epoch_acc > best_acc:
                    best_acc = epoch_acc
                    best_model_wts = copy.deepcopy(model.state_dict())
    
            print()
    
        time_elapsed = time.time() - since
        print('Training complete in {:.0f}m {:.0f}s'.format(
            time_elapsed // 60, time_elapsed % 60))
        print('Best val Acc: {:4f}'.format(best_acc))
    
        # load best model weights
        model.load_state_dict(best_model_wts)
        return model
    

    মডেল পূর্বাভাস ভিজ্যুয়ালাইজিং

    কয়েকটি চিত্রের জন্য পূর্বাভাস প্রদর্শন করার জন্য জেনেরিক ফাংশন
    def visualize_model(model, num_images=6):
        was_training = model.training
        model.eval()
        images_so_far = 0
        fig = plt.figure()
    
        with torch.no_grad():
            for i, (inputs, labels) in enumerate(dataloaders['val']):
                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 += 1
                    ax = plt.subplot(num_images//2, 2, images_so_far)
                    ax.axis('off')
                    ax.set_title('predicted: {}'.format(class_names[preds[j]]))
                    imshow(inputs.cpu().data[j])
    
                    if images_so_far == num_images:
                        model.train(mode=was_training)
                        return
            model.train(mode=was_training)
    

    কনফেটটি শেষ করা হচ্ছে

    একটি পূর্বনির্ধারিত মডেল লোড করুন এবং চূড়ান্তভাবে সংযুক্ত স্তরটিকে পুনরায় সেট করুন।
    model_ft = models.resnet18(pretrained=True)
    num_ftrs = model_ft.fc.in_features
    # Here the size of each output sample is set to 2.
    # Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)).
    model_ft.fc = nn.Linear(num_ftrs, 2)
    
    model_ft = model_ft.to(device)
    
    criterion = nn.CrossEntropyLoss()
    
    # Observe that all parameters are being optimized
    optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
    
    # Decay LR by a factor of 0.1 every 7 epochs
    exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
    

    প্রশিক্ষণ এবং মূল্যায়ন

    এটি সিপিইউতে প্রায় 15-25 মিনিট সময় নেয়। জিপিইউতে যদিও এটি এক মিনিটেরও কম সময় নেয়।
    model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
                           num_epochs=25)
    
    বাইরে:
    Epoch 0/24
    ----------
    train Loss: 0.6058 Acc: 0.6926
    val Loss: 0.3300 Acc: 0.8562
    
    Epoch 1/24
    ----------
    train Loss: 0.5581 Acc: 0.7951
    val Loss: 0.2182 Acc: 0.9216
    
    Epoch 2/24
    ----------
    train Loss: 0.6139 Acc: 0.7746
    val Loss: 0.2058 Acc: 0.8954
    
    Epoch 3/24
    ----------
    train Loss: 0.7887 Acc: 0.7295
    val Loss: 0.5233 Acc: 0.8235
    
    Epoch 4/24
    ----------
    train Loss: 0.6316 Acc: 0.7459
    val Loss: 0.3267 Acc: 0.8758
    
    Epoch 5/24
    ----------
    train Loss: 0.4477 Acc: 0.8320
    val Loss: 0.7233 Acc: 0.7059
    
    Epoch 6/24
    ----------
    train Loss: 0.4509 Acc: 0.8074
    val Loss: 0.2602 Acc: 0.8954
    
    Epoch 7/24
    ----------
    train Loss: 0.4134 Acc: 0.8320
    val Loss: 0.2239 Acc: 0.9020
    
    Epoch 8/24
    ----------
    train Loss: 0.3443 Acc: 0.8770
    val Loss: 0.2326 Acc: 0.9216
    
    Epoch 9/24
    ----------
    train Loss: 0.4378 Acc: 0.8033
    val Loss: 0.2433 Acc: 0.9085
    
    Epoch 10/24
    ----------
    train Loss: 0.3246 Acc: 0.8648
    val Loss: 0.2168 Acc: 0.9020
    
    Epoch 11/24
    ----------
    train Loss: 0.3238 Acc: 0.8402
    val Loss: 0.2147 Acc: 0.9150
    
    Epoch 12/24
    ----------
    train Loss: 0.3138 Acc: 0.8607
    val Loss: 0.2342 Acc: 0.9085
    
    Epoch 13/24
    ----------
    train Loss: 0.3591 Acc: 0.8361
    val Loss: 0.2313 Acc: 0.9150
    
    Epoch 14/24
    ----------
    train Loss: 0.2950 Acc: 0.8689
    val Loss: 0.2180 Acc: 0.9216
    
    Epoch 15/24
    ----------
    train Loss: 0.3117 Acc: 0.8566
    val Loss: 0.2403 Acc: 0.9085
    
    Epoch 16/24
    ----------
    train Loss: 0.2750 Acc: 0.8975
    val Loss: 0.2439 Acc: 0.8954
    
    Epoch 17/24
    ----------
    train Loss: 0.2291 Acc: 0.8934
    val Loss: 0.2247 Acc: 0.9150
    
    Epoch 18/24
    ----------
    train Loss: 0.2931 Acc: 0.8811
    val Loss: 0.2230 Acc: 0.9085
    
    Epoch 19/24
    ----------
    train Loss: 0.2643 Acc: 0.8852
    val Loss: 0.2153 Acc: 0.9150
    
    Epoch 20/24
    ----------
    train Loss: 0.3548 Acc: 0.8238
    val Loss: 0.2357 Acc: 0.9020
    
    Epoch 21/24
    ----------
    train Loss: 0.2801 Acc: 0.8811
    val Loss: 0.2185 Acc: 0.9216
    
    Epoch 22/24
    ----------
    train Loss: 0.2805 Acc: 0.8770
    val Loss: 0.2149 Acc: 0.9150
    
    Epoch 23/24
    ----------
    train Loss: 0.3842 Acc: 0.8115
    val Loss: 0.2762 Acc: 0.8824
    
    Epoch 24/24
    ----------
    train Loss: 0.2845 Acc: 0.9057
    val Loss: 0.2607 Acc: 0.8889
    
    Training complete in 1m 7s
    Best val Acc: 0.921569
    
    visualize_model(model_ft)
    
    ../_images/sphx_glr_transfer_learning_tutorial_002.png

    স্থির বৈশিষ্ট্য নিষ্কর্ষক হিসাবে কনভনেট

    এখানে, আমাদের চূড়ান্ত স্তর বাদে সমস্ত নেটওয়ার্ক হিমায়িত করা দরকার। আমাদের পরামিতিগুলি হিমায়িত করা দরকার যাতে গ্রেডিয়েন্টগুলি গণনা করা যায় না requires_grad == Falsebackward()
    আপনি এখানে ডকুমেন্টেশন এ সম্পর্কে আরও পড়তে পারেন 
    model_conv = torchvision.models.resnet18(pretrained=True)
    for param in model_conv.parameters():
        param.requires_grad = False
    
    # Parameters of newly constructed modules have requires_grad=True by default
    num_ftrs = model_conv.fc.in_features
    model_conv.fc = nn.Linear(num_ftrs, 2)
    
    model_conv = model_conv.to(device)
    
    criterion = nn.CrossEntropyLoss()
    
    # Observe that only parameters of final layer are being optimized as
    # opposed to before.
    optimizer_conv = optim.SGD(model_conv.fc.parameters(), lr=0.001, momentum=0.9)
    
    # Decay LR by a factor of 0.1 every 7 epochs
    exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)
    

    প্রশিক্ষণ এবং মূল্যায়ন

    সিপিইউতে এটি পূর্বের দৃশ্যের তুলনায় প্রায় অর্ধেক সময় নেবে। নেটওয়ার্কের বেশিরভাগ ক্ষেত্রে গ্রেডিয়েন্টগুলি গণনা করার প্রয়োজন নেই বলে এটি প্রত্যাশিত। তবে ফরওয়ার্ডকে গণনা করা দরকার।
    model_conv = train_model(model_conv, criterion, optimizer_conv,
                             exp_lr_scheduler, num_epochs=25)
    
    বাইরে:
    Epoch 0/24
    ----------
    train Loss: 0.6016 Acc: 0.6762
    val Loss: 0.2380 Acc: 0.9346
    
    Epoch 1/24
    ----------
    train Loss: 0.4235 Acc: 0.8074
    val Loss: 0.2046 Acc: 0.9412
    
    Epoch 2/24
    ----------
    train Loss: 0.4564 Acc: 0.7787
    val Loss: 0.1783 Acc: 0.9412
    
    Epoch 3/24
    ----------
    train Loss: 0.4698 Acc: 0.7951
    val Loss: 0.5537 Acc: 0.8105
    
    Epoch 4/24
    ----------
    train Loss: 0.7760 Acc: 0.7049
    val Loss: 0.3698 Acc: 0.8693
    
    Epoch 5/24
    ----------
    train Loss: 0.4807 Acc: 0.8279
    val Loss: 0.2668 Acc: 0.9216
    
    Epoch 6/24
    ----------
    train Loss: 0.5025 Acc: 0.7992
    val Loss: 0.2190 Acc: 0.9346
    
    Epoch 7/24
    ----------
    train Loss: 0.3814 Acc: 0.8484
    val Loss: 0.2321 Acc: 0.9281
    
    Epoch 8/24
    ----------
    train Loss: 0.3904 Acc: 0.8279
    val Loss: 0.2060 Acc: 0.9346
    
    Epoch 9/24
    ----------
    train Loss: 0.3969 Acc: 0.8361
    val Loss: 0.2436 Acc: 0.9216
    
    Epoch 10/24
    ----------
    train Loss: 0.4967 Acc: 0.7828
    val Loss: 0.2125 Acc: 0.9281
    
    Epoch 11/24
    ----------
    train Loss: 0.4055 Acc: 0.8033
    val Loss: 0.2194 Acc: 0.9346
    
    Epoch 12/24
    ----------
    train Loss: 0.3649 Acc: 0.8197
    val Loss: 0.2244 Acc: 0.9281
    
    Epoch 13/24
    ----------
    train Loss: 0.3417 Acc: 0.8361
    val Loss: 0.2407 Acc: 0.9216
    
    Epoch 14/24
    ----------
    train Loss: 0.3859 Acc: 0.8238
    val Loss: 0.2343 Acc: 0.9281
    
    Epoch 15/24
    ----------
    train Loss: 0.3363 Acc: 0.8361
    val Loss: 0.2485 Acc: 0.9216
    
    Epoch 16/24
    ----------
    train Loss: 0.3739 Acc: 0.8402
    val Loss: 0.2638 Acc: 0.9085
    
    Epoch 17/24
    ----------
    train Loss: 0.3253 Acc: 0.8607
    val Loss: 0.2151 Acc: 0.9346
    
    Epoch 18/24
    ----------
    train Loss: 0.4170 Acc: 0.8156
    val Loss: 0.2205 Acc: 0.9346
    
    Epoch 19/24
    ----------
    train Loss: 0.3054 Acc: 0.8689
    val Loss: 0.2296 Acc: 0.9281
    
    Epoch 20/24
    ----------
    train Loss: 0.4219 Acc: 0.8238
    val Loss: 0.2101 Acc: 0.9412
    
    Epoch 21/24
    ----------
    train Loss: 0.3205 Acc: 0.8484
    val Loss: 0.2517 Acc: 0.9216
    
    Epoch 22/24
    ----------
    train Loss: 0.3488 Acc: 0.8402
    val Loss: 0.2266 Acc: 0.9281
    
    Epoch 23/24
    ----------
    train Loss: 0.3217 Acc: 0.8484
    val Loss: 0.2160 Acc: 0.9412
    
    Epoch 24/24
    ----------
    train Loss: 0.3245 Acc: 0.8689
    val Loss: 0.2256 Acc: 0.9281
    
    Training complete in 0m 34s
    Best val Acc: 0.941176
    
    visualize_model(model_conv)
    
    plt.ioff()
    plt.show()
    
    ../_images/sphx_glr_transfer_learning_tutorial_003.png
    স্ক্রিপ্টের মোট চলমান সময়: (1 মিনিট 54.673 সেকেন্ড)
  • 0 comments:

    Post a Comment

    New Research

    Attention Mechanism Based Multi Feature Fusion Forest for Hyperspectral Image Classification.

    CBS-GAN: A Band Selection Based Generative Adversarial Net for Hyperspectral Sample Generation.

    Multi-feature Fusion based Deep Forest for Hyperspectral Image Classification.

    ADDRESS

    388 Lumo Rd, Hongshan, Wuhan, Hubei, China

    EMAIL

    contact-m.zamanb@yahoo.com
    mostofa.zaman@cug.edu.cn

    TELEPHONE

    #
    #

    MOBILE

    +8615527370302,
    +8807171546477