当前位置:   article > 正文

《昇思25天学习打卡营第07天|qingyun201003》

《昇思25天学习打卡营第07天|qingyun201003》

日期

image.png

心得

越往后,越看不懂,只能说是有了解到如何去训练模型代码,对于模型代码该如何去保存,如何通过网络模型去训练。只能一步步来,目前来说是推进度,等后面全部有了认知,再回来重新学习

昇思MindSpore 基础入门学习 模型训练 (AI 代码解析)

模型训练

模型训练一般分为四个步骤:

  1. 构建数据集。
  2. 定义神经网络模型。
  3. 定义超参、损失函数及优化器。
  4. 输入数据集进行训练与评估。

现在我们有了数据集和模型后,可以进行模型的训练与评估。

构建数据集

首先从数据集 Dataset加载代码,构建数据集。

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

# Download data from open datasets
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)


def datapipe(path, batch_size):
    image_transforms = [
        vision.Rescale(1.0 / 255.0, 0),  # Rescale the image to [0, 1]
        vision.Normalize(mean=(0.1307,), std=(0.3081,)),  # Normalize the image
        vision.HWC2CHW()  # Convert image from HWC format to CHW format
    ]
    label_transform = transforms.TypeCast(mindspore.int32)  # Cast label to int32

    dataset = MnistDataset(path)  # Load MNIST dataset
    dataset = dataset.map(image_transforms, 'image')  # Apply image transformations
    dataset = dataset.map(label_transform, 'label')  # Apply label transformation
    dataset = dataset.batch(batch_size)  # Batch the dataset
    return dataset

train_dataset = datapipe('MNIST_Data/train', batch_size=64)  # Create training dataset
test_dataset = datapipe('MNIST_Data/test', batch_size=64)  # Create test dataset
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  1. 导入模块:
    • mindspore: MindSpore的主模块,用于深度学习模型的构建和训练。
    • mindspore.nn: 包含神经网络层和损失函数等。
    • mindspore.dataset.vision: 包含图像处理相关的数据增强和变换函数。
    • mindspore.dataset.transforms: 包含数据变换函数。
    • mindspore.dataset.MnistDataset: 用于加载MNIST数据集。
    • download: 用于从指定URL下载数据。
  2. 下载数据:
    • url: 存储MNIST数据集的URL。
    • path = download(url, "./", kind="zip", replace=True): 下载并解压数据集到当前目录。
  3. **数据处理函数 **datapipe:
    • image_transforms: 一系列图像变换操作,包括重缩放、标准化和格式转换。
      • vision.Rescale(1.0 / 255.0, 0): 将图像像素值从[0, 255]缩放到[0, 1]。
      • vision.Normalize(mean=(0.1307,), std=(0.3081,)): 对图像进行标准化处理。
      • vision.HWC2CHW(): 将图像从高度-宽度-通道(HWC)格式转换为通道-高度-宽度(CHW)格式。
    • label_transform: 将标签数据转换为int32类型。
    • dataset = MnistDataset(path): 加载MNIST数据集。
    • dataset = dataset.map(image_transforms, 'image'): 对图像应用上述变换。
    • dataset = dataset.map(label_transform, 'label'): 对标签应用类型转换。
    • dataset = dataset.batch(batch_size): 将数据集分批处理。
  4. 创建训练和测试数据集:
    • train_dataset = datapipe('MNIST_Data/train', batch_size=64): 创建训练数据集。
    • test_dataset = datapipe('MNIST_Data/test', batch_size=64): 创建测试数据集。
  • mindspore.dataset.vision.Rescale: 用于图像像素值的缩放。
  • mindspore.dataset.vision.Normalize: 用于图像的标准化处理。
  • mindspore.dataset.vision.HWC2CHW: 用于图像格式的转换。
  • mindspore.dataset.transforms.TypeCast: 用于数据类型的转换。
  • mindspore.dataset.MnistDataset: 用于加载MNIST数据集。
  • dataset.map: 用于对数据集中的数据应用指定的变换。
  • dataset.batch: 用于将数据集分批处理。

定义神经网络模型
网络构建中加载代码,构建一个神经网络模型。

class Network(nn.Cell):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()  # Flatten the input tensor into a 2D matrix
        self.dense_relu_sequential = nn.SequentialCell(
            nn.Dense(28*28, 512),  # Fully connected layer with input size 28*28 and output size 512
            nn.ReLU(),  # Apply ReLU activation function
            nn.Dense(512, 512),  # Another fully connected layer with output size 512
            nn.ReLU(),  # Apply ReLU activation function
            nn.Dense(512, 10)  # Fully connected layer with output size 10 for classification
        )

    def construct(self, x):
        x = self.flatten(x)  # Flatten the input
        logits = self.dense_relu_sequential(x)  # Pass the input through the sequential dense layers with ReLU
        return logits  # Return the output logits

model = Network()  # Instantiate the neural network model
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. **定义网络结构 **Network:
    • 继承自 mindspore.nn.Cell,这是MindSpore中神经网络模块的基类。
    • __init__ 方法定义了网络的层次结构:
      • self.flatten: 一个 Flatten 层,将输入的多维张量展平为二维张量。
      • self.dense_relu_sequential: 一个 SequentialCell 容器,按顺序包含多个层:
        • nn.Dense(28*28, 512): 一个全连接层,将输入张量从28x28(MNIST图像尺寸)展平后变成512维向量。
        • nn.ReLU(): 一个ReLU激活函数,用于引入非线性。
        • nn.Dense(512, 512): 另一个全连接层,输入输出尺寸都是512维。
        • nn.ReLU(): 再次使用ReLU激活函数。
        • nn.Dense(512, 10): 最后的全连接层,输出10个类别的得分(用于分类任务)。
  2. construct** 方法**:
    • 定义了前向传播的过程:
      • x = self.flatten(x): 将输入张量展平。
      • logits = self.dense_relu_sequential(x): 将展平后的张量通过定义好的全连接层序列。
  3. 实例化模型:
    • model = Network(): 创建 Network 类的实例,也就是我们定义的神经网络模型。
  • nn.Cell: MindSpore中所有神经网络模块的基类。
  • nn.Flatten: 将输入张量展平成二维张量。
  • nn.Dense: 全连接层,参数包括输入和输出的维度。
  • nn.ReLU: ReLU激活函数,应用非线性变换。
  • nn.SequentialCell: 用于按顺序容纳和执行多个子层。

定义超参、损失函数和优化器

超参

超参(Hyperparameters)是可以调整的参数,可以控制模型训练优化的过程,不同的超参数值可能会影响模型训练和收敛速度。目前深度学习模型多采用批量随机梯度下降算法进行优化,随机梯度下降算法的原理如下:
image.png
公式中,n

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/860151
推荐阅读
相关标签