آموزش PyTorch برای مبتدیان – کلاسه بندی تصویر با یادگیری انتقالی

در سال های اخیر PyTorch به دلیل سهولت در استفاده و یادگیری ، بسیار مورد توجه قرار گرفته است. زیرا کار با آن بسیار ساده است و می تواند با بهره وری بالا و نتایج قابل اطمینان ، به محققان و دانشمندان داده کمک کند.

در این پست، که سومین قسمت از مجموعه آموزش PyTorch است، به کلاسه بندی تصویر در PyTorch می پردازیم. ما از یک زیرمجموعه از مجموعه داده CalTech256 برای کلاسه بندی تصاویر ۱۰ نوع حیوان استفاده خواهیم کرد. مراحل تهیه مجموعه داده ، داده افزایی و سپس مراحل ساخت کلاسه بند را مرور خواهیم کرد.

ما به کمک یادگیری انتقالی از ویژگی های سطح پایین تصویر مانند لبه ها ، بافت ها و غیره استفاده کنیم. این ویژگی ها توسط مدل آموزش دیده ResNet50 آموزش داده می شوند ، و سپس ما کلاسه بند خود را آموزش می دهیم تا جزئیات سطح بالاتر مانند چشم ها ، پا ها و غیره را در تصاویر مجموعه داده خودمان آموزش ببیند. ResNet50 قبلاً با میلیون ها تصویر در ImageNet آموزش دیده است.

نگران توابع و کد ها نباشید. این پست شامل قطعه کد هایی است که می تواند مطالعه و درک آن را برای شما آسان کند. همچنین ، کد کامل پایتون نیز در دسترس است.

با اینکه سعی شده تمامی نکات لازم پوشش داده شود، اما توصیه می کنیم قبل از ادامه کار با اصول Pytorch آشنا شوید.

کلاسه بندی تصاویر حیوانات در PyTorch
کلاسه بندی تصاویر حیوانات در PyTorch

تهیه مجموعه داده

مجموعه داده CalTech256 دارای ۳۰۶۰۷ تصویر است که در ۲۵۶ کلاس مختلف دارای برچسب به همراه یک کلاس دیگر “سایر” طبقه بندی شده است.

آموزش کل مجموعه داده ساعت ها طول خواهد کشید. بنابراین ما روی زیرمجموعه ای از این مجموعه داده که شامل ۱۰ حیوان است کار خواهیم کرد؛ یعنی کلاس های bear ، chimp ، giraffe ، gorilla ، llama ، ostrich ، porcupine ، skunk ، triceratops و zebra. به این ترتیب می توانیم به کارمان سرعت دهیم. در نهایت می توان از کد برای آموزش کل مجموعه داده نیز استفاده کرد.

تعداد تصاویر در این پوشه ها از ۸۱ (برای skunk ) تا ۲۱۲ (برای gorilla) متغیر است. ما برای آموزش از ۶۰ تصویر اول در هر یک از این دسته ها استفاده می کنیم. ۱۰ تصویر بعدی برای اعتبار سنجی و بقیه تصاویر برای آزمایش مورد استفاده قرار می گیرند. بدین ترتیب در نهایت، ۶۰۰ تصویر آموزشی ، ۱۰۰ تصویر اعتبار سنجی ، ۴۰۹ تصویر آزمایشی و ۱۰ کلاس از حیوانات خواهیم داشت.

برای انجام این آزمایش ، لطفا مراحل زیر را دنبال کنید

    1. مجموعه داده CalTech256 را دانلود کنید

    2. سه پوشه با نام های train ، valid و test ایجاد کنید.

    3. ۱۰ پوشه داخلی برای train و test ایجاد کنید. پوشه های داخلی باید شامل حیواناتی مثل bear ، chimp ، giraffe ، gorilla ، llama ، ostrich ، porcupine ، skunk ، triceratops و zebra باشد.

    4. ۶۰ تصویر اول متعلق به bear را در مجموعه داده های Caltech256 به پوشه train/bear منتقل کنید. این مرحله را برای تمام حیوانات تکرار کنید.

    5. ۱۰ تصویر بعدی را برای bear در مجموعه داده Caltech256 به پوشه valid/bear منتقل کنید. این مرحله را برای تمام حیوانات تکرار کنید.

    6. مابقی تصاویر باقیمانده متعلق به bear (یعنی آن هایی که در پوشه های train یا valid قرار نگرفتند) را در پوشه test/bear  کپی کنید. این مرحله را برای تمام حیوانات تکرار کنید.

