打卡
目錄
打卡
快速入門案例:minist圖像數據識別任務
案例任務說明
流程
1 加載并處理數據集
2 模型網絡構建與定義
3 模型約束定義
4 模型訓練
5 模型保存
6 模型推理
相關參考文檔入門理解
MindSpore數據處理引擎
模型網絡參數初始化
模型優化器
損失函數
代碼
安裝
從模型訓練到預測推理
self_main_train_and_save.py
self_dataprocess.py
self_network.py
self_modeltrain.py
self_modeltest.py
self_predict.py
快速入門案例:minist圖像數據識別任務
案例任務說明
MINIST數據集是有標簽的圖像數據,圖像數據是0-9的手寫阿拉伯數字。其中,訓練集有6W個,測試集1W個。
目的是訓練一個可以高效識別手寫阿拉伯數字的模型。
流程
1 加載并處理數據集
涉及到的mindspore接口 mindspore.dataset。例如對數據集的map、batch、shuffle等操作,數據列名獲取,對數據集進行迭代訪問、查看數據和標簽的shape和datatype等。
2 模型網絡構建與定義
涉及到 mindspore.nn 類。例如用戶可繼承nn.Cell類來
自定義網絡結構,其中的construct類函數
包含數據(Tensor)的變換過程。。
3 模型約束定義
包括損失函數、優化器等。如?nn.CrossEntropyLoss() 、nn.SGD(model.trainable_params(), 1e-2)
4 模型訓練
- 定義訓練函數,用set_train設置為訓練模式,執行正向計算、反向傳播和參數優化。
- 定義測試函數,用來評估模型的性能。
5 模型保存
- 兩種保存方式:
1)模型參數保存:mindspore.save_checkpoint(model, "model.ckpt")
2)統一的中間表示(Intermediate Representation,IR)的保存,MindIR同時保存了Checkpoint和模型結構,因此需要定義輸入Tensor來獲取輸入shape。mindspore.export(model, inputs, file_name="model", file_format="MINDIR")
6 模型推理
- 兩種加載方式:
1)模型參數加載:?
> model = network()
> param_dict = mindspore.load_checkpoint("model.ckpt");??
>?param_not_load, _ = mindspore.load_param_into_net(model, param_dict)
2)統一的中間表示(Intermediate Representation,IR)的加載:
> mindspore.set_context(mode=mindspore.GRAPH_MODE) > graph = mindspore.load("model.mindir") > model = nn.GraphCell(graph) ## nn.GraphCell 僅支持圖模式。 > outputs = model(inputs)
保存與加載 — MindSpore master 文檔
相關參考文檔入門理解
MindSpore數據處理引擎
MindSpore 通過對外暴露API層來構建數據圖;內部的Data Processing Pipeline 層用來進行數據加載和預處理多步并行流水線。
高性能數據處理引擎 — MindSpore master 文檔
MindSpore 通過數據集(Dataset)和數據變換(Transforms)實現高效的數據預處理。
數據集 Dataset — MindSpore master 文檔
數據變換 Transforms — MindSpore master 文檔
模型網絡參數初始化
Initializer
是MindSpore內置的參數初始化基類,所有內置參數初始化方法均繼承該類。mindspore.nn
中提供的神經網絡層封裝均提供weight_init
、bias_init
等入參,可以直接使用實例化的Initializer進行參數初始化。
參數初始化 — MindSpore master 文檔
模型優化器
優化器 — MindSpore master 文檔
損失函數
損失函數 — MindSpore master 文檔
代碼
安裝
pip/conda均可:
pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
從模型訓練到預測推理
訓練:
python self_main_train_and_save.py
推理:
python self_predict.py
self_main_train_and_save.py
import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset# 用download庫從公開華為云obs桶下載 MINIST 數據集并解壓。因為mindspore.dataset 提供的接口僅支持解壓后的數據文件
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) ## 1 加載數據集
train_dataset = MnistDataset('MNIST_Data/train', shuffle=False)
test_dataset = MnistDataset('MNIST_Data/test')
print(train_dataset.get_col_names()) # 打印數據集中包含的數據列名,用于dataset的預處理。輸出['image', 'label']## 2 MindSpore的dataset使用數據處理流水線,這里將處理好的數據集打包為大小為64的batch。
from self_dataprocess import datapipe
# Map vision transforms and batch dataset
train_dataset = datapipe(train_dataset, 64)
test_dataset = datapipe(test_dataset, 64) ## 3 數據集加載后,一般以迭代方式獲取數據,然后送入神經網絡中進行訓練。可使用create_tuple_iterator 或create_dict_iterator對數據集進行迭代訪問,查看數據和標簽的shape和datatype。
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“”“Shape of image [N, C, H, W]: (64, 1, 28, 28) Float32Shape of label: (64,) Int32”“”
for data in test_dataset.create_dict_iterator():print(f"Shape of image [N, C, H, W]: {data['image'].shape} {data['image'].dtype}")print(f"Shape of label: {data['label'].shape} {data['label'].dtype}")break## 4 模型訓練
from self_network import Network
from self_modeltrain import train, loss_fn
from self_modelteset import test
model = Network()
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 保存模型
# Save checkpoint
mindspore.save_checkpoint(model, "model.ckpt")
print("Saved Model to model.ckpt")
self_dataprocess.py
from mindspore.dataset import vision, transforms
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)dataset = dataset.map(image_transforms, 'image')dataset = dataset.map(label_transform, 'label')dataset = dataset.batch(batch_size)return dataset
self_network.py
# Define model
from mindspore import nnclass 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 logitsdef check_network():model = Network()print(model)
self_modeltrain.py
# Instantiate loss function and optimizer
from mindspore import nnloss_fn = nn.CrossEntropyLoss()
optimizer = nn.SGD(model.trainable_params(), 1e-2)# 1. Define forward function
def forward_fn(data, label):logits = model(data)loss = loss_fn(logits, label)return loss, logits# 2. Get gradient function
grad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)# 3. Define function of one-step training
def train_step(data, label):(loss, _), grads = grad_fn(data, label)optimizer(grads)return lossdef train(model, dataset):size = dataset.get_dataset_size()model.set_train() ## 設置當前Cell和所有子Cell的訓練模式。對于訓練和預測具有不同結構的網絡層(如 BatchNorm),將通過這個屬性區分分支。如果設置為True,則執行訓練分支,否則執行另一個分支。默認Truefor batch, (data, label) in enumerate(dataset.create_tuple_iterator()):loss = train_step(data, label)if batch % 100 == 0:loss, current = loss.asnumpy(), batchprint(f"loss: {loss:>7f} [{current:>3d}/{size:>3d}]")
self_modeltest.py
from mindspore import nn def test(model, dataset, loss_fn):num_batches = dataset.get_dataset_size()model.set_train(False)total, test_loss, correct = 0, 0, 0for 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_batchescorrect /= totalprint(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
self_predict.py
## 加載模型
from self_network import Network# Instantiate a random initialized model
model = Network()# Load checkpoint and load parameter to model
param_dict = mindspore.load_checkpoint("model.ckpt")
param_not_load, _ = mindspore.load_param_into_net(model, param_dict)
print(param_not_load) ## 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