基于MindSpore的图像分类迁移学习

基于MindSpore1.3.0的图像分类迁移学习

本人基于MindSpore1.3.0版本开发图像分类迁移学习(下面是关键步骤的解释说明,具体代码见附件)

导入模块:

import collections
import json
import hashlib
import logging
import os.path
import re
import shutil
import getopt
from datetime import datetime
from PIL import Image
from os.path import getsize, join

import os
import argparse
import random
import numpy as np
import sys, stat

from mindspore import context
from mindspore import Tensor, Parameter
from mindspore import nn
from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits
from mindspore.nn.loss.loss import _Loss
from mindspore.ops import operations as P
from mindspore.ops import functional as F
from mindspore.common import dtype as mstype
from mindspore.train.model import Model
from mindspore.train.serialization import load_checkpoint, load_param_into_net, save_checkpoint, export
import mindspore.dataset.engine as de

from dataset import create_dataset
from mobilenetV2 import MobileNetV2, Head, MobileNetV2Classification

from easydict import EasyDict as ed

from automl import EarlyStopValAcc, BestAccSaver, TrainAccUpdater, ValControl

数据集,自行准备,结构目录如下,imgs是根目录,car/animal/flower/person/plane/ship是第一层目录,在第一层目录下就是具体的jpg或者png图片;

imgs----car

       ----animal

       ----flower

       ----person

       ----plane

       ----ship

定义损失函数:

loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')

opt = nn.Adam(filter(lambda x: x.requires_grad, head.get_parameters()), os.modelinf["learning_rate"])

定义模型:

backbone = MobileNetV2(platform="CPU")
transpose_D2GPU(backbone, os.path.join(os.modelinf["model_dir"], "mobilenetV2.ckpt"))
net = MobileNetV2Classification(backbone, head)

model = Model(head, loss_fn=loss, optimizer=opt)
network = model._train_network
network.set_train()

eval_model = Model(net, loss_fn=loss, metrics= {"acc"})

index_list = list(range(step_size))
if not os.path.exists(config_cpu.save_checkpoint_path):
os.mkdir(config_cpu.save_checkpoint_path)

train_features = np.load(os.path.join(data_path, f"train_feature.npy"))
train_labels = np.load(os.path.join(data_path, f"train_label.npy"))

train_acc_updater = TrainAccUpdater() # 用于更新训练精度计算的统计器
best_acc_saver = BestAccSaver(FLAGS, net)

 

转mindir格式:

input_np = np.random.uniform(0.0, 1.0, size=[1, 3, 224, 224]).astype(np.float32)
net.set_train(mode=False)
export(net, Tensor(input_np), file_name="./mindspore", file_format='MINDIR')
command = r'call modelConvertMindspore\converter_lite.exe --fmk=MINDIR --modelFile=' + './mindspore.mindir' + ' --outputFile=' + './mindspore'
os.system(command)
os.remove(os.path.abspath("./mindspore.mindir"))

保存模型:

if os.path.exists(os.modelinf["mindspore_output_graph"]):
os.chmod(os.modelinf["mindspore_output_graph"], stat.S_IRWXU)
os.remove(os.modelinf["mindspore_output_graph"])
os.chmod('./mindspore.ms', stat.S_IRWXU)

 

<ignore_js_op class="ignore">

 

posted @ 2021-12-30 19:51  MS小白  阅读(121)  评论(0)    收藏  举报