和官网的差不多,加了一些自己的理解和整理

导入包

import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset
from download import download

1.数据集下载与处理

#下载数据集
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')
test_dataset = MnistDataset('MNIST_Data/test')
#打印列标签
print(train_dataset.get_col_names())

# 数据处理流水线
# 缩放-归一化-打包成指定大小的batch_size
def datapipe(dataset,batch_size):
      image_transforms=[
            vision.Rescale(1.0/255.0,0),
            vision.Normalize(mean=(0.1307,),std=(0.3081,)),
            vision.HWC2CHW()
      ]
      label_transform=transforms.TypeCast(mindspore.int32)
      # 使用map处理数据
      dataset=dataset.map(image_transforms,'image')
      dataset=dataset.map(label_transform,'label')
      dataset=dataset.batch(batch_size)
      return dataset

train_dataset=datapipe(train_dataset,64)
test_dataset=datapipe(test_dataset,64)
for image, label in test_dataset.create_tuple_iterator():
    print(f"Shape of image [N, C, H, W]: {image.shape} {image.dtype}")
    print(f"Shape of label: {label.shape} {label.dtype}")
    break

2.构建网络模型

class Network(nn.Cell):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.dense_relu_sequential = nn.SequentialCell(
            nn.Dense(28*28, 512),
            nn.ReLU(),
            nn.Dense(512, 512),
            nn.ReLU(),
            nn.Dense(512, 10)
        )
    # MindSpore 中使用construct方法定义前向传播过程(而非 PyTorch 中的forward)
    def construct(self, x):
        x = self.flatten(x)
        logits = self.dense_relu_sequential(x)
        return logits

model = Network()
print(model)

3.训练逻辑定义

# 实例化损失函数和优化器
# 这是常用的多类别分类损失函数
loss_fn=nn.CrossEntropyLoss()
optimizer=nn.SGD(model.trainable_params(),1e-2)

# 正向计算函数
def forward_fn(data,label):
      logits=model(data)
      loss=loss_fn(logits,label)
      return loss,logits
# 梯度函数
grad_fn=mindspore.value_and_grad(forward_fn,None,optimizer.parameters,has_aux=True)

def train_step(data,label):
      # 前向计算(求损失)→ 反向传播(求梯度)→ 优化器更新参数
      # 计算梯度和损失
      (loss,_),grads=grad_fn(data,label)
      # 使用优化器根据梯度更新参数
      optimizer(grads)
      return loss

def train(model,dataset):
      size=dataset.get_dataset_size()
      # 训练模式
      model.set_train()
      for batch,(data,label) in enumerate(dataset.create_tuple_iterator()):
            loss=train_step(data,label)
            # 每一百次打印一次损失
            if batch%100==0:
                  loss,current=loss.asnumpy(),batch
                  print(f"loss:{loss:>7f} [{current:>3d}/{size:>3d}]")

4.训练并测试

# 定义测试函数
def test(model, dataset, loss_fn):
    num_batches = dataset.get_dataset_size()
    # 模型设置为推理模式
    model.set_train(False)
    # 样本总数,测试损失,正确样本数
    total, test_loss, correct = 0, 0, 0
    for data, label in dataset.create_tuple_iterator():
        pred = model(data)
        total += len(data)
        test_loss += loss_fn(pred, label).asnumpy()
        # 在第 1 维度(类别维度)上取最大值的索引,即模型预测的类别
        correct += (pred.argmax(1) == label).asnumpy().sum()
    #   计算这一批次的平均损失
    test_loss /= num_batches
    correct /= total
    print(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

# 开始多轮的训练和测试
epochs = 3
for t in range(epochs):
    print(f"Epoch {t+1}\n-------------------------------")
    train(model, train_dataset)
    test(model, test_dataset, loss_fn)
print("Done!")

5.保存模型

mindspore.save_checkpoint(model,'model.ckpt')
print("save model to model.ckpt")

6.加载模型

# 实例化模型并将参数加载到模型上
model=Network()
param_dict=mindspore.load_checkpoint("model.ckpt")
param_not_load,_=mindspore.load_param_into_net(model,param_dict)
# param_not_load是未被加载的参数列表,为空时代表所有参数均加载成功
print(param_not_load)

# 加载后的模型可以直接用于预测推理
model.set_train(False)
for data,label in test_dataset:
      pred=model(data)
      predicted=pred.argmax(1)
      print(f'predicted:"{predicted[:10]}",actual:"{label[:10]}"')
      break

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