mindspore快速入门跟练——手写数字图片识别
·
和官网的差不多,加了一些自己的理解和整理
导入包
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
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)