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/