提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
`一个多月前接触国产深度学习框架Mindspore,记录学习过程
实验环境:Python =3.7
MindSpore=1.5
Modelarts使用的是西安雁塔超算中心提供的云平台(鲲鹏(npu)910卡,昇腾910人工智能芯片)
MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端、边缘、云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛。MindSpore在2020年3月开源,MindSpore具有编程简单、端云协同、调试轻松、性能卓越、开源开放等特点,降低了AI开发门槛。
昇思mindspore官网:链接: link
AlexNet是首个应用于图像分类的深层卷积神经网络,网络结构如图
进入MindSpore官网点击安装获取安装命令
图中看到MindSpore只支持linux系统,但实际上也支持windows系统(我前期调试在windows上进行的),但是Mindspore在windows上只支持CPU,不支持GPU,训练不便,此外需要注意的是,MindSpore有些算子是不支持在CPU上运行的, 如AdaptiveAvgPool2D,因此推荐安装linux版本的
安装命令示例:
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.7.0/MindSpore/ascend/aarch64/mindspore_ascend-1.7.0-cp37-cp37m-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
MindSpore(以下简称ms)API支持CRIFA imagenet等数据集的加载,在这里使用CRIFA数据集
CIFAR-10 是用于识别普适物体的小型数据集。一共包含10 个类别的RGB 彩色图片:飞机( airplane )、汽车( automobile )、鸟类( bird )等十种类别
每个图片的尺寸为32 × 32 ,每个类别有6000个图像,数据集中一共有50000 张训练图片和10000 张测试图片。
下载链接:http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz
from mindspore import context //指定运行环境
import mindspore.dataset as ds
import mindspore.dataset.transforms.c_transforms as C
import mindspore.dataset.vision.c_transforms as CV
from mindspore.dataset.vision import Inter
from mindspore import dtype as mstype
通过Creatdata函数对数据进行载入与处理, mindspore.dataset 可以构建数据集对象.。定义数据集的垢需通过map映射
def create_dataset(data_path, batch_size=32, repeat_size=1,
num_parallel_workers=1):
# 定义数据集
cifar_ds = ds.CIFAR10Dataset(data_path)//加载数据集
#数据处理需要的一些参数
resize_height, resize_width = 32, 32
rescale = 1.0 / 255.0
shift = 0.0
rescale_nml = 1 / 0.3081
shift_nml = -1 * 0.1307 / 0.3081
# 定义所需要操作
resize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR)
rescale_nml_op = CV.Rescale(rescale_nml, shift_nml)
rescale_op = CV.Rescale(rescale, shift)
hwc2chw_op = CV.HWC2CHW()
type_cast_op = C.TypeCast(mstype.int32)
# 使用map映射函数,将数据操作应用到数据集 在定义操作后需要map映射
mnist_ds = cifar_ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=num_parallel_workers)
mnist_ds = cifar_ds.map(operations=resize_op, input_columns="image", num_parallel_workers=num_parallel_workers)
mnist_ds = cifar_ds.map(operations=rescale_op, input_columns="image", num_parallel_workers=num_parallel_workers)
mnist_ds = cifar_ds.map(operations=rescale_nml_op, input_columns="image", num_parallel_workers=num_parallel_workers)
mnist_ds = cifar_ds.map(operations=hwc2chw_op, input_columns="image", num_parallel_workers=num_parallel_workers)
# 进行shuffle、batch操作
buffer_size = 10000
cifar_ds = cifar_ds.shuffle(buffer_size=buffer_size)
cifar_ds = cifar_ds.batch(batch_size, drop_remainder=True)
return cifar_ds
#AlexNet
import mindspore.nn as nn
class AlexNet(nn.Cell):
def __init__(self):
super(AlexNet,self).__init__()
self.conv1=nn.Conv2d(3,96,11,stride=4,pad_mode="valid")
self.conv2=nn.Conv2d(96,256,5,pad_mode="same")
self.conv3=nn.Conv2d(256,384,3,pad_mode="same")
self.conv4=nn.Conv2d(384,384,3,pad_mode="same")
self.conv5=nn.Conv2d(384,256,3,pad_mode="same")
self.maxpool_2d=nn.MaxPool2d(kernel_size=3,stride=2)
self.flattem=nn.Flatten()
self.fc1=nn.Dense(6*6*256,4096)
self.fc2=nn.Dense(4096,4096)
self.fc3=nn.Dense(4096,10)
self.relu=nn.ReLU()
def construct(self, x):
x=self.conv1(x)
x=self.relu(x)
x=self.maxpool_2d(x)
x=self.conv2(x)
x=self.relu(x)
x=self.maxpool_2d(x)
x=self.conv3(x)
x=self.relu(x)
x=self.conv4(x)
x=self.relu(x)
x=self.conv5(x)
x=self.relu(x)
x=self.maxpool_2d(x)
x=self.flattem(x)
x=self.fc1(x)
x=self.relu(x)
x=self.fc2(x)
x=self.relu(x)
x=self.fc3(x)
return x
ms使用context来指定运行环境,mindspore特点之一在于它支持静态图和动态图两种模式
context.set_context(mode=context.GRAPH_MODE,device_target="Ascend")
device_target可根据自己的环境改为CPU、GPU、Ascend三种,这里实在华为的生态训练的,选择Ascend
#定义损失函数
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
# 定义优化器
net_opt = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.9)
from mindspore.train.callback import ModelCheckpoint, CheckpointConfig
# 设置模型保存参数
config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10)
# 应用模型保存参数
ckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)
# 导入模型训练需要的库
from mindspore.nn import Accuracy
from mindspore.train.callback import LossMonitor
from mindspore import Model
def train_net(model, epoch_size, data_path, repeat_size, ckpoint_cb, sink_mode):
"""定义训练的方法"""
# 加载训练数据集
ds_train = create_dataset(data_path)
model.train(epoch_size, ds_train, callbacks=[ckpoint_cb, LossMonitor(125)], dataset_sink_mode=sink_mode)
# def test_net(network, model, data_path):
# """定义验证的方法"""
# ds_eval = create_dataset(os.path.join(data_path, "test"))
# acc = model.eval(ds_eval, dataset_sink_mode=False)
# print("{}".format(acc))
train_epoch = 3
mnist_path = data_path
dataset_size = 1
model = Model(net, net_loss, net_opt)
train_net(model, train_epoch, mnist_path, dataset_size, ckpoint, False)
ms提供MindIsight用来计算图、训练过程等的可视化
summary_collector = SummaryCollector(summary_dir='./summary_dir', collect_freq=1)
mindspore和torch很像,算子之间也有差异