基于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">