داده افزایی

تصاویر موجود در مجموعه آموزش را می توان به روش های مختلفی تغییر داد تا تصاویر بیشتری در روند آموزش دخالت داشته باشند. به این ترتیب مدل آموزش دیده تعمیم بیشتری می یابد و در انواع مختلف داده های آزمایشی عملکرد بهتری خواهد داشت. همچنین ، داده های ورودی می توانند در اندازه های مختلفی ارائه شوند. قبل از استفاده از دسته داده ها برای آموزش ، باید آن ها را به اندازه و قالب ثابتی نرمال کرد.

ابتدا هر یک از تصاویر ورودی، از طریق چند تبدیل، تغییر شکل داده می شوند. ما سعی می کنیم برخی تغییرات تصادفی را روی تصاویر اعمال کنیم. در هر دوره ، یک مجموعه تغییر شکل برای هر تصویر اعمال می شود. وقتی ما برای دوره های مختلف، فرآیند آموزش را تکرار می کنیم ، مدل ها می توانند در هر دوره ، تغییرات بیشتری از تصاویر ورودی را با یک تبدیل تصادفی جدید مشاهده کنند. این کار منجر به داده افزایی می شود و سپس مدل سعی می کند روی موارد بیشتری تعمیم یابد.

در شکل زیر نمونه ای از نسخه های تغییر شکل یافته تصویر Triceratops را مشاهده می کنید.

نمونه های تغییر یافته تصاویر Triceratops
نمونه های تغییر یافته تصاویر Triceratops

اجازه دهید تغییراتی که برای داده افزایی استفاده کردیم را مرور کنیم.

  • تبدیل RandomResizedCrop ، تصویر ورودی را با اندازه تصادفی برش می زند (در محدوده مقیاس ۰٫۸ تا ۱٫۰ برابر اندازه اصلی و یک نسبت ابعاد تصادفی در محدوده پیش فرض ۰٫۷۵ تا ۱٫۳۳). سپس اندازه تصویر بریده شده به ابعاد ۲۵۶ × ۲۵۶ تغییر می یابد.
  • RandomRotation تصویر را با زاویه تصادفی در بازه ۱۵- تا ۱۵ درجه می چرخاند.
  • RandomHorizontalFlip تصویر را بصورت تصادفی با احتمال پیش فرض ۵۰٪ به صورت افقی وارونه می کند.
  • CenterCrop یک تصویر ۲۲۴ × ۲۲۴ را از مرکز تصویر برش می دهد.
  • ToTensor ، یک تصویر PIL را که دارای مقادیری در محدوده ۰-۲۵۵ است ، بر ۲۵۵ تقسیم می کند تا آنها را به یک بازه ۰-۱ نرمال کند.
  • نرمال سازی در یک تنسور ۳ کاناله انجام می گیرد و هر کانال را به میانگین ( Mean ) و انحراف معیار ( Standard Deviation ) ورودی آن کانال نرمال می کند. بردارهای انحراف معیار ​​و میانگین ​​به عنوان بردار هایی با ۳ مولفه وارد می شوند. هر کانال در تنسور به صورت
    T = (T – mean)/(standard deviation)  نرمال می شود.

تمام تبدیلات فوق با استفاده از Compose به یکدیگر متصل می شوند.

# Applying Transforms to the Data
image_transforms = { 
    'train': transforms.Compose([
        transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
        transforms.RandomRotation(degrees=15),
        transforms.RandomHorizontalFlip(),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [۰٫۲۲۹, ۰٫۲۲۴, ۰٫۲۲۵])
    ]),
    'valid': transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [۰٫۲۲۹, ۰٫۲۲۴, ۰٫۲۲۵])
    ]),
    'test': transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [۰٫۲۲۹, ۰٫۲۲۴, ۰٫۲۲۵])
    ])
}

