首先先os.walk()方法读取图像集标签与路径到列表,参考:https://blog.csdn.net/qq_42891453/article/details/120064862?spm=1001.2014.3001.5501
然后用LabelEncoder()对特征进行硬编码,参考:https://blog.csdn.net/qq_42891453/article/details/120064685?spm=1001.2014.3001.5501
图像数据初始为RGB三个通道,每个通道的数值都是[0,255]的灰度值
首先transforms.ToTensor()方法可将数据处理成[0,1]之间
在用transforms.Normalize()方法可将数据处理成[-1,1]之间的标准化数据(之所以要处理成标准化数据是为了防止某些数据过大而其余数据都很小时这个过大的数据会对模型带来很大的影响,但其实每个数据都需要对模型产生影响,所以要先标准化)
在使用imagenet数据集时会看到transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])//其中[0.485, 0.456, 0.406]代表的是三个通道的mean也就是均值, [0.229, 0.224, 0.225]为三个通道的方差,这六个数值是提前算出来的。
例:
data_transforms = {
'train': transforms.Compose([
transforms.ToPILImage(),
transforms.Resize(256),
transforms.RandomCrop(224),
transforms.RandomHorizontalFlip(), # 水平镜像
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], # 用平均值和标准偏差归一化张量图像
[0.229, 0.224, 0.225]) # input = (input - mean) / std
]),
'val': transforms.Compose([
transforms.ToPILImage(),
transforms.Resize(256),
transforms.CenterCrop(224), # 测试只需要从中间裁剪
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], # mean
[0.229, 0.224, 0.225]) # std
]),
}
前面为数据增强,然后处理成标准化数据。其中,训练要做数据增强和数据标准化。而验证数据只需要裁剪成训练数据的尺寸而无需增强,因为这样才能保证评估的准确性。
定义好预处理操作之后,接下来,首先将数据按照 4:1 的比例分成训练集和验证集,直接使用大家熟悉的 train_test_split
函数。
from sklearn.model_selection import train_test_split
train_path, val_path, train_label, val_label = train_test_split(
data_path, data_label, test_size=0.2)
重写torch.utils.data.Dataset抽象类使其在 __getitem__
则用于读取图片,并返回图片数据和标签,__len__
: 返回数据集的大小:
from torch.utils.data import Dataset
class DogcatDataset(Dataset):
def __init__(self, data_path, data_label, transform=None):
"""
- data_path (string): 图片路径
- data_label (string): 图片标签
- transform (callable, optional): 作用在每个样本上的预处理函数
"""
self.data_path = data_path
self.data_label = data_label
self.transform = transform
def __len__(self):
return len(self.data_path)
def __getitem__(self, idx):
img_path = self.data_path[idx]
image = io.imread(img_path)
label = self.data_label[idx]
# 如果有,则对数据预处理
if self.transform:
image = self.transform(image)
return image, label
初始化我么需要的dataset:
# 初始化训练数据集
train_dataset = DogcatDataset(train_path, train_label,
data_transforms['train'])
# 初始化测试数据集
val_dataset = DogcatDataset(val_path, val_label,
data_transforms['val'])
torch.utils.data.DataLoader构建数据加载器:
import torch
# 训练数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset,
batch_size=64, shuffle=True)
# 验证数据加载器
val_loader = torch.utils.data.DataLoader(val_dataset,
batch_size=64, shuffle=False)
train_loader, val_loader