from mindspore.dataset import vision
from mindspore.dataset import MnistDataset, GeneratorDatase
//仅支持解压后的数据文件
from download import download
//下载数据集并解压
加载完数据集后,我们需要迭代获取数据以进行训练。
//create_tuple_iterator
//create_dict_iterator
//都为接口,创建数据迭代器
for idx, (image, label) in enumerate(dataset.create_tuple_iterator()):
数据集随机shuffle
可以消除数据排列造成的分布不均问题
map可以针对数据集指定列(column)添加数据变换(Transforms)
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)
//(28, 28, 1) UInt8
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)
//(28, 28, 1) Float32
将数据集打包为固定大小的batch是使用梯度下降进行模型优化的折中方法
train_dataset = train_dataset.batch(batch_size=32)
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)
//(32, 28, 28, 1) Float32
对于一些mindspore 暂不支持的数据集,需要用GeneratorDataset
接口实现自定义方式的数据集加载
data = Iterable()
dataset = GeneratorDataset(source=data, column_names=["data", "label"])
主要就是对直接加载的原始数据进行预处理。
1.1
import numpy as np
from PIL import Image
from download import download
from mindspore.dataset import transforms, vision, text
from mindspore.dataset import GeneratorDataset, MnistDataset
1.2
# Download data from open datasets
url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \
"notebook/datasets/MNIST_Data.zip"
//下载路径
path = download(url, "./", kind="zip", replace=True)
//下载到根目录,格式,是否取代同名文件
train_dataset = MnistDataset('MNIST_Data/train')
1.3
composed = transforms.Compose(
[
vision.Rescale(1.0 / 255.0, 0),
vision.Normalize(mean=(0.1307,), std=(0.3081,)),
vision.HWC2CHW()
]
)
train_dataset = train_dataset.map(composed, 'image')
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)
//
train_dataset = train_dataset.map(vision.Rescale(1.0 / 255.0, 0), input_columns='image')
//
//对比map原本的参数结构,compose提前设定了更多的量,并放入其中
Rescale
变换用于调整图像像素值的大小,包括两个参数:
图像的每个像素将根据这两个参数进行调整,输出的像素值为output=input∗rescale+shift_output=input∗rescale+shift
make:
random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)
transform:
rescale = vision.Rescale(1.0 / 255.0, 0)
rescaled_image = rescale(random_image)
Normalize
变换用于对输入图像的归一化,包括三个参数:
图像的每个通道将根据mean
和std
进行调整,计算公式为output=(input−mean_std)output=(input−mean_std),其中 cc代表通道索引.
1.
normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
HWC2CWH
变换用于转换图像格式。在不同的硬件设备中可能会对(height, width, channel)或(channel, height, width)两种不同格式有针对性优化。MindSpore设置HWC为默认图像格式,在有CWH格式需求时,可使用该变换进行处理。
这里我们先将前文中normalized_image
处理为HWC格式,然后进行转换。可以看到转换前后的shape发生了变化。
hwc_image = np.expand_dims(normalized_image, -1)
hwc2cwh = vision.HWC2CHW()
chw_image = hwc2cwh(hwc_image)
mindspore.dataset.text
模块提供一系列针对文本数据的Transforms。与图像数据不同,文本数据需要有分词(Tokenize)、构建词表、Token转Index等操作。这里简单介绍其使用方法。
首先我们定义三段文本,作为待处理的数据,并使用GeneratorDataset
进行加载。
1.BasicTokenizer
test_dataset = test_dataset.map(text.BasicTokenizer())
print(next(test_dataset.create_tuple_iterator()))
//
[Tensor(shape=[5], dtype=String, value= ['我', '喜', '欢', 'China', '!'])]
2.Lookup
vocab = text.Vocab.from_dataset(test_dataset)
print(vocab.vocab())
//
{'迎': 11, '我': 10, '您': 9, '京': 6, 'to': 5, '!': 12, '喜': 8, 'Welcome': 4, 'China': 3, '北': 7, 'Beijing': 2, '!': 1, '欢': 0}
//看不懂