توجه داشته باشید که برای اعتبار سنجی و داده های آزمایشی ، تغییرات RandomResizedCrop ، RandomRotation و RandomHorizontalFlip را انجام نمی دهیم. در عوض ، ما فقط اندازه تصاویر اعتبارسنجی را به ۲۵۶ × ۲۵۶ تغییر می دهیم و یک قطعه مرکزی از تصویر را به ابعاد ۲۲۴ × ۲۲۴ برش می دهیم تا بتوانیم از آن ها برای مدل پیش ساخته استفاده کنیم. سرانجام ، تبدیل تصویر در یک تنسور انجام شده و با مقدر میانگین و انحراف معیار تمام تصاویر موجود در ImageNet نرمال می شود.

بارگذاری داده

برای مرحله بعدی ، بیایید ببینیم که چگونه از تبدیلات تعریف شده بالا استفاده کنیم و داده های مورد استفاده برای فرآیند آموزش را بارگذاری کنیم.

# Load the Data
# Set train and valid directory paths
train_directory = 'train'
valid_directory = 'test'
# Batch size
bs = 32
# Number of classes
num_classes = 10
# Load Data from folders
data = {
    'train': datasets.ImageFolder(root=train_directory, transform=image_transforms['train']),
    'valid': datasets.ImageFolder(root=valid_directory, transform=image_transforms['valid']),
    'test': datasets.ImageFolder(root=test_directory, transform=image_transforms['test'])
}
# Size of Data, to be used for calculating Average Loss and Accuracy
train_data_size = len(data['train'])
valid_data_size = len(data['valid'])
test_data_size = len(data['test'])
# Create iterators for the Data loaded using DataLoader module
train_data = DataLoader(data['train'], batch_size=bs, shuffle=True)
valid_data = DataLoader(data['valid'], batch_size=bs, shuffle=True)
test_data = DataLoader(data['test'], batch_size=bs, shuffle=True)
# Print the train, validation and test set data sizes
train_data_size, valid_data_size, test_data_size

ابتدا مسیر های داده train و valid و اندازه دسته ها را مشخص می کنیم. سپس آن ها را با استفاده از DataLoader بارگذاری می کنیم. توجه داشته باشید که تغییر شکل تصویری که قبلاً بحث کردیم ، هنگام بارگذاری داده ها با استفاده از DataLoader ، روی داده ها اعمال می شود. ترتیب داده ها نیز تغییر داده می شود. torchvision.transforms و DataLoader از ویژگی های بسیار مهم PyTorch هستند که فرآیندهای داده افزایی و بارگذاری داده ها را بسیار آسان می کنند.

یادگیری انتقالی

جمع آوری تصاویر متعلق به یک حوزه مورد نظر و آموزش کامل یک کلاسه بند، بسیار دشوار و زمانبر است. بنابراین ، ما از یک مدل آموزش دیده به عنوان مبنای خود استفاده می کنیم و چند لایه آخر را تغییر می دهیم تا بتوانیم تصاویر را مطابق کلاس های موردنظر خود کلاسه بندی کنیم. این کار به ما کمک می کند حتی با یک مجموعه داده کوچک نتایج خوبی بگیریم، زیرا ویژگی های اساسی تصویر قبلاً در یک مدل از پیش آموزش دیده شده با مجموعه داده های بسیار بزرگتری مانند ImageNet آموزش دیده اند.

آموزش انتقالی
آموزش انتقالی

همانطور که در تصویر بالا ملاحظه می کنید ، لایه های داخلی مطابق با همان مدل پیش ساخته هستند و فقط لایه های آخر متناسب با تعداد کلاس های ما تغییر می کنند. در این کار ، ما از مدل از قبل آموزش دیده ResNet50 استفاده می کنیم.

