一、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-hant/n/151100.html