汽车导购
dataset(Day261-DataLoader 和 Dataset)

引入

构建模型的基本方法,我们了解了。接下来,我们就要弄明白怎么对数据进行预处理,然后加载数据,我们以前手动加载数据的方式,在数据量小的时候,并没有太大问题,但是到了大数据量,我们需要使用 shuffle, 分割成mini-batch 等操作的时候,我们可以使用PyTorch的API快速地完成这些操作。

Dataset和DataLoader

Dataset是一个包装类,用来将数据包装为Dataset类,然后传入DataLoader中,我们再使用DataLoader这个类来更加快捷的对数据进行操作。

DataLoader是一个比较重要的类,它为我们提供的常用操作有:batch_size(每个batch的大小), shuffle(是否进行shuffle操作), num_workers(加载数据的时候使用几个子进程)

现在,我们先展示直接使用 TensorDataset 来将数据包装成Dataset类

这里差个题外话,不知道为什么,出现这个错误,

 torch_dataset = Data.TensorDataset(data_tensor=x, target_tensor=y)TypeError: __init__() got an unexpected keyword argument 'data_tensor'

但是,改成deal_dataset = TensorDataset(x_data, y_data)这样就OK了。

接下来,我们来继承 Dataset类 ,写一个将数据处理成DataLoader的类。

当我们集成了一个 Dataset类之后,我们需要重写 len 方法,该方法提供了dataset的大小; getitem 方法, 该方法支持从 0 到 len(self)的索引

class DealDataset(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,就可以了。    dealDataset = DealDataset()train_loader2 = DataLoader(dataset=dealDataset,                          batch_size=32,                          shuffle=True)for epoch in range(2):    for i, data in enumerate(train_loader2):        # 将数据从 train_loader 中读出来,一次读取的样本数是32个        inputs, labels = data        # 将这些数据转换成Variable类型        inputs, labels = Variable(inputs), Variable(labels)        # 接下来就是跑模型的环节了,我们这里使用print来代替        print("epoch:", epoch, "的第" , i, "个inputs", inputs.data.size(), "labels", labels.data.size())

参考:https://blog.csdn.net/zw__chen/article/details/82806900


顶一下()     踩一下()

热门推荐

发表评论
0评