pytorch图片读入预处理的方法

pytorch训练前将自己的数据处理成模型需要的数据格式,定义自己的数据集都必须继承torch.utils.data的Dataset类,并重写其中三个关键的默认成员函数。

使用类 torch.utils.data.Dataset这个类,这个类中有,__init__,__len__,__getitem__。

__init__类实例化应用,所以参数项里面最好有数据集的path,或者是数据以及标签保存的json、csv文件,在__init__函数里面对json、csv文件进行解析。

__len__需要返回images的数量。

__getitem__中要返回image和相对应的label,要注意的是此处参数有一个index,指的返回的是哪个image和label

 

重要导入包:

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

稍微简单点的例子:

class myDataset(Dataset):
    """
        下载数据、初始化数据,都可以在这里完成
    """
    def __init__(self):
        xy = np.loadtxt('../dataSet/diabetes.csv.gz', delimiter=',', dtype=np.float32) # 使用numpy读取数据
        self.x_data = torch.from_numpy(xy[:, 0:-1])
        self.y_data = torch.from_numpy(xy[:, [-1]])
        self.len = xy.shape[0]
    
    def __getitem__(self, index):
        return self.x_data[index], self.y_data[index]

    def __len__(self):
        return self.len

# 实例化这个类,然后我们就得到了Dataset类型的数据,记下来就将这个类传给DataLoader,就可以了。    
trainset = myDataset()

train_loader = DataLoader(dataset=trainset ,
                          batch_size=32,
                          shuffle=True)


for epoch in range(2):
    for i, data in enumerate(train_loader):
        # 将数据从 train_loader 中读出来,一次读取的样本数是32个
        inputs, labels = data
        # 将这些数据转换成Variable类型
        inputs, labels = Variable(inputs), Variable(labels)


 

更具体的例子:

from torch.utils.data import DataLoader,Dataset
from torchvision import transforms
from sklearn.model_selection import train_test_split
import numpy as np
class mydataset(Dataset):
    def __init__(self,
                 images,
                 labels=None,
                 transform=None):
        self.x=images
        self.y=labels
        self.transform=transform

    def __len__(self):
        return len(self.x)

    def __getitem__(self,idx):
        img=np.array(self.x[idx]).reshape([28,28,1])
        if self.transform is not None:
            img = self.transform(img)

        y=np.zeros(10,dtype='float32')
        y[self.y[idx]]=1
        # keras.utils.to_categorical(self.y,num_class),
        # tflearn.date_util.to_categorical(self.y,num_class)
        return img,y

# Put some augmentation on training data
train_transform = transforms.Compose([
    transforms.ToPILImage(),
    transforms.RandomAffine(degrees=5, translate=(0.1, 0.1), scale=(0.9, 1.1), shear=5),
    transforms.ToTensor()
])


nums,rows,cols,channels=50000,32,32,3
X=[nums,rows,cols,channels]
Y=[nums,1]
X_train, X_val,y_train,y_val=train_test_split(X,Y,test_size=0.3,random_state=23)
train_dataset = mydataset(X_train, y_train, train_transform)

train_loader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True) # num_workers=4

# model.train()
for batch_idx,(data,target) in enumerate(train_loader):

    data = data.to('cuda')
    target = target.to('cuda')

    output = model(data)
    loss = criterion(output, target)
    ...

官方文档:https://pytorch-cn.readthedocs.io/zh/latest/package_references/data/

你可能感兴趣的:(深度学习)