# Load pretrained ResNet50 Model
resnet50 = models.resnet50(pretrained=True)

Canziani و همکارانش ، دقت به دست آمده و زمان استنباط مورد نیاز برای بسیاری مدل های آموزش دیده را که برای کاربرد های عملی مختلف استفاده می شوند ، تجزیه و تحلیل کردند. ResNet50 یکی از مدل هایی است که بین دقت و زمان استنباط تعادل خوبی دارد. وقتی یک مدل در PyTorch بارگذاری می شود ، تمام پارامترهای قسمت ‘requires_grad‘ آن به طور پیش فرض روی true تنظیم می شود. و این یعنی هر تغییر در مقادیر پارامتر ذخیره می شود تا برای پس انتشار و فرآیند آموزش مورد استفاده قرار گیرد. و این نیاز حافظه را افزایش می دهد. از آنجا که بیشتر پارامترهای موجود در مدل آماده ما قبلاً آموزش دیده اند ، قسمت Required_grad را به false تنظیم می کنیم.

# Freeze model parameters
for param in resnet50.parameters():
    param.requires_grad = False

در مرحله بعد ، مجموعه کوچکی از لایه های Sequential را جایگزین لایه نهایی مدل ResNet50 می کنیم. ورودی های آخرین لایه کاملاً متصل ResNet50 ، به یک لایه Linear منتهی می شوند. ۲۵۶ خروجی داریم که سپس به لایه های ReLU و Dropout وارد می شوند. سپس با یک لایه خطی ۲۵۶ × ۱۰ که دارای ۱۰ خروجی مربوط به ۱۰ کلاس در زیر مجموعه CalTech ما است ، متصل می شود.

# Change the final layer of ResNet50 Model for Transfer Learning
fc_inputs = resnet50.fc.in_features
resnet50.fc = nn.Sequential(
    nn.Linear(fc_inputs, 256),
    nn.ReLU(),
    nn.Dropout(0.4),
    nn.Linear(256, 10), 
    nn.LogSoftmax(dim=1) # For using NLLLoss()
)

از آنجا که ما فرآیند آموزش را روی GPU انجام خواهیم داد ، مدل را برای GPU تنظیم می کنیم.

# Convert model to be used on GPU
resnet50 = resnet50.to('cuda:0')

در مرحله بعد ، ما تابع زیان و بهینه ساز مورد استفاده برای آموزش را تعریف می کنیم. PyTorch انواع مختلفی از توابع زیان را ارائه می دهد. ما از تابع Negative Loss Likelihood استفاده می کنیم زیرا برای کلاسه بندی چندکلاسه مناسب است. PyTorch همچنین از چندین بهینه ساز پشتیبانی می کند که ما از بهینه ساز Adam استفاده می کنیم. Adam یکی از پرکاربردترین بهینه ساز هاست زیرا می تواند نرخ یادگیری را برای هر پارامتر به صورت جداگانه تطبیق دهد.

# Define Optimizer and Loss Function
loss_func = nn.NLLLoss()
optimizer = optim.Adam(resnet50.parameters())

آموزش

کد کامل آموزش در پایتون موجود است ، اما ما در اینجا به مفاهیم اصلی خواهیم پرداخت. فرآیند آموزش برای یک مجموعه دوره ثابت انجام می شود ، و هر تصویر را یک بار در یک دوره پردازش می کند. داده های آموزشی به صورت دسته ای بارگذاری می شوند. در مدل ما ، اندازه دسته ها ۳۲ تایی هستند. این یعنی هر دسته می تواند حداکثر ۳۲ تصویر داشته باشد.

برای هر دسته ، تصاویر ورودی از طریق مدل منتقل می شوند ( forward pass ) ، تا خروجی ها بدست آید. سپس از loss_criterion ارائه شده یا تابع هزینه ارائه شده با استفاده از مقدار درستی مبنا و خروجی های محاسبه شده ، برای محاسبه هزینه استفاده می شود. گرادیان های تابع هزینه نسبت به پارامترهای قابل یادگیری با استفاده از عملیات backward محاسبه می شود.

