今天是参加昇思25天学习打卡营的第4天,学习的内容是《数据集 Dataset》,这里做一个简单的分享。
简介
今天学习的主题是:认识数据集dataset
MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transforms)实现高效的数据预处理,其中数据集市基础。 mindspore.dataset提供了内置的文本、图像、音频等数据集加载接口,并提供了自定义数据集加载接口。
数据集的内容主要包括 数据集的加载、数据集迭代、 数据集的常规操作、自定义数据集等4个部分的内容。
数据集的加载
对于常用的mnist数据集,可以使用mindspore.dataset提供的接口来加载,不过这个接口仅支持解压后的数据文件。
数据集的迭代
数据集加载后,一般以迭代方式获取数据,然后送入神经网络中进行训练。我们可以用create_tuple_iterator或create_dict_iterator接口创建数据迭代器,迭代访问数据。一个数据集可视化函数如下图:
def visualize(dataset):
figure = plt.figure(figsize=(4, 4))
cols, rows = 3, 3
plt.subplots_adjust(wspace=0.5, hspace=0.5)
for idx, (image, label) in enumerate(dataset.create_tuple_iterator()):
figure.add_subplot(rows, cols, idx + 1)
plt.title(int(label))
plt.axis("off")
plt.imshow(image.asnumpy().squeeze(), cmap="gray")
if idx == cols * rows - 1:
break
plt.show()
自定义数据
Pipeline的设计理念使得数据集的常用操作采用dataset = dataset.operation()的异步执行方式,执行操作返回新的Dataset,此时不执行具体操作,而是在Pipeline中加入节点,最终进行迭代时,并行执行整个Pipeline。
数据集的常用操作有:shuffle (随机打乱) ,map(指定列添加数据变换),batch(分批处理)
Map操作的示例如下:
image, label = next(train_dataset.create_tuple_iterator())
train_dataset = train_dataset.map(vision.Rescale(1.0 / 255.0, 0), input_columns='image')
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)
自定义数据集
对于mindspore不支持的数据集,可以采用自定义数据集的方案来进行处理。
自定义数据集可以分为可随机访问数据集、可迭代数据集、生成器数据集
可随机访问数据集是实现了__getitem__
和__len__
方法的数据集,表示可以通过索引/键直接访问对应位置的数据样本。(类似数组)
可迭代的数据集是实现了__iter__
和__next__
方法的数据集,表示可以通过迭代的方式逐步获取数据样本。这种类型的数据集特别适用于随机访问成本太高或者不可行的情况。(类似map)
生成器也属于可迭代的数据集类型,其直接依赖Python的生成器类型generator
返回数据,直至生成器抛出StopIteration
异常。一个生成器的示例如下:
# Generator
def my_generator(start, end):
for i in range(start, end):
yield i
dataset = GeneratorDataset(source=lambda: my_generator(3, 6), column_names=["data"])
for d in dataset:
print(d)
输入效果如下:
[Tensor(shape=[], dtype=Int64, value= 3)]
[Tensor(shape=[], dtype=Int64, value= 4)]
[Tensor(shape=[], dtype=Int64, value= 5)]
以上是第四天的学习内容,打卡图 一张: