MindSpore学习笔记,仅供参考和学习分享。
Tensor
具体参考:张量 Tensor
普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。
mindspore.ops.concat:将给定维度上的一系列张量连接起来。输入为多个Tensor组合的元组或列表。
mindspore.ops.stack:在新的维度上将两个张量合并起来。输入为多个Tensor组合的元组或列表。
Dataset
从dataset中取一个数据
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)
具体流程是:先取数据集的迭代器(create_tuple_iterator()/create_dict_iterator()),然后使用next()取出迭代器指向的第一个数据。
打印出来的image格式为(28, 28, 1),即高x宽x通道数(HWC)为28x28x1
显示图像
defvisualize(dataset):
figure = plt.figure(figsize=(4, 4))
cols, rows = 3, 3for 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()
需要关注的是image.asnumpy().squeeze()这个操作。
matplotlib的pyplot模块操作的是numpy类型数据,不支持直接操作tensor,所以需要先使用asnumpy()转换成numpy()类型数据;
matplotlib.pyplot.imshow()
imshow的第一个参数是图像数据。支持的输入格式为:
(M,N) :带有标量数据的图像。数据可视化使用色彩图。
(M,N,3) :具有RGB值的图像(float或uint8)。
(M,N,4) :具有RGBA值的图像(float或uint8),即包括透明度。
前两个维度(M,N)定义了行和列图片,即图片的高和宽;
而当前image的格式是(28, 28, 1),即灰度图的最低维占了一个维度存储数值,这个单独的维度需要被删除以满足imshow的格式。
numpy.suqeeze()
从数组的形状中删除单维度条目,即把shape中为1的维度去掉,将数值填充到其他维度。需要传入两个参数:输入的数组 和 指定删除的维度,此处不指定维度,默认删除所有单维度。
因此使用suqeeze()后,图像数据即可满足imshow()的格式要求。
数据集处理
map()
dataset.map():针对数据集的指定列进行指定方式的数据变换。
查看数据集有哪些列:
print(dataset.get_col_names())
使用map()将image列的每个数据进行1/255的缩放,使用缩放接口:vision.Rescale()
train_dataset = train_dataset.map(operations=vision.Rescale(1.0 / 255, 0), input_columns='image')
batch
batch能将数据集打包输出,使用batch前每次取1个数据,使用batch后每次取一组数据。
经过batch后,取出来的数据增加一维,大小为batch_size。
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)
# batch批处理,batch后的数据增加一维,大小为batch_size
train_dataset = train_dataset.batch(batch_size=64)
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)
输出:
(28, 28, 1) Float32
(64, 28, 28, 1) Float32
自定义数据集
通过可迭代对象构造自定义数据集
1、构造一个类,该类支持迭代输出(支持__getitem__(self, index)方法 和 len(self)方法)
2、实例化该类,然后使用GeneratorDataset()方法生成数据集
然后就得到了MindSpore格式下的数据集了。
from mindspore.dataset import GeneratorDataset
import numpy as np
classBaseData:'''
base data for dataset
'''def__init__(self) -> None:
self.data = np.random.rand(10)
self.label = np.random.rand(10)
def__getitem__(self, idx):return self.data[idx], self.label[idx]
def__len__(self):return len(self.data)
base_data = BaseData()
my_dataset = GeneratorDataset(source=base_data, column_names=["data", "labels"])
# 打印一个数据
data, label = next(my_dataset.create_tuple_iterator())
print(data, label)
除此以外,GeneratorDataset还支持通过迭代器生成数据集,这要求构造的类支持__next__(self)、iter(self)和__len__()三个方法,具体实现方法可参考文档。