توجه داشته باشید که با یادگیری انتقالی ، ما فقط باید برای مجموعه کوچکی از پارامترها که متعلق به چند لایه تازه اضافه شده به انتهای مدل هستند ، گرادیان ها را محاسبه کنیم. فراخوانی یک تابع خلاصه نتایج ، می تواند تعداد واقعی پارامتر ها و تعداد پارامتر های قابل یادگیری را نشان دهد. مزیتی که در این روش داریم این است که اکنون فقط باید حدود یک دهم کل پارامتر های مدل را آموزش دهیم.

خلاصه تعداد پارامتر های پروژه کلاسه بندی تصویر

محاسبه گرادیان با استفاده از autograd و backpropagation انجام می شود. PyTorch تمام گرادیان ها را در backward pass جمع می کند. بنابراین آن ها باید در ابتدای حلقه آموزش صفر شوند. این کار با استفاده از تابع zero_grad بهینه ساز انجام می گیرد. سرانجام ، پس از محاسبه گرادیان ها در backward pass ، پارامترها با استفاده از تابع step بهینه ساز بروز می شوند.

هزینه و دقت کل برای تمام دسته ها محاسبه می شود ، و سپس با بدست آوردن میانگین آن در تمام دسته ها ، مقادیر هزینه و دقت برای تمام دوره بدست آید.

for epoch in range(epochs):
        epoch_start = time.time()
        print("Epoch: {}/{}".format(epoch+1, epochs))
        # Set to training mode
        model.train()
        # Loss and Accuracy within the epoch
        train_loss = 0.0
        train_acc = 0.0
        valid_loss = 0.0
        valid_acc = 0.0
        for i, (inputs, labels) in enumerate(train_data_loader):
            inputs = inputs.to(device)
            labels = labels.to(device)
            # Clean existing gradients
            optimizer.zero_grad()
            # Forward pass - compute outputs on input data using the model
            outputs = model(inputs)
            # Compute loss
            loss = loss_criterion(outputs, labels)
            # Backpropagate the gradients
            loss.backward()
            # Update the parameters
            optimizer.step()
            # Compute the total loss for the batch and add it to train_loss
            train_loss += loss.item() * inputs.size(0)
            # Compute the accuracy
            ret, predictions = torch.max(outputs.data, 1)
            correct_counts = predictions.eq(labels.data.view_as(predictions))
            # Convert correct_counts to float and then compute the mean
            acc = torch.mean(correct_counts.type(torch.FloatTensor))
            # Compute total accuracy in the whole batch and add to train_acc
            train_acc += acc.item() * inputs.size(0)
            print("Batch number: {:03d}, Training: Loss: {:.4f}, Accuracy: {:.4f}".format(i, loss.item(), acc.item()))

اعتبار سنجی

وقتی مدل با دوره های بیشتری آموزش ببیند ، منجر به بیش برازش ( Overfit ) روی داده ها شده و در نتیجه روی داده های آزمایشی جدید عملکرد ضعیفی خواهد داشت. لذا ایجاد یک مجموعه اعتبار سنجی جداگانه از این جهت حائز اهمیت است که بتوانیم آموزش را در یک نقطه مناسب متوقف کرده و از بیش برازش مدل جلوگیری کنیم.

اعتبار سنجی بلافاصله پس از حلقه آموزش در هر دوره انجام می شود. از آنجا که در فرآیند اعتبارسنجی به هیچگونه محاسبه گرادیان نیازی نداریم ، این کار در یک بلوک torch.no_grad() انجام می شود.

برای هر دسته اعتبار سنجی ، ورودی ها و برچسب ها به GPU منتقل می شوند (در صورت موجود بودن cuda ، در غیر این صورت به CPU منتقل می شوند). ورودی ها از طریق forward pass وارد می شوند و به دنبال آن محاسبات مربوط به هزینه و دقت برای هر دسته و در انتهای حلقه ، برای کل دوره ها انجام می شود.

