转载地址:https://bbs.huaweicloud.com/forum/thread-144350-1-1.html
作者:李响
邮箱:chaojililin@163.com
基于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)