mindspore学习笔记,仅供参考和学习分享。
具体参考:张量 Tensor
属性 | 描述 |
---|---|
形状(shape) | Tensor的shape,是一个tuple |
数据类型(dtype) | Tensor的dtype,是MindSpore的一个数据类型 |
单个元素大小(itemsize) | Tensor中每一个元素占用字节数,是一个整数 |
占用字节数量(nbytes) | Tensor占用的总字节数,是一个整数 |
维数(ndim) | Tensor的秩,也就是len(tensor.shape),是一个整数 |
元素个数(size) | Tensor中所有元素的个数,是一个整数 |
每一维步长(strides) | Tensor每一维所需要的字节数,是一个tuple |
普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。
mindspore.ops.concat:将给定维度上的一系列张量连接起来。输入为多个Tensor组合的元组或列表。
mindspore.ops.stack:在新的维度上将两个张量合并起来。输入为多个Tensor组合的元组或列表。
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
def visualize(dataset):
figure = plt.figure(figsize=(4, 4))
cols, rows = 3, 3
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()
需要关注的是image.asnumpy().squeeze()这个操作。
matplotlib的pyplot模块操作的是numpy类型数据,不支持直接操作tensor,所以需要先使用asnumpy()转换成numpy()类型数据;
imshow的第一个参数是图像数据。支持的输入格式为:
(M,N) :带有标量数据的图像。数据可视化使用色彩图。
(M,N,3) :具有RGB值的图像(float或uint8)。
(M,N,4) :具有RGBA值的图像(float或uint8),即包括透明度。
前两个维度(M,N)定义了行和列图片,即图片的高和宽;
而当前image的格式是(28, 28, 1),即灰度图的最低维占了一个维度存储数值,这个单独的维度需要被删除以满足imshow的格式。
从数组的形状中删除单维度条目,即把shape中为1的维度去掉,将数值填充到其他维度。需要传入两个参数:输入的数组 和 指定删除的维度,此处不指定维度,默认删除所有单维度。
因此使用suqeeze()后,图像数据即可满足imshow()的格式要求。
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前每次取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
class BaseData:
'''
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__()三个方法,具体实现方法可参考文档。