# Validation - No gradient tracking needed
        with torch.no_grad():
            # Set to evaluation mode
            model.eval()
            # Validation loop
            for j, (inputs, labels) in enumerate(valid_data_loader):
                inputs = inputs.to(device)
                labels = labels.to(device)
                # Forward pass - compute outputs on input data using the model
                outputs = model(inputs)
                # Compute loss
                loss = loss_criterion(outputs, labels)
                # Compute the total loss for the batch and add it to valid_loss
                valid_loss += loss.item() * inputs.size(0)
                # Calculate validation accuracy
                ret, predictions = torch.max(outputs.data, 1)
                correct_counts = predictions.eq(labels.data.view_as(predictions))
                # Convert correct_counts to float and then compute the mean
                acc = torch.mean(correct_counts.type(torch.FloatTensor))
                # Compute total accuracy in the whole batch and add to valid_acc
                valid_acc += acc.item() * inputs.size(0)
                print("Validation Batch number: {:03d}, Validation: Loss: {:.4f}, Accuracy: {:.4f}".format(j, loss.item(), acc.item()))
        # Find average training loss and training accuracy
        avg_train_loss = train_loss/train_data_size 
        avg_train_acc = train_acc/float(train_data_size)
        # Find average training loss and training accuracy
        avg_valid_loss = valid_loss/valid_data_size 
        avg_valid_acc = valid_acc/float(valid_data_size)
        history.append([avg_train_loss, avg_valid_loss, avg_train_acc, avg_valid_acc])
        epoch_end = time.time()
        print("Epoch : {:03d}, Training: Loss: {:.4f}, Accuracy: {:.4f}%, nttValidation : Loss : {:.4f}, Accuracy: {:.4f}%, Time: {:.4f}s".format(epoch, avg_train_loss, avg_train_acc*100, avg_valid_loss, avg_valid_acc*100, epoch_end-epoch_start))

 

نمودار ضرر کلاسه بندی تصاویر با PyTorch
منحنی هزینه برای فرآیند آموزش و اعتبار سنجی
نمودار دقت کلاسه بندی در PyTorch
منحنی دقت برای فرآیند آموزش و اعتبار سنجی

همانطور که در نمودارهای فوق مشاهده می کنید ، برای این مجموعه داده ، هم هزینه اعتبار سنجی و هم هزینه آموزش ، به سرعت رو به کاهش است. دقت مدل نیز به سرعت تا دامنه ۰٫۹ افزایش می یابد. با افزایش تعداد دوره ها ، هزینه آموزش ، بیشتر کاهش می یابد ، اما نتایج اعتبارسنجی بهبود زیادی پیدا نمی کند و منجر به بیش برازش می شود.

بنابراین ما مدلی با تعداد دوره مناسب انتخاب کردیم که دارای دقت بالاتر و هزینه کمتری است. بهتر است برای جلوگیری از بیش برازش روی داده های آموزش ، زودتر فرآیند آموزش را متوقف کنیم. در این مدل، ما تعداد دوره را ۸ انتخاب کردیم که دارای دقت اعتبارسنجی ۹۶٪ بود.

روند توقف فرآیند نیز می تواند خودکار باشد. هنگامی که مقدار هزینه از یک آستانه مشخص کمتر شد یا اگر دقت اعتبار سنجی برای مجموعه معینی از دوره ها بهبود نیابد، می توانیم عملیات را متوقف کنیم.

استنباط

بعد از ساخت مدل ، می توانیم آن را برای به دست آوردن دقت آزمایش بر روی تصاویر آزمایشی تکی یا کل مجموعه داده آزمایشی استنباط کنیم. محاسبه دقت مجموعه آزمایشی مشابه کد اعتبارسنجی است ، با این تفاوت که روی مجموعه داده آزمایش انجام می شود.

ما تابع محاسبه TestSetAccuracy را در نوت بوک Python اضافه کردیم. در ادامه به نحوه پیدا کردن کلاس خروجی برای یک تصویر آزمایشی مشخص می پردازیم.

