《昇思25天学习打卡营第02天|快速入门》

快速入门

  1. 准备MindSpore环境

    • 安装环境
    python 复制代码
       !pip uninstall mindspore -y
       !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
    • 环境导入
    python 复制代码
    import mindspore
    from mindspore import nn #神经网络模块
    from mindspore.dataset import vision, transforms #图像模块(vision)&数据增强+预处理(transforms)
    from mindspore.dataset import MnistDataset #数据集模块
  2. 数据集处理

    python 复制代码
    #数据集为开放数据集,下载完成后解压
    from download import download
    url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \
          "notebook/datasets/MNIST_Data.zip"
    path = download(url, "./", kind="zip", replace=True)
    MNIST数据集目录结构如下:
    	MNIST_Data
    	└── train
    	    ├── train-images-idx3-ubyte (60000个训练图片)
    	    ├── train-labels-idx1-ubyte (60000个训练标签)
    	└── test
    	    ├── t10k-images-idx3-ubyte (10000个测试图片)
    	    ├── t10k-labels-idx1-ubyte (10000个测试标签)
    	数据下载完成后,获得数据集对象。
    
    #获取训练&测试数据集
    train_dataset = MnistDataset('MNIST_Data/train')
    test_dataset = MnistDataset('MNIST_Data/test')
    
    #数据集预处理
    def datapipe(dataset, batch_size):
    	#定义图像转换操作
        image_transforms = [
        	#图片缩放至范围(0,1)
            vision.Rescale(1.0 / 255.0, 0), 
            #将图像数据的分布调整到均值为0,标准差为1的分布
            vision.Normalize(mean=(0.1307,), std=(0.3081,)), 
          	#HWC(Height, Width, Channel) -> (Channel, Height, Width)
            vision.HWC2CHW()
        ]
        #将标签的数据类型转化成int32,便于模型进行处理,目的是确保计算过程中的精度&性能
        label_transform = transforms.TypeCast(mindspore.int32)
    	
    	#对图像&标签进行数据转化
        dataset = dataset.map(image_transforms, 'image')
        dataset = dataset.map(label_transform, 'label')
        
        #分batch,便于后续训练
        dataset = dataset.batch(batch_size)
        return dataset
  3. 网络模型构建

    python 复制代码
    #定义模型
    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)
           )
    
       def construct(self, x):
           x = self.flatten(x)
           logits = self.dense_relu_sequential(x)
           return logits
    
    model = Network()
  4. 模型训练

    python 复制代码
    #定义损失函数&优化器
    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}]")
  5. 测试函数(模型评估)

    python 复制代码
    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()
            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")
  6. 模型保存&加载&推理

    python 复制代码
    #保存训练完后模型
    mindspore.save_checkpoint(model, "model.ckpt")
    
    #实例模型
    model = Network()
    #加载模型
    param_dict = mindspore.load_checkpoint("model.ckpt")
    param_not_load, _ = mindspore.load_param_into_net(model, param_dict)
    #推理
    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
相关推荐
封步宇AIGC19 分钟前
量化交易系统开发-实时行情自动化交易-Okex K线数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC22 分钟前
量化交易系统开发-实时行情自动化交易-Okex交易数据
人工智能·python·机器学习·数据挖掘
z千鑫24 分钟前
【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化
人工智能·gpt·机器学习·语言模型·自然语言处理·自动化·codemoss
波点兔26 分钟前
【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)
人工智能·python·机器学习·本地部署大模型·chatglm4
佚明zj1 小时前
全卷积和全连接
人工智能·深度学习
并不会2 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿2 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException4 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
阿_旭5 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^5 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt