• [应用实践] 【课程作业经验】VQA-Baseline 基于MindSpore实现
    视觉问答(Visual Question Answering, VQA)需要机器理解图片内容,并根据文本形式的问题回答出正确的答案,是多模态融合领域的经典问题。其难点在于如何将文本信息和图片信息进行融合,并得到正确的答案。VQA和其他CV任务的区别是,它回答的问题直到run time才确定,因此它更接近general image understanding。VQA比image caption更复杂,因为它往往需要图像以外的信息。另外VQA的答案往往更简短,因此也更容易和ground truth比较。VQA的难点在于图像是高维信息,缺少语法规则和结构,也不能直接使用句法分析、正则表达式等NLP方法。此外,图像捕捉到的信息更接近现实世界,而语言本身就是一种抽象。VQA: Visual Question Answering (ICCV 2015) 中提出的Baseline方法,分别采用CNN和RNN提取图像和问题的特征,再将视觉模态和文本模态的特征进行元素积,得到最终特征,经过soft_max层后分类得到正确答案。我们在baseline方法上进行了一些改进,将提取文本和图像信息部分换成了经过预训练的clip-as-service (https://clip-as-service.jina.ai/) ,提高特征提取效果。在本任务中,我们使用VQAv2.0数据集的子集进行训练与测试,整体工作包括:数据处理、模型构建、训练与测试。在数据处理中,我们从网站下载数据集,提取train、val、test三部分的image、question、annotation,并将它们进行一一对应,保存在mindrecord中。在模型构建中,我们构建了简单的embedding模型、Clip预训练模型对image和question进行嵌入,并进行了点乘、MFB模型、attention机制等多种方式处理嵌入向量,得到输出。在训练与测试中,我们进行了10个epoch的训练,并调整了超参数如learning_rate、dropout率等以获得最佳效果。最后,我们记录了准确率以对比实验效果。模型实现在baseline模型中(如下图所示),我们选用Clip预训练模型来生成图片的嵌入向量和问题的嵌入向量,然后将二者通过一个全连接层进行映射,之后将两个嵌入向量进行点积操作,并通过两个全连接层进行输出:算法如下:利用clip预处理模型做图像嵌入和问题句嵌入,得到两个嵌入向量img_emb和ques_emb。将img_emb和ques_emb经过Fully-Connected层和relu激活后得到两个向量:img_out = relu(nn.Dense(img_emb), ques_out = relu(nn.Dense(ques_emb)将img_out和ques_emb做点乘操作,并经过两层全连接层进行输出:output = nn.Dense(nn.Dense(img_out * ques_emb)。利用Soft_max交叉熵计算损失。在VQA_baseline中用到的函数说明如下:nn.dense(): 这是Mindspore 支持的全连接层API。其接受的两个参数分别是输入向量的维度和输出向量的维度。nn.dropout():这是Mindspore支持的随机丢弃层API。随机丢弃是一种正则化手段,该算子根据丢弃概率 1−keep_prob1−keep_prob ,在训练过程中随机将一些神经元输出设置为0,通过阻止神经元节点间的相关性来减少过拟合,在推理过程中,此层返回与 输入维度 相同的Tensor。nn.Soft_max():这是Mindspore支持的激活函数API。它是二分类函数 mindspore.nn.Sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。对输入Tensor在轴 axis 上的元素计算其指数函数值,然后归一化到[0, 1]范围,总和为1。nn.ReLU():这是Mindspore支持的修正线性单元激活函数API。逐元素求max(x, 0) 。特别说明,负数输出值会被修改为0,正数输出不受影响。nn.Soft_maxCrossEntrophyWithLogits:这是Mindspore支持的损失函数API。用于计算预测值与真实值之间的交叉熵。使用交叉熵损失函数计算出输入概率(使用soft_max函数计算)和真实值之间的误差。对于每个实例 xi ,i的范围为0到N-1,则可得损失为:其中xi是一维的Tensor,cc为one-hot中等于1的位置。项目地址:cid:link_0
  • [执行问题] 动态图转静态图出现错误
    动态图推理正常运行,切换成静态图运行不了
  • [分布式] 并行transformer.MoEConfig使用
    1. 在GPU版本使用使用transformer.MoEConfig的时候,发现一个问题 ^[[1m    jit_config_dict=self._jit_config_dict)^[[0m _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  self =  obj = TrainOneStepCell<   (network): TransformerNet<     (transformer): Transformer<       (encoder): TransformerEncoder<   ...ter<>                 >               >             >           >         >       >     >   (optimizer): Momentum<>   > phase = 'train.1660877120488711936.140511763874256.0', do_convert = True auto_parallel_mode = True, jit_config_dict = {}  ^[[1m    def compile(self, obj, *args, phase='predict', do_convert=True, auto_parallel_mode=False, jit_config_dict=None):^[[0m ^[[1m        """^[[0m ^[[1m        Compiles graph.^[[0m ^[[1m    ^[[0m ^[[1m        Args:^[[0m ^[[1m            obj (Function/Cell): The function or cell instance need compile.^[[0m ^[[1m            args (tuple): Function or cell input arguments.^[[0m ^[[1m            phase (str): The name of compile phase. Default: 'predict'.^[[0m ^[[1m            do_convert (bool): When set to True, convert ME graph to GE graph after compiling graph.^[[0m ^[[1m            auto_parallel_mode: When set to True, use auto parallel mode to compile graph.^[[0m ^[[1m            jit_config_dict (dict): Jit config for compile. Default: None.^[[0m ^[[1m    ^[[0m ^[[1m        Return:^[[0m ^[[1m            Str, the full phase of the cell.^[[0m ^[[1m            Bool, if the graph has been compiled before, return False, else return True.^[[0m ^[[1m        """^[[0m ^[[1m        obj.__parse_method__ = 'construct'^[[0m ^[[1m        if not hasattr(obj, obj.__parse_method__):^[[0m ^[[1m            raise AttributeError(^[[0m ^[[1m                'The class {} dose not have method {}'.format(obj.__class__.__name__, obj.__parse_method__))^[[0m ^[[1m        args_list = args^[[0m ^[[1m    ^[[0m ^[[1m        self.enable_tuple_broaden = False^[[0m ^[[1m        if hasattr(obj, "enable_tuple_broaden"):^[[0m ^[[1m            self.enable_tuple_broaden = obj.enable_tuple_broaden^[[0m ^[[1m    ^[[0m ^[[1m        self._graph_executor.set_enable_tuple_broaden(self.enable_tuple_broaden)^[[0m ^[[1m        key = self._graph_executor.generate_arguments_key(args_list, self.enable_tuple_broaden)^[[0m ^[[1m        obj.arguments_key = str(key)^[[0m ^[[1m        phase = phase + '.' + str(obj.create_time) + '.' + str(id(obj)) + '.' + obj.arguments_key^[[0m ^[[1m    ^[[0m ^[[1m        if phase in obj.compile_cache and self.has_compiled(phase):^[[0m ^[[1m            logger.debug("%r graph has existed.", phase)^[[0m ^[[1m            return phase, False^[[0m ^[[1m    ^[[0m ^[[1m        obj.check_names()^[[0m ^[[1m        _check_full_batch()^[[0m ^[[1m        self._set_dataset_mode(args_list)^[[0m ^[[1m        self._set_compile_cache_dep_files(phase)^[[0m ^[[1m    ^[[0m ^[[1m        enable_ge = context.get_context("enable_ge")^[[0m ^[[1m        self._graph_executor.set_weights_values(obj.parameters_dict())^[[0m ^[[1m        if jit_config_dict:^[[0m ^[[1m            self._graph_executor.set_jit_config(jit_config_dict)^[[0m ^[[1m>       result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())^[[0m ^[[1m^[[31mE       ValueError: For 'BatchMatMul' on cpu/gpu, input 'x' must have the same size as input 'y'. But got 'x' size: 4'y' size: 3.^[[0m ^[[1m^[[31mE       ^[[0m ^[[1m^[[31mE       ----------------------------------------------------^[[0m ^[[1m^[[31mE       - The Traceback of Net Construct Code:^[[0m 2. 查看资料发现,1.6版本的时候是支持GPU的,但是1.6之后是不支持的,估计以前是假象支持了GPUcid:link_0cid:link_1目前的版本只能支持ascend,至于什么时候支持CPU,就不知道了代码:    moe_config = MoEConfig(expert_num=2, capacity_factor=1.0, aux_loss_factor=0.06,                            num_experts_chosen=1) config = TransformerOpParallelConfig(data_parallel=2, model_parallel=1, expert_parallel=2)
  • [活动体验] 线上经验分享会,MindSpore送福利
    干货链接:cid:link_0案例点评:1. 在看mindspore数据处理的时候看到自定义数据集,就想能不能导入随意的图片数据,但是里面只有自己随机产生数据,并没有自定义图片之类的导入说明,搜索干货后发现了一篇差不多的文章cid:link_1但是作者也没有解决方法,不过评论里面的yph给了个链接,里面就是写了导入txt文件的方法的链接https://gitee.com/mindspore/models/blob/master/official/cv/resnext/src/dataset.py根据链接,操作了一把test2.py:from test import classification_dataset# path to imagefolder directory. This directory needs to contain sub-directories which contain the imagesdata_dir = "/home/wys/code/image/"de_dataset = classification_dataset(data_dir, image_size=[224, 244],per_batch_size=64, max_epoch=100,rank=0, group_size=4)print("jojo", de_dataset.get_dataset_size())test.py:import osfrom PIL import Image, ImageFilefrom mindspore.common import dtype as mstypeimport mindspore.dataset as deimport mindspore.dataset.transforms as Cimport mindspore.dataset.vision as V_CImageFile.LOAD_TRUNCATED_IMAGES = Trueclass TxtDataset():"""create txt dataset.Args:Returns:de_dataset."""def __init__(self, root, txt_name):super(TxtDataset, self).__init__()self.imgs = []self.labels = []fin = open(txt_name, "r")for line in fin:img_name, label = line.strip().split(' ')self.imgs.append(os.path.join(root, img_name))self.labels.append(int(label))fin.close()def __getitem__(self, index):img = Image.open(self.imgs[index]).convert('RGB')return img, self.labels[index]def __len__(self):return len(self.imgs)def classification_dataset(data_dir, image_size, per_batch_size, max_epoch, rank, group_size,mode='train',input_mode='folder',root='',num_parallel_workers=None,shuffle=None,sampler=None,class_indexing=None,drop_remainder=True,transform=None,target_transform=None):mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]std = [0.229 * 255, 0.224 * 255, 0.225 * 255]if transform is None:if mode == 'train':transform_img = [V_C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)),V_C.RandomHorizontalFlip(prob=0.5),V_C.RandomColorAdjust(brightness=0.4, contrast=0.4, saturation=0.4),V_C.Normalize(mean=mean, std=std),V_C.HWC2CHW()]else:transform_img = [V_C.Decode(),V_C.Resize((256, 256)),V_C.CenterCrop(image_size),V_C.Normalize(mean=mean, std=std),V_C.HWC2CHW()]else:transform_img = transformif target_transform is None:transform_label = [C.TypeCast(mstype.int32)]else:transform_label = target_transformif input_mode == 'folder':de_dataset = de.ImageFolderDataset(data_dir, num_parallel_workers=num_parallel_workers,shuffle=shuffle, sampler=sampler, class_indexing=class_indexing,num_shards=group_size, shard_id=rank)de_dataset = de_dataset.map(operations=transform_img, input_columns="image",num_parallel_workers=num_parallel_workers)de_dataset = de_dataset.map(operations=transform_label, input_columns="label",num_parallel_workers=num_parallel_workers)columns_to_project = ["image", "label"]de_dataset = de_dataset.project(columns=columns_to_project)de_dataset = de_dataset.batch(per_batch_size, drop_remainder=drop_remainder)de_dataset = de_dataset.repeat(max_epoch)return de_dataset虽然导入是成功了,但是打印数据的时候,却显示数据条数为0,也不知道为什么,而且这个干活下面也并没有其他说明,只能说这条干活只能解答我的一半问题INFO] MD(174743,ffffa8641010,python):2022-08-19-16:13:16.288.957 [mindspore/ccsrc/minddata/dataset/util/intrp_service.cc:52] Register] Register resource with name 18t7rlplh1rk5ead0rcjdpz4cwnqxk5rz7rw. Thread ID 281473506873360.[INFO] MD(174743,ffff029851e0,python):2022-08-19-16:13:16.289.210 [mindspore/ccsrc/minddata/dataset/util/intrp_service.cc:52] Register] Register resource with name 281470725280224. Thread ID 281470725280224.[INFO] MD(174743,ffffa8641010,python):2022-08-19-16:13:16.289.580 [mindspore/ccsrc/minddata/dataset/engine/python_runtime_context.cc:22] Terminate] Terminating a Dataset PythonRuntime.jojo 0[INFO] PIPELINE(174743,ffffa8641010,python):2022-08-19-16:13:16.289.789 [mindspore/ccsrc/pipeline/jit/init.cc:378] operator()] Start releasing dataset handles...[INFO] PIPELINE(174743,ffffa8641010,python):2022-08-19-16:13:16.289.835 [mindspore/ccsrc/pipeline/jit/init.cc:381] operator()] End release dataset handles.[INFO] PIPELINE(174743,ffffa8641010,python):2022-08-19-16:13:16.289.851 [mindspore/ccsrc/pipeline/jit/pipeline.cc:1882] FinalizeCluster] Start finalize the cluster instance.[INFO] PIPELINE(174743,ffffa8641010,python):2022-08-19-16:13:16.289.864 [mindspore/ccsrc/pipeline/jit/pipeline.cc:1889] FinalizeCluster] End finalize the cluster instance.[EVENT] IDEDH(174743,python):2022-08-19-16:13:17.098.330 [adx_server_manager.cpp:27][tid:174743]>>> start to deconstruct adx server manager邮箱:497776945@qq.com
  • [其他问题] 使用ModelArts训练找不到输出结果
    1.我是用mindspore训练生成ckpt文件,然后想转换为AIR格式放在开发板上推理2.因为本地没有Ascend910所以选择modelarts进行模型转换3.在modelarts中已经运行完成但是找不到输出的AIR模型就是找不到输出的模型 ,请各位大佬帮助,比较急
  • [分布式并行] 【MindSpore易点通】如何将MindSpore单机单卡代码拓展为分布式代码
    本文介绍如何将MindSpore单机单卡代码拓展为分布式代码,并在Ascend芯片上实现单机多卡训练。一、配置运行信息和并行模式在训练代码中添加如下接口,分别配置运行信息和并行模式,并依次调用。1.get_rank:获取当前设备在集群中的ID;2.get_group_size:获取集群总数;3.context.set_context:配置当前执行环境;4.init:使能分布式通信,并完成相关初始化操作;5.context.set_auto_parallel_context:设置自动并行模式,该用例使用数据并行模式。import osimport argparsefrom mindspore import contextfrom mindspore.context import ParallelModefrom mindspore.communication.management import init, get_rank, get_group_sizedef network_init(argvs):    devid = int(os.getenv('DEVICE_ID', '0'))    context.set_context(mode=context.GRAPH_MODE,enable_auto_mixed_precision=True, device_target=argvs.device_target,save_graphs=False, device_id=devid)    # Init distributed    if argvs.is_distributed:        if argvs.device_target == "Ascend":            init()        else:            init("nccl")        argvs.rank = get_rank()        argvs.group_size = get_group_size()def parallel_init(argv):    context.reset_auto_parallel_context()    parallel_mode = ParallelMode.STAND_ALONE    degree = 1    if argv.is_distributed:        parallel_mode = ParallelMode.DATA_PARALLEL        degree = get_group_size()   context.set_auto_parallel_context(parallel_mode=parallel_mode,gradients_mean=True, device_num=degree, parameter_broadcast=True)if __name__ == "__main__":    parser = argparse.ArgumentParser(description='MindSpore CIFAR-10 Example')    parser.add_argument('--device_target', type=str, default="Ascend",choices=['Ascend', 'GPU', 'CPU'],help='device where the code will be implemented (default: CPU)')    parser.add_argument('--is_distributed', type=int, default=1,help='Distribute train or not, 1 for yes, 0 for no. Default: 1')    parser.add_argument('--rank', type=int, default=0,help='Local rank of distributed. Default: 0')    parser.add_argument('--group_size', type=int, default=1,help='World size of device. Default: 1')    parser.add_argument('--pre_trained', type=str, default=None,help='Pretrained checkpoint path')    args = parser.parse_args()    network_init(args)    parallel_init(args)二、卡间初始化权重保持一致卡间权重不一致,将为训练带来极大的阻碍,为使集群中每张Ascend芯片上模型的初始化权重保持一致,可以通过以下两种方式进行设置:1.固定随机种子在脚本开头添加如下代码:import mindsporemindspore.set_seed(0)2.广播参数在context.set_auto_parallel_context接口中设置parameter_broadcast=True,即训练开始前自动广播0号卡上数据并行的参数权值到其他卡上,默认值为Falsecontext.set_auto_parallel_context(parallel_mode=parallel_mode,gradients_mean=True, device_num=degree, parameter_broadcast=True)三、数据并行模式加载数据集与单机不同,加载训练数据时,数据集接口中需要传入num_shards和shard_id参数,分别对应卡的数量和逻辑序号。通过配置运行信息和并行模式中的get_group_size和get_rank获取。if do_train:     cifar_ds = ds.Cifar10Dataset(dataset_dir=data_home, shuffle=True,num_shards=device_num, shard_id=rank, usage='train')else:     cifar_ds = ds.Cifar10Dataset(dataset_dir=data_home,shuffle=False, usage='test')四、运行脚本目前MindSpore分布式执行采用单卡单进程运行方式,即每张卡上运行1个进程,进程数量与使用的卡的数量一致。其中,0卡在前台执行,其他卡放在后台执行。用来保存日志信息以及算子编译信息。下面以使用8张卡的分布式训练脚本为例,演示如何运行脚本:export RANK_SIZE=8current_exec_path=$(pwd)echo ${current_exec_path}echo 'start training'for((i=0;i<=$RANK_SIZE-1;i++));do    echo 'start rank '$i    mkdir ${current_exec_path}/device$i    cd ${current_exec_path}/device$i    export RANK_ID=$i    dev=`expr $i`    export DEVICE_ID=$dev    python ../MindSpore_8P.py         --device_target='Ascend'         --is_distributed=1 > train.log  2>&1 &done启动shell脚本进行分布式训练(8卡):sh run_distribute.sh启动shell脚本后,将在后台运行分布训练, 执行tail -f device0/train.log 命令,可查看实时运行结果。如下图所示:
  • [其他问题] 静态图模式下如何实现获取网络中间层的输出
    pytorch/动态图下,如下代码运行正常,但是换到静态图模式下会报错,静态图下该如何实现遍历网络层并提取中间特定某几层的输出?layers_of_interest = [5, 10, 15, 20] result = [] for i, layer in enumerate(self.layers): x = layer(x) if i in layers_of_interest: result.append(x) return result
  • [执行问题] 【MindSpore】【分布式并行】裸机分布式推理device报import错误
    物理环境为一台裸机,8张Ascend 910卡,MindSpore 1.7,并行模式是半自动并行。任务启动后,查看各device中训练日志发现报错:然而在本机上执行python中import pcl_pangu.context并未出错,怀疑是各个device上环境变量设置出错,查看env0.log如下:可以看到python路径和相关库的路径都在其中,在本环境下执行MindSpore分布式训练样例pytest成功,但执行python就会出现此情况。为什么会出现这种情况?附上执行脚本截图:代码部分截图:
  • [算子编译] 内存对算子的影响(图算融合)
    、以上图为例如果不开启图算融合,就是图(a),计算完Mul之后,Mul的输出是储存在哪里?是AICORE的外面吗?然后Add再从AICORE外面读取数据?如果开启图算融合,就变成图(b),意思是说Add可以直接从AICORE里读取Mul输出的数据吗?不用在外部读入吗?
  • [算子编译] PRLu算子UT测试问题,
    报错:测试报告:cid:link_0测试代码:from op_test_frame.ut import OpUT from mindspore import nn # [TODO] change op_func_name here ut_case = OpUT("PReLU", "impl.p_re_lu_impl", "p_re_lu_impl") def calc_expect_func(x, y, weight): res = nn.PReLU(x.get("value"),weight.get("value")) return [res, ] ut_case.add_precision_case("all", { "params": [ {"dtype": "float16", "format": "NCHW", "ori_format": "NCHW", "ori_shape": (1,1,1), "shape": (1,1,1), "param_type": "input"}, {"dtype": "float16", "format": "NCHW", "ori_format": "NCHW", "ori_shape": (1,1), "shape": (1,1), "param_type": "input"}, {"dtype": "float16", "format": "NCHW", "ori_format": "NCHW", "ori_shape": (1,1,1), "shape": (1,1,1), "param_type": "output"}, ], "calc_expect_func": calc_expect_func })参考文档:OpUT-UT测试接口参考-其他功能及操作-自定义算子开发-用户指南-5.0.RC2-MindStudio-文档首页-昇腾社区 (hiascend.com)MindSporeweight只可以是向量,长度与输入x的通道数C相同。在GPU设备上,当输入为标量时,shape为1。这里weight的长度与输入x的通道数C相同指的是shape吗?测试里面输入x与权重参数w的shape或者其他条件有什么约束吗?开发方式:dsl,框架:mindspore
  • [应用实践] 【课程作业经验】基于MindSpore框架和U-Net网络的遥感图像语义分割方法的研究
    基于MindSpore框架和U-Net网络的遥感图像语义分割方法的研究本人使用mindspore深度学习框架完成了本科毕业设计课题任务,写一些分享心得,本次实验我们采用mindspore进行数据集及其预处理本文采用ISPRS的Vaihingen数据集和Potsdam数据集完成实验,两者都超高分辨率的遥感图像,为了方便训练和测试,将图片分割为512 * 512的彩色RGB图片 MAResUNet语义分割模型该模型具体算法原理请参考"Li R, Zheng S, Duan C, et al. Multistage attention ResU-Net for semantic segmentation of fine-resolution remote sensing images[J]. IEEE Geoscience and Remote Sensing Letters, 2021, 19: 1-5."模型训练本人使用TrainOneStepCell等中低阶接口自定义训练过程。在训练过程中,训练轮次数设置为100轮,并在每轮训练之后对网络进行一次验证,如果验证结果高于训练过程中最高精度,则保存模型,以确保训练结束后得到的是最优的权重文件。训练的Loss曲线如下图所示 模型测试本文测试的指标包括mIou,mF1和OA.关于模型及其训练测试的完整代码请参考https://gitee.com/wang-yujie2/wang-yujie2实验结果backbone采用ResNet50在Potsdam数据集上的结果如下表所示地面建筑物树木低矮植被汽车背景mIoU/mF1/OAIoU78.75%88.22%69.13%70.22%80.65%53.37%73.39%F188.11%93.74%81.75%82.51%89.29%69.60%84.17%Acc88.78%94.49%79.81%84.08%87.35%64.28%83.13%
  • [应用实践] 【课程作业经验】基于Mindspore框架和深度哈希的无人机遥感图像检索
    概述本文研究的主要内容主要是针对大规模图像检索问题,提出基于深度哈希的机器学习算法,实现快速高效的图像检索。同时,针对单标签下细粒度相似性缺失的问题,引入多标签下的相似性度量,关注图像对之间细粒度层面的相似情况,提高检索的精度。并且,将设计的算法在华为公司开发的MindSpore框架中实现,应用到无人机遥感图像的检索任务中去。整体的技术路线如图1所示。图1 技术路线项目地址cid:link_1相关配置操作系统Ubuntu Server 18.04 64bitCUDA10.1环境MindSpore-gpu 1.5.1语言Python 3.7MLRSNet数据集本文使用的数据集为公开的多标签数据集MLRSNet,它包含109161个高分辨率遥感图像,这些图像被注释为46个类别,并且该类别中的样本图像数量从1500到3000不等。但是由于使用的服务器等条件限制,最终实验时选取了部分数据进行试验,标签数目不变。图像的固定大小为256×256具有各种像素分辨率的像素。此外,数据集中的每个图像都标记有60个预定义的类别标签中的几个,并且与每个图像相关联的标签的数量从1到13不等,下表中列出了与每个预定义标签关联的数据集中存在的图像数量。图2 MLRSNet数据集数据集下载地址:cid:link_0实现流程记录1.工作流程基于图像检索问题的框架,下图3展示了用于监督哈希码学习的深度哈希网络的流程图。该方法以成对图像标签形式接受输入图像的标签和相似性度量,并通过卷积神经网络来提取图像的高级特征和输出哈希编码。使用的卷积神经网络使用多个卷积池化层来执行图像提取,全连接层来近似最优降维表示,哈希层来生成q位哈希码。在该模型中,引入了一种交叉熵损失和均方误差损失结合在一起的成对相似度损失来保持相似学习,以保持细粒度的成对相似度,并采用一个量化损失对紧凑哈希编码施加约束。图3 基于多标签的软成对相似性的深度哈希图像检索框架2.图像哈希码相似性度量多标签图像检索在一定程度上能够关注到图像对之间细粒度层面上的相似性,返回更为相似的图像。因此,在深度哈希算法的基础上,本文引入了新的相似度定义方法——“软相似性度量”与“硬相似性度量”,“硬相似性”相当于单标签场景,表示完全相似或者完全不相似;“软相似性”用于关注细粒度层面的相似性,定义为连续的实值,数值越大则相似性越低。本文中,成对相似度被量化成百分比,用以表示“软相似性度量”,相似度值定义为成对标签向量的余弦距离,计算公式如下。3.损失函数为了高效的近邻搜索,需要在汉明空间中保持原始图像的语义相似度。针对“软相似性度量”与“硬相似性度量”的不同情况,分别使用两种不同的损失函数,并在最后加上正则项,进行两者的联合学习。4.实验结果
  • [算子编译] mindspore.ops.Depend算子是否对内存操作
    cid:link_0a = A(x) ---> a = A(x) b = B(y) ---> y = Depend(y, a) ---> b = B(y)假设是上面这种情况,执行了y = Depend(y, a)后,y(就是B的输入数据)会不会被搬运到AICORE中?还是说到b = B(y)这一步再搬运?
  • [基础知识] 昇思MindSpore实践和使用方法课程视频汇总
    想要在深度学习中进行实战,保姆级课程汇总来啦!实战也能如此的丝滑~还在持续更新中哦,更多内容敬请期待!MindSpore简介与在ModelArts实操基于MindSpore的NLP模型开发、迁移与调试MindSpore基础网络构建及CV类网络迁移调试非常欢迎大家下载并体验MindSpore,参与到MindSpore开源社区建设中来。Gitee:cid:link_3GitHub:cid:link_2论坛:cid:link_1
  • [应用实践] 【课程作业经验】基于MindSpore框架的室内场景图像分割方法研究
    基于MindSpore框架的室内场景图像分割方法研究概述本文以华为最新国产深度学习框架Mindspore为基础,研究室内场景语义分割方法。本文基于注意力机制改进U-Net网络,并选取VGG16与ResNet50作为骨干网络,并且利用VGG16与ResNet50的预训练权重进行迁移学习。整体的技术路线如图1所示。 图1(技术路线图)项目地址cid:link_1相关配置名称配置信息NPUAscend910操作系统Ubuntu 20.04编译器Python3.7框架MindSpore1.6NYU-V2数据集本文利用公开数据集NYU-V2作为实验数据集,选取该数据集被标注的RGB图片用于训练和测试。作为常用的语义分割数据集,NYU-V2面向各种类型任务,选取的数据是由微软的 RGB摄像机记录的各种室内场景图片组成,其中共有464个不同的室内场景、1449张图片、894个类别标签。由于在NYU-V2数据集中,接近70%的数据集标签由前10类标签组成,所以本文选取该数据集室内场景的主要语义类别:墙壁(wall)、地板(floor)、橱柜(cabinet)、床(bed)、椅子(chair)、沙发(sofa)、桌子(table)、门(door)、窗户(window)、书柜(bookshelf)作为训练分割的语义类别,NYU-V2数据集中其他类别归为背景(background)类数据集下载地址:NYU Depth V2 « Nathan SilbermanNYU Depth V2 « Nathan Silberman实现流程记录1、基于U-Net网络实现室内场景语义分割模型U-Net是由Ronneberger 等人在2015年构建的一种完全对称的U型结构神经网络。参考华为官方gitee仓库的modelzoo克隆至本地,找到research/cv/unet目录,在此代码基础上进行修改。在原有U-Net模型的基础上,本文将输入图片的大小统一归为512×512,便于网络的卷积计算。本文实现的U-Net网络结构如图2所示。2、模型权重文件转换MindSpore采用ModelCheckpoint对象保存模型参数到CheckPoint文件(简称ckpt文件),由于MindSpore目前没有VGG16和ResNet50的相关预训练模型,导致本文在迁移学习的过程中无法直接使用MindSpore官方提供的预训练权重。PyTorch上采用pth文件保存模型参数且与MindSpore在保存模型参数的机制上不同,无法直接采用PyTorch上的预训练权重加载到MindSpore中。本文在查阅了MindSpore与PyTorch相关文档后,成功编写了将pth模型文件转换为ckpt模型文件的脚本。经过实际训练发现该脚本切实有效的解决了MindSpore中预训练模型缺失的问题。3、优化器的选择优化器运用在神经网络的反向传播中,通过引导损失函数的参数向正确的方向更新适当的大小,使得损失函数的值能够到达全局最优。其中最为重要的两个部分是优化方向和步长。本文选取Adam作为模型训练的优化器,Adam是SGD、AdsGrad等优化器的集大成者,能够有效控制学习率步长和梯度方向。本文由于运用到了迁移学习故将整个训练分为两个阶段。第一阶段冻结骨干网络预训练权重,将主要资源运用在扩张路径上,从而缩短训练时间,节约训练资源。第二阶段解冻骨干网络的参数,让网络中的所有参数参与训练。通过冻结训练后再解冻可以加快训练效率同时防止骨干网络的参数权值被破坏,从而获得更好的训练效果。结果展示图像的预测结果示例定量结果比较