یک تصویر ورودی ابتدا دستخوش تغییرات شده و به عنوان داده آزمایشی یا اعتبارسنجی مورد استفاده قرار می گیرد. سپس تنسور حاصل به یک حالت ۴ بعدی تبدیل شده و مدل را عبور می دهد تا احتمال لگاریتمی سیستم را برای کلاس های مختلف تولید می کند.

نمایی از خروجی های مدل ، احتمال تعلق به کلاس ها را برای ما فراهم می کند. در نهایت کلاس با بالاترین احتمال را به عنوان کلاس خروجی خود انتخاب می کنیم.

انتخاب کلاس با بالاترین احتمال به عنوان کلاس خروجی خود.

def predict(model, test_image_name):
    transform = image_transforms['test']
    test_image = Image.open(test_image_name)
    plt.imshow(test_image)
    test_image_tensor = transform(test_image)
    if torch.cuda.is_available():
        test_image_tensor = test_image_tensor.view(1, 3, 224, 224).cuda()
    else:
        test_image_tensor = test_image_tensor.view(1, 3, 224, 224)
    with torch.no_grad():
        model.eval()
        # Model outputs log probabilities
        out = model(test_image_tensor)
        ps = torch.exp(out)
        topk, topclass = ps.topk(1, dim=1)
        print("Output class :  ", idx_to_class[topclass.cpu().numpy()[0][0]])

در مجموعه داده آزمایشی با ۴۰۹ تصویر، دقت ۹۲٫۴٪ بدست آمده است.

در ادامه برخی از نتایج کلاسه بندی داده های آزمایشی جدید که در فرآیند آموزش یا اعتبارسنجی استفاده نشده است ، آورده شده است. کلاس های پیش بینی شده برتر برای تصاویر با امتیازات احتمالات شان در سمت راست بالا قرار گرفته اند.

همانطور که در زیر می بینیم ، کلاس پیش بینی شده با بالاترین احتمال اغلب یک کلاس صحیح است. همچنین توجه داشته باشید که کلاسی با بالاترین احتمال دوم اغلب در بین ۹ کلاس باقیمانده از نظر ظاهری نزدیکترین حیوان است.

دقت تشخیص کلاس gorilla
دقت تشخیص کلاس gorilla
دقت تشخیص کلاس triceratops
دقت تشخیص کلاس triceratops
دقت تشخیص کلاس porcupine
دقت تشخیص کلاس porcupine
دقت تشخیص کلاس skunk
دقت تشخیص کلاس skunk
دقت تشخیص کلاس giraffe
دقت تشخیص کلاس giraffe
دقت تشخیص کلاس ostrich
دقت تشخیص کلاس ostrich
دقت تشخیص کلاس zebra
دقت تشخیص کلاس zebra
دقت تشخیص کلاس bear
دقت تشخیص کلاس bear
دقت تشخیص کلاس chimp
دقت تشخیص کلاس chimp
دقت تشخیص کلاس llama
دقت تشخیص کلاس llama

دیدیم که چگونه می توان از یک مدل از قبل آموزش دیده برای ۱۰۰۰ کلاس ImageNet ، استفاده کرد. این مجموعه در واقع تصاویر متعلق به ۱۰ کلاس مختلف مورد نظر ما را کلاسه بندی کرده است.

ما نتایج کلاسه بندی را در یک مجموعه داده کوچک نشان دادیم. در پست بعدی ، همین روش یادگیری انتقالی را در مجموعه داده های سخت تر که شامل مسائل زندگی روزمره است ، اعمال خواهیم کرد. منتظر باشید!

اگر از این مقاله خوشتان آمده می توانید برای دریافت یک راهنمای مرجع بینایی رایانه ای رایگان اینجا کلیک کنید.

بیشتر بخوانید :

منبع Learn OpenCV

همچنین ببینید

پلاک خوان هوشمند چیست

پلاک خوان هوشمند چیست و چگونه عمل می کند + معرفی بهترین پلاک خوان ایران

پلاک خوان هوشمند دستگاهی است که از فناوری پیشرفته هوش مصنوعی (AI) و بینایی ماشین …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *