Mindspore 初学

Mindspore 初学

1.张量Tesnor

  深度学习中涉及的数据形式一般是标量、向量、矩阵以及高维度的。标量可以理解为0维,向量是一组一维数据,矩阵是二维数据,如黑白图像,相应的,彩色图像包含了颜色通道,是一个三维数据。MindSpore提供Tensor数据结构,来存储计算过程中使用的多维数组(n-dimensional array)。
  MindSpore张量支持不同的数据类型,包含int8、int16、int32、int64、uint8、uint16、uint32、uint64、float16、float32、float64、bool_,与NumPy的数据类型一一对应。
  在MindSpore的运算处理流程中,Python中的int数会被转换为定义的int64类型,float数会被转换为定义的float32类型。

1.1创建张量

  • 根据数据集创建
from mindspore import Tensor
data = [1,2,3,4]
x_data = Tensor(data)
x_data#Tensor(shape=[4], dtype=Int32, value= [1, 2, 3, 4])
  • 使用NumPy数组
from mindspore import Tensor
import numpy as np
data = [1,2,3,4]
np_array = np.array(data)
x_np = Tensor(np_array)
x_np#Tensor(shape=[4], dtype=Int32, value= [1, 2, 3, 4])
  • 使用init初始化器
from mindspore import Tensor
from mindspore.common.initializer import One
tensor= mindspore.Tensor(shape=(3, 2), dtype=mindspore.float32, init=One())
tensor
  • 继承另一个张量的属性,形成新的张量

from mindspore import ops

x_ones = ops.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")

x_zeros = ops.zeros_like(x_data)
print(f"Zeros Tensor: \n {x_ones} \n")

1.2索引

张量的索引跟numpy数组一样

from mindspore import Tensor
import numpy as np
tensor = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))

print(tensor[1])
print(tensor[0, 1])
print(tensor[:, -1])
print(tensor[..., 1])

# output
#First row: [2. 3.]
#value of bottom right corner: 2.0
#Last column: [1. 3.]
#First column: [1. 3.]

1.3张量属性

张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。

  • 形状(shape):Tensor的shape,是一个tuple
  • 数据类型(dtype):Tensor的dtype,是MindSpore的一个数据类型。
  • 单个元素大小(itemsize): Tensor中每一个元素占用字节数,是一个整数
  • 占用字节数量(nbytes): Tensor占用的总字节数,是一个整数。
  • 维数(ndim): Tensor的,也就是len(tensor.shape),是一个整数。
  • 元素个数(size): Tensor中所有元素的个数,是一个整数。
  • 每一维步长(strides): Tensor每一维所需要的字节数,是一个tuple。
from mindspore import Tensor
import numpy as np
x = Tensor(np.array([[1, 2], [3, 4]]))
x_shape = x.shape  # 形状
x_dtype = x.dtype  # 数据类型

print(x_shape)
print(x_dtype)
#output
#/(2, 2)
#Int32

1.4张量运算

张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似。
两个张量的合并:

from mindspore import ops

data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
op = ops.Concat()
output = op((data1, data2))

print(output)
print("shape:\n", output.shape)

2.数据集加载

MindSpore数据加载方法根据数据的类型可以分为标准数据集,用户自定义数据集,以及MindRecord格式数据集。其中,常用标准数据集包括如MNIST、CIFAR-10、CIFAR-100、VOC、COCO、ImageNet、CelebA、CLUE等;MindRecord是MindSpore开发的一种高效数据格式,mindspore.mindrecord模块提供了一些方法帮助用户将不同数据集转换为MindRecord格式, 也提供了一些方法读取、写入或者检索MindRecord格式文件。

2.1标准数据集加载

MindSpore.Dataset类提供了很多标准数据集加载的方法,如视觉图像类数据集mindspore.dataset.Cifar10Dataset, mindspore.dataset.CocoDataset;文本类数据集mindspore.dataset.CLUEDataset, mindspore.dataset.IWSLT2017Dataset; 音频类数据集mindspore.dataset.LJSpeechDataset, mindspore.dataset.TedliumDataset等等。
使用Mnist数据集作为样例,mindspore.dataset提供了大量的数据集加载接口,这里我们仍以Mnist为例,直接利用已下载好的数据集文件进行加载。mindspore.dataset提供的接口仅支持解压后的数据文件,因此我们先删除压缩文件。

import os
import mindspore.dataset as ds
import matplotlib.pyplot as plt

dataset_dir = "./data/train"  # 数据集路径

# 从mnist dataset读取3张图片
mnist_dataset = ds.MnistDataset(dataset_dir=dataset_dir, num_samples=3)

# 设置图像大小
plt.figure(figsize=(8,8))
i = 1

# 打印3张子图
for dic in mnist_dataset.create_dict_iterator(output_numpy=True):
    plt.subplot(3,3,i)
    plt.imshow(dic['image'][:,:,0])
    plt.axis('off')
    i +=1

plt.show()

2.2加载NumPy数据集

import mindspore.dataset as ds

data = ds.NumpySlicesDataset([1, 2, 3], column_names=["col_1"])
for x in data.create_dict_iterator():
    print(x)

3.参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用MindSpore实现手写数字识别的简单代码: ```python import numpy as np import mindspore.dataset as ds import mindspore.dataset.transforms.c_transforms as C import mindspore.dataset.vision.c_transforms as CV import mindspore.dataset.transforms.py_transforms as pyC import mindspore.nn as nn from mindspore import context, Tensor from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor from mindspore.train.model import Model from mindspore.nn.metrics import Accuracy from mindspore.common.initializer import Normal # 加载数据集 def create_dataset(data_path, batch_size=32, repeat_size=1, num_parallel_workers=1): # 定义图片转换操作 trans = [] trans.append(CV.Resize((32, 32))) trans.append(CV.RandomCrop((28, 28))) trans.append(CV.Rescale(1 / 255.0, 0)) trans.append(C.Reshape([-1])) type_cast_op = pyC.TypeCast(np.int32) trans = C.Compose(trans) # 加载数据集 mnist_ds = ds.MnistDataset(data_path, shuffle=True) # 应用转换操作 mnist_ds = mnist_ds.map(operations=trans, input_columns="image", num_parallel_workers=num_parallel_workers) mnist_ds = mnist_ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=num_parallel_workers) # 对数据集进行批处理、重复和预取 mnist_ds = mnist_ds.batch(batch_size=batch_size, drop_remainder=True) mnist_ds = mnist_ds.repeat(repeat_size) mnist_ds = mnist_ds.prefetch(buffer_size=num_parallel_workers) return mnist_ds # 定义模型 class LeNet5(nn.Cell): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5, pad_mode='valid') self.conv2 = nn.Conv2d(6, 16, kernel_size=5, pad_mode='valid') self.fc1 = nn.Dense(16 * 4 * 4, 120, weight_init=Normal(0.02)) self.fc2 = nn.Dense(120, 84, weight_init=Normal(0.02)) self.fc3 = nn.Dense(84, 10, weight_init=Normal(0.02)) self.relu = nn.ReLU() self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2) def construct(self, x): x = self.conv1(x) x = self.relu(x) x = self.max_pool2d(x) x = self.conv2(x) x = self.relu(x) x = self.max_pool2d(x) x = nn.Flatten()(x) x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.relu(x) x = self.fc3(x) return x if __name__ == '__main__': # 设置设备环境为CPU context.set_context(mode=context.GRAPH_MODE, device_target="CPU") # 加载数据集 data_path = "./MNIST_unzip/train" mnist_ds = create_dataset(data_path) # 定义模型 network = LeNet5() # 定义损失函数和优化器 loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') opt = nn.Momentum(network.trainable_params(), learning_rate=0.01, momentum=0.9) # 定义模型训练和评估 model = Model(network, loss_fn=loss, optimizer=opt, metrics={"Accuracy": Accuracy()}) # 定义回调函数 ckpt_config = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10) ckpt_cb = ModelCheckpoint(prefix="checkpoint_lenet", config=ckpt_config) # 开始训练 model.train(epoch=1, train_dataset=mnist_ds, callbacks=[ckpt_cb, LossMonitor()], dataset_sink_mode=False) ``` 以上代码使用MindSpore实现了一个简单的LeNet-5模型,用于识别手写数字。代码中使用了MindSpore提供的数据集加载、数据增强、模型定义、损失函数、优化器、回调函数等功能,同时对代码进行了解释,可供初学者参考学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值