在快速入门这一个章节,使用官方提供的算力或者cpu可轻松得进行代码和模型的运作与学习。
由于我是周末开始学习,还没来得及申请算力,就暂时先试用cpu;
关键指令和关键词参数表总结
指令/关键词 | 参数 | 作用 |
---|---|---|
mindspore.dataset | - | 提供数据集加载和处理功能。 |
MnistDataset | path | 加载MNIST数据集。 |
vision.Rescale | rescale | 图像数据归一化,通常用于将像素值缩放到0-1范围。 |
vision.Normalize | mean , std | 对图像数据进行标准化处理,减去均值并除以标准差。 |
vision.HWC2CHW | - | 将图像数据从HWC格式转换为CHW格式。 |
transforms.TypeCast | type | 将数据类型转换为指定类型。 |
nn.Cell | - | 所有网络层的基类,用于构建自定义神经网络。 |
nn.Flatten | - | 将多维输入展平为二维。 |
nn.SequentialCell | *layers | 顺序容器,按顺序将层传递给输入。 |
nn.Dense | in_channels , out_channels , has_bias | 全连接层,具有输入通道数和输出通道数。 |
nn.ReLU | - | 激活函数,应用Rectified Linear Unit (ReLU) 非线性变换。 |
nn.CrossEntropyLoss | - | 计算交叉熵损失,用于分类任务。 |
nn.SGD | params , learning_rate | 随机梯度下降优化器,更新模型参数。 |
mindspore.value_and_grad | fn , grad_position , params , has_aux | 获取函数值和梯度,用于反向传播。 |
mindspore.save_checkpoint | network , ckpt_file_name | 保存模型参数到指定文件。 |
mindspore.load_checkpoint | ckpt_file_name | 从指定文件加载模型参数。 |
mindspore.load_param_into_net | network , param_dict | 将加载的参数字典导入网络模型。 |
1. 基本设置
首先,导入必要的库。
当然如果在自己电脑上运作,又不是使用现成的实验环境,则需要先布置实验环境;
pip install download
%%capture captured_output
# 实验环境已经预装了mindspore==2.3.0rc1,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
%%capture captured_output
# 实验环境已经预装了mindspore==2.3.0rc1,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset
import time
print(time.strftime('%Y-%m-%d %H:%M:%S'),time.localtime(time.time()),'AuraraChen')
2. 数据集处理
下载并准备MNIST数据集:
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)
train_dataset = MnistDataset('MNIST_Data/train') # path: 数据集路径
test_dataset = MnistDataset('MNIST_Data/test')
小结
MnistDataset
:用于加载MNIST数据集。
3. 数据预处理
对数据进行标准化和批处理:
def datapipe(dataset, batch_size):
image_transforms = [
vision.Rescale(1.0 / 255.0, 0), # rescale: 将像素值缩放到0-1范围
vision.Normalize(mean=(0.1307,), std=(0.3081,)), # mean, std: 用于标准化的均值和标准差
vision.HWC2CHW() # 将图像从HWC格式转换为CHW格式
]
label_transform = transforms.TypeCast(mindspore.int32) # type: 转换标签数据类型为int32
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)
小结
vision.Rescale
:归一化图像数据。vision.Normalize
:标准化图像数据。transforms.TypeCast
:转换数据类型。
4. 构建模型
定义一个简单的神经网络:
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten() # 将输入展平
self.dense_relu_sequential = nn.SequentialCell( # 顺序容器,包含多个层
nn.Dense(28*28, 512), # 全连接层,输入通道数为28*28,输出通道数为512
nn.ReLU(), # ReLU激活函数
nn.Dense(512, 512), # 全连接层,输入通道数为512,输出通道数为512
nn.ReLU(), # ReLU激活函数
nn.Dense(512, 10) # 全连接层,输入通道数为512,输出通道数为10
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
小结
nn.Flatten
:将多维输入展平。nn.SequentialCell
:顺序容器,用于按顺序传递输入。nn.Dense
:全连接层。nn.ReLU
:激活函数。
5. 模型训练
定义损失函数和优化器,并编写训练和测试函数:
loss_fn = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = nn.SGD(model.trainable_params(), 1e-2) # 随机梯度下降优化器
def train_step(data, label):
(loss, _), grads = mindspore.value_and_grad(lambda x, y: (loss_fn(model(x), y), None), None, optimizer.parameters)(data, label)
optimizer(grads)
return loss
def train(model, dataset, epochs=3):
model.set_train() # 设置模型为训练模式
for epoch in range(epochs):
for data, label in dataset.create_tuple_iterator():
loss = train_step(data, label)
print(f"Epoch {epoch+1}, Loss: {loss.asnumpy()}")
def test(model, dataset):
model.set_train(False) # 设置模型为评估模式
correct = 0
total = 0
for data, label in dataset.create_tuple_iterator():
outputs = model(data)
predicted = outputs.argmax(axis=1)
total += label.size
correct += (predicted == label).asnumpy().sum()
print(f"Accuracy: {100 * correct / total}%")
小结
nn.CrossEntropyLoss
:计算分类任务的交叉熵损失。nn.SGD
:随机梯度下降优化器。mindspore.value_and_grad
:计算函数值和梯度,用于反向传播。
训练和测试模型:
train(model, train_dataset)
test(model, test_dataset)
6. 保存与加载模型
保存训练好的模型参数:
mindspore.save_checkpoint(model, "model.ckpt")
加载模型参数并进行推理:
model = Network()
param_dict = mindspore.load_checkpoint("model.ckpt")
mindspore.load_param_into_net(model, param_dict)
model.set_train(False)
for data, label in test_dataset.create_tuple_iterator():
pred = model(data)
predicted = pred.argmax(axis=1)
print(f'Predicted: {predicted[:10]}, Actual: {label[:10]}')
break
小结
mindspore.save_checkpoint
:保存模型参数。mindspore.load_checkpoint
:加载模型参数。mindspore.load_param_into_net
:将参数加载到模型中。
通过以上步骤,初步学习和体验MindSpore进行深度学习模型的开发、训练和推理。这些代码段展示的是MindSpore的基本功能。通过后期学习可以进一步在此基础上进行增添和修改。