day21 数据处理自我小结
数据集
来源
我根据前面的学习我认为数据集分为飞浆框架自带的和本地的数据集
-
框架自带数据集
import paddle print('视觉相关数据集:', paddle.vision.datasets.__all__) print('自然语言相关数据集:', paddle.text.datasets.__all__)
视觉相关数据集: ['DatasetFolder', 'ImageFolder', 'MNIST', 'FashionMNIST', 'Flowers', 'Cifar10', 'Cifar100', 'VOC2012'] 自然语言相关数据集: ['Conll05st', 'Imdb', 'Imikolov', 'Movielens', 'UCIHousing', 'WMT14', 'WMT16']
-
本地的数据集(也就是自己找的数据集上传到notebook文件夹中)
像下面这两种都是
在本地数据集的基础上可以实现自定义数据集,可以使用飞桨提供的paddle.io.Dataset
基类,来快速实现自定义数据集
import paddle
from paddle.io import Dataset
BATCH_SIZE = 64
BATCH_NUM = 20
IMAGE_SIZE = (28, 28)
CLASS_NUM = 10
class MyDataset(Dataset):
"""
步骤一:继承paddle.io.Dataset类
"""
def __init__(self, num_samples):
"""
步骤二:实现构造函数,定义数据集大小
"""
super(MyDataset, self).__init__()
self.num_samples = num_samples
def __getitem__(self, index):
"""
步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
"""
data = paddle.uniform(IMAGE_SIZE, dtype='float32')
label = paddle.randint(0, CLASS_NUM-1, dtype='int64')
return data, label
def __len__(self):
"""
步骤四:实现__len__方法,返回数据集总数目
"""
return self.num_samples
# 测试定义的数据集
custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)
print('=============custom dataset=============')
for data, label in custom_dataset:
print(data.shape, label.shape)
break
经过这样定义的数据集也可以调用一些高阶API的方法。
加载
上面两种数据集加载也是不一样的
-
框架自带的(举例手写数字)
from paddle.vision.transforms import ToTensor # 训练数据集 用ToTensor将数据格式转为Tensor train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor()) # 验证数据集 val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())
-
本地数据集(这里也要看你的数据集文件类型,我这里目前只知道这两个)
.data
datafile = './work/housing.data' data = np.fromfile(datafile, sep=' ', dtype=np.float32)
.json
datafile = './work/mnist.json.gz' print('loading mnist dataset from {} ......'.format(datafile)) # 加载json数据文件 data = json.load(gzip.open(datafile)) print('mnist dataset load done')
数据预处理
根据我看的视频,对于数据处理的方法有很多,但其实主旨都是把数据集中的数据改成你模型想要的格式。(具体源码到相应博客中看,这里只做小结)
- 比如说房价预测模型中,数据集是1维的,所有数据都连在一起。因此需要我们将数据的形状进行变换,形成一个2维的矩阵,每行为一个数据样本(14个值),每个数据样本包含13个X(影响房价的特征)和一个Y(该类型房屋的均价)。
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ', dtype=np.float32)
# 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)
# 将原始数据进行Reshape,变成[N, 14]这样的形状
data = data.reshape([data.shape[0] // feature_num, feature_num])
-
还有手写数字识别之数据处理、房价预测模型和高阶API实现手写数字识别,都需要把加载到的数据区分训练集,验证集,测试集
datafile = './work/mnist.json.gz' print('loading mnist dataset from {} ......'.format(datafile)) # 加载json数据文件 data = json.load(gzip.open(datafile)) print('mnist dataset load done') # 读取到的数据区分训练集,验证集,测试集 train_set, val_set, eval_set = data
# 将原数据集拆分成训练集和测试集 # 这里使用80%的数据做训练,20%的数据做测试 # 测试集和训练集必须是没有交集的 #list切片假如有1000行数据,offset=800,意味着training_data对行切片取前800条 ratio = 0.8 offset = int(data.shape[0] * ratio) training_data = data[:offset]
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor()) # 验证数据集 val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())
-
还有就是模型可能会对数据的大小有一定要求,就会进行归一化、标准化等等的处理
模型的数据读取
对于模型来讲训练的时候如果一个数据一个数据的训练是非常浪费的,所以就需要生成批次数据。
这里又分为异步数据读取和同步数据读取,具体介绍在数据处理详解。
- 房价预测中的是同步
#for k in range(0, len(training_data), BATCH_SIZE)表示的k是从0开始到len(training_data),每10取值0、10、20、....len(training_data)
#总体就是对training_data每10个切片然后放在mini_batches 里
mini_batches = [training_data[k:k+BATCH_SIZE] for k in range(0,len(training_data), BATCH_SIZE)]
- 飞桨推荐使用
paddle.io.DataLoader
完成数据的加载,异步。
train_loader = paddle.io.DataLoader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)
# 如果要加载内置数据集,将 custom_dataset 换为 train_dataset 即可
for batch_id, data in enumerate(train_loader()):
x_data = data[0]
y_data = data[1]
print(x_data.shape)
print(y_data.shape)
break