MindSpore(一)训练AlexNet图像分类网络

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

mindspore训练AlexNet分类网络:

  • 实验环境
  • 一、昇思MindSpore是什么
  • 二、AlexNet神经网络
  • 二、准备工作
    • 安装Mindspore
    • 数据准备
    • 代码
      • 导入相关库
      • 载入数据与数据处理
      • 搭建AlexNet网络
      • 指定运行环境
      • 创建训练脚本
      • 结果可视化
  • 总结


实验环境

`一个多月前接触国产深度学习框架Mindspore,记录学习过程
实验环境:Python =3.7
MindSpore=1.5
Modelarts使用的是西安雁塔超算中心提供的云平台(鲲鹏(npu)910卡,昇腾910人工智能芯片)

一、昇思MindSpore是什么

MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端、边缘、云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛。MindSpore在2020年3月开源,MindSpore具有编程简单、端云协同、调试轻松、性能卓越、开源开放等特点,降低了AI开发门槛。
昇思mindspore官网:链接: link

二、AlexNet神经网络

AlexNet是首个应用于图像分类的深层卷积神经网络,网络结构如图
MindSpore(一)训练AlexNet图像分类网络_第1张图片

二、准备工作

安装Mindspore

进入MindSpore官网点击安装获取安装命令
MindSpore(一)训练AlexNet图像分类网络_第2张图片
图中看到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数据集
MindSpore(一)训练AlexNet图像分类网络_第3张图片
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网络

#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(一)训练AlexNet图像分类网络_第4张图片

总结

mindspore和torch很像,算子之间也有差异

你可能感兴趣的:(分类,网络,深度学习)