imagefolder函數全面解析

一、imagefolder函數

一般用於處理圖像的數據集,包括從文件夾讀取圖像,對圖像進行預處理,並生成可供pytorch訓練的數據結構。imagefolder函數常見的參數及含義如下:

torchvision.datasets.ImageFolder(root, transform=None, target_transform=None,
                                   loader=default_loader, is_valid_file=None)

root:數據集的根目錄,在該目錄下以文件夾的形式存放著各個類別的圖像。

transform:圖像的轉換,常用的操作有:裁剪、旋轉、翻轉、縮放等等,這些操作可以通過該參數進行實現。

target_transform:標籤的轉換,常用的操作有:獨熱編碼(one-hot)、標籤映射等等,這些操作可以通過該參數進行實現。

loader:讀取圖像的方法,默認為default_loader方法。

is_valid_file:文件是否有效的判斷方法,默認為默認方法。

二、imagefolder載入的數據類型

在使用imagefolder函數時,經常會涉及到數據類型的轉換。其中常用的數據類型有Tensor和numpy數組。Tensor是pytorch中最常見的數據類型,numpy數組則是python中處理科學計算最常用的數據類型。

三、imagefolder數據集

使用imagefolder函數可以獲取到的數據集對象類型為torch.utils.data.Dataset,它是pytorch中表示數據集的一個類,由該類構建的對象可以被pytorch中的DataLoader所使用。數據集對象通常包含三個方法:

__len__(): 獲取數據集的長度
__getitem__(): 獲取某個數據的索引
classes: 獲取數據集的類別

四、imagefolder怎麼用

使用imagefolder函數生成的數據對象可以被pytorch中的DataLoader所使用,如下所示:

from torchvision import datasets, transforms
from torch.utils.data import DataLoader

root = "/path/to/dataset"
transform = transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor()]) 
dataset = datasets.ImageFolder(root=root, transform=transform)
dataloader = DataLoader(dataset, batch_size=64,
                         shuffle=True, num_workers=4)

五、imagefolder混淆矩陣

混淆矩陣是在分類問題中常用的評價方法,其主要思想是將實際類別與預測類別分別作為行和列,矩陣中每一個元素表示將某個實際類別預測為某個預測類別的樣本數。在pytorch中,使用imagefolder載入數據時,可以通過如下方法生成混淆矩陣:

from sklearn.metrics import confusion_matrix

# 載入數據集
test_data = datasets.ImageFolder(test_dir, transform=valid_transform)

# 獲取預測結果
y_pred = []
for images, labels in test_loader:
    images = images.to(device)
    outputs = model(images)
    _, pred = torch.max(outputs, 1)
    y_pred += list(pred.cpu().numpy())

# 獲取實際結果
y_true = []
for _, labels in test_loader:
        y_true += list(labels.numpy())

# 生成混淆矩陣
conf_mat = confusion_matrix(y_true, y_pred)
print(conf_mat)

六、imagefolder劃分交叉驗證

在使用imagefolder函數時,經常需要將數據集劃分為訓練集、驗證集和測試集。pytorch提供了SubsetRandomSampler和SubsetSequentialSampler用於實現手動劃分訓練集、驗證集和測試集。

from torch.utils.data import SubsetRandomSampler, SubsetSequentialSampler

# 定義訓練、驗證和測試數據集比例
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1

# 定義數據集對象
data = datasets.ImageFolder(root_dir, transform=transform)

# 定義數據集的長度和索引
data_len = len(data)
indices = list(range(data_len))

# 計算訓練、驗證和測試數據集的長度
train_size = int(train_ratio * data_len)
valid_size = int(valid_ratio * data_len)
test_size = data_len - train_size - valid_size

# 分割訓練、驗證和測試數據集
train_idx, valid_idx, test_idx = indices[:train_size], indices[train_size:train_size+valid_size], indices[-test_size:]

# 創建數據集的Sampler
train_sampler = SubsetRandomSampler(train_idx)
valid_sampler = SubsetSequentialSampler(valid_idx)
test_sampler = SubsetSequentialSampler(test_idx)

# 創建數據集的DataLoader
train_loader = DataLoader(data, batch_size=batch_size, sampler=train_sampler, num_workers=num_workers)
valid_loader = DataLoader(data, batch_size=batch_size, sampler=valid_sampler, num_workers=num_workers)
test_loader = DataLoader(data, batch_size=batch_size, sampler=test_sampler, num_workers=num_workers)

七、imagefolder處理tif圖片

在使用imagefolder函數時,經常會遇到處理擴展名為tif的圖像文件的情況。pytorch中提供了PIL庫用於處理圖像,可以通過該庫的Image.open方法打開tif圖片。

from PIL import Image

class TIFFImageLoader(object):
    def __call__(self, filename):
        img = Image.open(filename)
        img.load()
        return img

data_transforms = transforms.Compose([transforms.CenterCrop(1000), transforms.ToTensor()])
trainset = datasets.ImageFolder(root=os.path.join(train_path), transform=data_transforms, loader=TIFFImageLoader())

八、imagefolder怎麼分訓練集與測試集選取

在使用imagefolder函數時,經常需要將數據集劃分為訓練集和測試集。pytorch提供了random_split方法用於實現隨機劃分訓練集和測試集。

from torchvision import transforms, datasets

data_transforms = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])
data = datasets.ImageFolder(root="/path/to/data", transform=data_transforms)
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(data, [train_size, test_size])
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151100.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-10 01:12
下一篇 2024-11-10 01:12

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論