• [技术干货] 迁移学习
    迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。
  • [活动体验] MindSpore学习笔记9———图像处理(image processing)之图像分类迁移学习
    在实际场景中,为了减少从头开始训练所带来的时间成本,大多数情况下会基于已有的模型来进行迁移学习。本章将会以狗和狼的图像分类为例,讲解如何在MindSpore中加载预训练模型,并通过固定权重来实现迁移学习的目的。首先准备环节要做好。要导入模块,代码如下:import osimport mathimport statimport numpy as npimport matplotlib.pyplot as pltimport mindspore.ops as opsimport mindspore.nn as nnimport mindspore.dataset as dsimport mindspore.dataset.vision.c_transforms as CVimport mindspore.dataset.transforms.c_transforms as Cfrom mindspore.dataset.vision import Interfrom mindspore.common.initializer import Normalfrom mindspore import dtype as mstypefrom mindspore.train.callback import TimeMonitor, Callbackfrom mindspore import Model, Tensor, context, save_checkpoint, load_checkpoint, load_param_into_net环境配置我们使用GRAPH模式运行实验,使用Ascend环境。context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")除了环境配置,目录结构我们也要仔细配置,代码如下:./└─resnet50.ckpt└─data   └─Canidae      └─train      │   └─dogs      │   └─wolves      └─val          └─dogs          └─wolves首先要加载数据,定义训练和验证数据集的路径。train_data_path = 'data/Canidae/train'val_data_path = 'data/Canidae/val'定义create_dataset函数对数据进行处理。代码如下:def create_dataset(data_path, batch_size=24, repeat_num=1, training=True):    """定义数据集"""    data_set = ds.ImageFolderDataset(data_path, num_parallel_workers=8, shuffle=True)    # 对数据进行增强操作    image_size = 224    mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]    std = [0.229 * 255, 0.224 * 255, 0.225 * 255]    if training:        trans = [            CV.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)),            CV.RandomHorizontalFlip(prob=0.5),            CV.Normalize(mean=mean, std=std),            CV.HWC2CHW()        ]    else:        trans = [            CV.Decode(),            CV.Resize(256),            CV.CenterCrop(image_size),            CV.HWC2CHW()        ]    type_cast_op = C.TypeCast(mstype.int32)    # 实现数据的map映射、批量处理和数据重复的操作    data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=8)    data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)    data_set = data_set.batch(batch_size, drop_remainder=True)    data_set = data_set.repeat(repeat_num)    return data_set实例化数据集;代码如下:train_ds =  create_dataset(train_data_path)做完以上工作后,我们就要对模型进行微调;加载预训练的模型并重置最终的全连接层。代码如下:net = resnet50(2)num_epochs=20# 加载预训练模型param_dict = load_checkpoint('resnet50.ckpt')# 获取全连接层的名字filter_list = [x.name for x in net.end_point.get_parameters()]# 删除预训练模型的全连接层filter_checkpoint_parameter_by_list(param_dict, filter_list)# 给网络加载参数load_param_into_net(net,param_dict)# 定义优化器和损失函数opt = nn.Momentum(params=net.trainable_params(), learning_rate=0.001, momentum=0.9)loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction='mean')# 实例化模型model = Model(net, loss,opt,metrics={"Accuracy":nn.Accuracy()})代码运行结果为:我最后一步还要对模型进项评估:代码如下:# 加载训练和验证数据集train_ds =  create_dataset(train_data_path)val_ds = create_dataset(val_data_path)# 实例化回调类eval_param_dict = {"model":model,"dataset":val_ds,"metrics_name":"Accuracy"}eval_cb = EvalCallBack(apply_eval, eval_param_dict,)# 模型训练model.train(num_epochs,train_ds, callbacks=[eval_cb, TimeMonitor()], dataset_sink_mode=True)
  • [其他] 何恺明团队最新研究:定义ViT检测迁移学习基线
    本文是FAIR的何恺明团队关于ViT在COCO检测任务上的迁移学习性能研究。它以Mask R-CNN作为基线框架,以ViT作为骨干网络,探索了不同初始化策略对于模型性能的影响。实验表明:masking机制的无监督学习机制(如MAE、BEiT)首次在COCO检测任务迁移学习中取得了令人信服的性能提升 。论文链接:https://arxiv.org/abs/2111.11429本文是FAIR的何恺明团队关于ViT在COCO检测任务上的迁移学习性能研究。它以Mask R-CNN作为基线框架,以ViT作为骨干网络,探索了不同初始化策略对于模型性能的影响;与此同时,为尽可能保证对比的公平性,还对不同超参数进行了大量的实验;此外,为将ViT作为多尺度模式,参考XCiT对ViT不同部分的特征进行尺度调整以达成多尺度特征输出;为使得ViT模型能处理大分辨率图像,还对ViT的架构进行了改进,引入了全局与局部自注意力机制,进一步提升了模型性能取得了更佳的均衡。该文的一系列实验表明:masking机制的无监督学习机制(如MAE、BEiT)首次在COCO检测任务迁移学习中取得了令人信服的性能提升 。Abstract为测试预训练模型能否带来性能增益(准确率提升或者训练速度提升),目标检测是一个常用的且非常重要的下游任务。面对新的ViT模型时,目标检测的复杂性使得该基线变得尤为重要(non-trivial )。然而架构不一致、缓慢训练、高内存占用以及未知训练机制等困难阻碍了标准ViT在目标检测任务上的迁移学习。本文提出了训练技术以克服上述挑战,并采用标准ViT作为Mask R-CNN的骨干。这些工具构成了本文的主要目标:我们比较了五种ViT初始化,包含SOTA自监督学习方法、监督初始化、强随机初始化基线。结果表明:近期提出的Masking无监督学习方法首次提供令人信服的迁移学习性能改善 。相比监督与其他自监督预训练方法,它可以提升 指标高达4% ;此外masking初始化具有更好的扩展性,能够随模型尺寸提升进一步提升其性能。Method因其在目标检测与迁移学习领域的无处不在性,我们采用Mask R-CNN作为基线方案。该选择也旨在对简洁性与复杂性进行均衡,同时提供具有竞争力(也许并非SOTA)的结果。相比原始版本,我们为Mask R-CNN提供了不同的改进模块与训练方案。ViT Backbone接下来,我们将解决如下两个ViT作为Mask R-CNN骨干的技术障碍如何与FPN适配;如何降低内存占用与推理耗时。FPN Compatibility  Mask R-CNN可以与输出单尺度特征的骨干,也可与输出多尺度特征(多尺度特征将被送入FPN处理)的骨干协同工作。由于FPN能够提供更好的检测结果,故我们采用了FPN方案。然而,采用FPN存在这样一个问题:ViT仅输出单尺度特征,而非CNN的多尺度特征 。为解决该问题,我们采用了XCiT中的技术对ViT中间特征进行上/下采样以提供四种不同分辨率的特征(可参见上面图示绿框部分)。第一个模块采用两个stride=2的转置卷积进行4倍上采样;第二个模块采用一个stride=2的转置卷积进行2倍上采样;第三个模块不做任何处理;最后一个模块采用stride=2的MaxPool进行下采样。假设块尺寸为16,这些模块将输出stride分别为4、8、16、32的特征并被送入到FPN中。注:Swin与MViT通过修改VIT架构解决了ViT无法输出多尺度特征的问题。这种处理方式也是一个重要的研究方向,但它与ViT的简单设计相悖,会阻碍新的无监督学习(如MAE)探索。因此,本文仅聚焦于上述生成多尺度特征的改动方式。Reducing Memory and Time Complexity  采用ViT作为Mask R-CNN的骨干会导致内存与耗时挑战。ViT中的每个自注意力操作会占用空间。在预训练过程中,该复杂度是可控的()。而在目标检测中,标准图像尺寸为,这就需要近21倍多的像素和图像块,这种高分辨率用于检测小目标。由于自注意力的复杂度,哪怕基线ViT-B也需要占用20-30G GPU显存(batch=1,FP16) 。为降低空间与时间复杂度,我们采用Windowed Self-attention,即局部自注意力,而非全局自注意力。我们将图像块拆分为非重叠窗口并在每个窗口独立计算自注意力。这种处理方式可以大幅降低空间复杂度与时间复杂度,我们默认设置。Windowed Self-attention的一个缺陷在于:骨干不能跨窗口聚合信息。针对此,我们每 隔模块添加一个全局自注意力模块 。Upgraded Modules相比原始Mask R-CNN,我们对其内置模块进行了如下改动:FPN中的卷积后接BN;RPN中采用两个卷积,而非一个卷积;RoI分类与Box回归头采用四个卷积(带BN)并后接一个全连接,而非原始的两层MLP(无BN);Mask头中的卷积后接BNTraining Formula相比原始训练机制,我们采用了从头开始训练+更长训练周期的训练机制(如400epoch)。我们希望让超参尽可能的少,同时抵制采用额外的数据增广与正则技术。然而,我们发现:DropPath对于ViT骨干非常有效(性能提升达2),故我们采用了该技术。总而言之,训练机制如下:LSJ数据增广(分辨率,尺度范围[0.1,2.0]);AdamW+Cosine学习率衰减+linear warmupDropPath正则技术;batch=64,混合精度训练。当采用预训练初始时,微调100epoch;当从头开始训练时,训练400epoch。Hyperparameter Tuning Protocol为使上述训练机制适用于同模型,我对学习率lr、权值wd衰减以及drop path rate三个超参进行微调,同时保持其他不变。我们采用ViT-B+MoCoV3进行了大量实验以估计合理的超参范围,基于所得估计我们构建了如下调节机制:对每个初始化,我们固定dp=0.0,对lr与wd采用grid搜索,固定搜索中心为,以此为中心搜索;对于ViT-B,我们从中选择dp(预训练参数时,训练50epoch;从头开始时,则训练100epoch),dp=0.1为最优选择;对于ViT-L,我们采用了ViT-B的最后lr与wd,并发现dp=0.3是最佳选择。注:在训练与推理过程中,图像将padding到尺寸。Initialization Methods在骨干初始化方面,我们比较了以下五种:Random:即所有参数均随机初始化,无预训练;Supervised:即ViT骨干在ImageNet上通过监督方式预训练,分别为300和200epoch;MoCoV3:即在ImageNet上采用无监督方式预训练ViT-B与ViT-L,300epoch;BEiT:即采用BEiT方式对ViT-B与ViT-L预训练,800epoch;MAE:即采用MAE对ViT-B与ViT-L预训练,1600eoch;Nuisance Factors in Pre-training尽管我们尽可能进行公平比较,但仍存一些“令人讨厌”的不公因子:不同的预训练方法采用了不同的epoch;BEiT采用可学习相对位置偏置,而非其他方法中的绝对位置嵌入;BEiT在预训练过程中采用了layer scale,而其他方法没采用;我们尝试对与训练数据标准化,而BEiT额外采用了dVAE。Experiments&Analysis上表比较了不同初始化方案的性能,从中可以看到:无论何种初始化,采用ViT-B/L作为骨干的Mask R-CNN训练比较平滑,并无不稳定因素,也不需要额外的类似梯度裁剪的稳定技术 ;相比监督训练,从头开始训练具有1.4指标提升(ViT-L)。也即是说:监督预训练并不一定比随机初始化更强;MoCoV3具有与监督预训练相当的性能;对于ViT-B,BEiT与MAE均优于随机初始化与监督预训练;对于ViT-L,BEiT与MAE带来的性能提升进一步扩大,比监督预训练高达4.0.上图给出了预训练是如何影响微调收敛的,可以看到:相比随机初始化,预训练初始化可以显著加速收敛过程,大约加速4倍 。Discussion对于迁移学习来说,COCO数据集极具挑战性。由于较大的训练集(约118K+0.9M标准目标),当随机初始化训练时可以取得非常好的结果。我们发现:现有的方法(如监督预训练、MoCoV3无监督预训练)的性能反而会弱于随机初始化基线方案 。已有的无监督迁移学习改进对比的均为监督预训练,并不包含随机初始化方案;此外,他们采用了较弱的模型,具有更低的结果(约40),这就导致:不确定如何将已有方法迁移到SOTA模型中。我们发现:MAE与BEiT提供了首个令人信服的COCO数据集上的指标提升 。更重要的是:这些masking方案具有随模型大小提升进一步改善检测迁移学习能力的潜力 ,而监督预训练与MoCoV3等初始化方式并无该能力。Ablations and Analysis上表对比了单尺度与多尺度版本Mask R-CNN的性能,从中可以看到:多尺度FPN设计可以带来1.3-1.7指标提升 ,而耗时仅提升5-10%,多尺度内存占用提升小于1%。上表对比了降低显存与时间复杂度的不同策略,可以看到:局部+全局的组合方式(即第二种)具有最佳的内存占用与耗时均衡;比纯局部自注意力方式,全局自注意力可以带来2.6指标提升。上表比较了不同位置信息的性能对比,从中可以看到:对于仅使用绝对位置嵌入的预训练模型,在微调阶段引入相对位置偏置可以带来0.2-0.3指标提升;预训练相对位置偏置可以带来0.1-0.3指标增益;相对位置偏置会引入额外的负载:训练与推理耗时分别增加25%和15%,内存占用提升15%。上图对比了预训练周期对于性能的影响,可以看到:在100-800epoch预训练周期下,越多的预训练周期带来越高的迁移学习性能;在800-1600epoch下,仍可带来0.2指标的性能增益。上图给出了TIDE工具生成的误差分析,可以看到:对于正确定位的目标,所有的初始化可以得到相似的分类性能;相比其他初始化,MAE与BEiT可以改善定位性能。上表给出了不同骨干的复杂度对比(ViT-B与ResNet-101具有相同的性能:48.9),可以看到:在推理耗时方面,ResNet-101骨干更快;在训练方面,ViT-B仅需200epoch即可达到峰值性能,而ResNet-101需要400epoch。
  • [活动体验] 【初次见面,MindSpore v1.5】 活动二:基于MindSpore的文本分类迁移学习
    邮箱: chaojililin@163.com导入模块:import argparseimport osimport os.pathimport timeimport numpy as npimport jsonimport toolsimport preprocessimport postprocessimport datetimeimport submodelfrom mindspore import Tensorfrom automl import EarlyStopValAcc, BestAccSaver, TrainAccUpdater, ValControlimport mindspore.dataset as dsfrom mindspore.train.callback import Callbackfrom mindspore.train.serialization import save_checkpointimport english_tokentoolfrom mindspore.train.serialization import export数据集准备:自建一个目录text作为根目录,再建一个若干个子目录作为一级目录(sport、education、fashion、superstar、politic、diet),具体目录结构如下,一级目录下存储是具体的txt文本信息text----sport      ----education      ----fashion      ----superstar      ----politic      ----diet读取数据到内存:preprocess.create_data_lists(FLAGS.data_dir, # 训练数据地址 FLAGS.testing_percentage, # 分割的测试数据集的比列 FLAGS.validation_percentage, # 分割的验证数据集的比列 file_format, # 文件格式 FLAGS.three_parts) # 是否需要test数据集preprocess.update_fix_length()preprocess.check_input_data() # 校验读取到的数据是否正常, 如果不正常好抛出异常preprocess.cache_train_data() # 缓存训练数据submodel.add_sample_inf_to_cache_in_memory() # 将采样信息加入到缓存中,方便后续进行采样数据集训练:train_samples, train_ground_truth = submodel.get_random_data_from_cache_memory(-1, 'training')train_x, train_y = np.transpose(np.array(train_samples).astype("float32"), axes=[0, 2, 1]), np.array( train_ground_truth).astype("float32")train_data_set = TTDataset(train_x, train_y)train_data_set = ds.GeneratorDataset(train_data_set, column_names=["text", "label"], shuffle=True)train_data_set = train_data_set.batch(FLAGS.batch_size, drop_remainder=True)dataset_size = train_data_set.get_dataset_size()FLAGS.dataset_size = dataset_sizeprint(dataset_size)数据集验证;validation_dataset_name = 'validation' if FLAGS.three_parts else 'testing'validation_samples, validation_ground_truth = submodel.get_random_data_from_cache_memory(-1, validation_dataset_name)valid_x, valid_y = np.transpose(np.array(validation_samples).astype("float32"), axes=[0, 2, 1]), np.array( validation_ground_truth).astype("float32")定义网络:# modelnetwork, model, optim = submodel.add_final_training_ops_CNN()转为MindIR:# 转化为mindir格式input_np = np.random.uniform(0.0, 1.0, size=[1, 128, FLAGS.fix_length]).astype(np.float32)export(network, Tensor(input_np), file_name="./modeloutput/text_mobilenet", file_format='MINDIR')command = r'call modelConvertMindspore\converter_lite.exe --fmk=MINDIR --modelFile=' + './modeloutput/text_mobilenet.mindir' + ' --outputFile=' + './modeloutput/text_mobilenet'os.system(command)
  • [执行问题] mindspore图像分类迁移学习案例运行失败
    用GPU跑mindspore官网图像分类迁移学习案例:https://www.mindspore.cn/tutorial/zh-CN/r1.2/intermediate/image_and_video/transfer_learning.html出现以下问题:请问要怎么解决?
  • [技术干货] 基于MindSpore的文本分类迁移学习
    基于MindSpore1.3.0的文本分类迁移学习本人基于MindSpore1.3.0版本开发文本分类迁移学习(下面是关键步骤的解释说明,具体代码见附件)导入模块:import argparse import os import os.path import time import numpy as np import json import tools import preprocess import postprocess import datetime import submodel from mindspore import Tensor from automl import EarlyStopValAcc, BestAccSaver, TrainAccUpdater, ValControl import mindspore.dataset as ds from mindspore.train.callback import Callback from mindspore.train.serialization import save_checkpoint import english_tokentool from mindspore.train.serialization import export数据集准备:自建一个目录text作为根目录,再建一个若干个子目录作为一级目录(sport、education、fashion、superstar、politic、diet),具体目录结构如下,一级目录下存储是具体的txt文本信息text----sport      ----education      ----fashion      ----superstar      ----politic      ----diet读取数据到内存:preprocess.create_data_lists(FLAGS.data_dir, # 训练数据地址 FLAGS.testing_percentage, # 分割的测试数据集的比列 FLAGS.validation_percentage, # 分割的验证数据集的比列 file_format, # 文件格式 FLAGS.three_parts) # 是否需要test数据集 preprocess.update_fix_length() preprocess.check_input_data() # 校验读取到的数据是否正常, 如果不正常好抛出异常 preprocess.cache_train_data() # 缓存训练数据 submodel.add_sample_inf_to_cache_in_memory() # 将采样信息加入到缓存中,方便后续进行采样数据集训练:train_samples, train_ground_truth = submodel.get_random_data_from_cache_memory(-1, 'training') train_x, train_y = np.transpose(np.array(train_samples).astype("float32"), axes=[0, 2, 1]), np.array( train_ground_truth).astype("float32") train_data_set = TTDataset(train_x, train_y) train_data_set = ds.GeneratorDataset(train_data_set, column_names=["text", "label"], shuffle=True) train_data_set = train_data_set.batch(FLAGS.batch_size, drop_remainder=True) dataset_size = train_data_set.get_dataset_size() FLAGS.dataset_size = dataset_size print(dataset_size)数据集验证;validation_dataset_name = 'validation' if FLAGS.three_parts else 'testing' validation_samples, validation_ground_truth = submodel.get_random_data_from_cache_memory(-1, validation_dataset_name) valid_x, valid_y = np.transpose(np.array(validation_samples).astype("float32"), axes=[0, 2, 1]), np.array( validation_ground_truth).astype("float32")定义网络:# model network, model, optim = submodel.add_final_training_ops_CNN()转为MindIR:# 转化为mindir格式 input_np = np.random.uniform(0.0, 1.0, size=[1, 128, FLAGS.fix_length]).astype(np.float32) export(network, Tensor(input_np), file_name="./modeloutput/text_mobilenet", file_format='MINDIR') command = r'call modelConvertMindspore\converter_lite.exe --fmk=MINDIR --modelFile=' + './modeloutput/text_mobilenet.mindir' + ' --outputFile=' + './modeloutput/text_mobilenet' os.system(command)原文链接:https://blog.csdn.net/skytttttt9394/article/details/119571347?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163063161516780265459602%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163063161516780265459602&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v29_ecpm-6-119571347.pc_search_result_control_group&utm_term=MindSpore&spm=1018.2226.3001.4187
  • [技术干货] 基于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)原文链接:https://blog.csdn.net/skytttttt9394/article/details/119571390?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163063161516780265459602%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163063161516780265459602&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v29_ecpm-5-119571390.pc_search_result_control_group&utm_term=MindSpore&spm=1018.2226.3001.4187
  • [应用实践] 基于MindSpore的文本分类迁移学习
    邮箱:chaojililin@163.com基于MindSpore1.3.0的文本分类迁移学习本人基于MindSpore1.3.0版本开发文本分类迁移学习(下面是关键步骤的解释说明,具体代码见附件)导入模块:import argparseimport osimport os.pathimport timeimport numpy as npimport jsonimport toolsimport preprocessimport postprocessimport datetimeimport submodelfrom mindspore import Tensorfrom automl import EarlyStopValAcc, BestAccSaver, TrainAccUpdater, ValControlimport mindspore.dataset as dsfrom mindspore.train.callback import Callbackfrom mindspore.train.serialization import save_checkpointimport english_tokentoolfrom mindspore.train.serialization import export数据集准备:自建一个目录text作为根目录,再建一个若干个子目录作为一级目录(sport、education、fashion、superstar、politic、diet),具体目录结构如下,一级目录下存储是具体的txt文本信息text----sport      ----education      ----fashion      ----superstar      ----politic      ----diet读取数据到内存:preprocess.create_data_lists(FLAGS.data_dir, # 训练数据地址 FLAGS.testing_percentage, # 分割的测试数据集的比列 FLAGS.validation_percentage, # 分割的验证数据集的比列 file_format, # 文件格式 FLAGS.three_parts) # 是否需要test数据集preprocess.update_fix_length()preprocess.check_input_data() # 校验读取到的数据是否正常, 如果不正常好抛出异常preprocess.cache_train_data() # 缓存训练数据submodel.add_sample_inf_to_cache_in_memory() # 将采样信息加入到缓存中,方便后续进行采样数据集训练:train_samples, train_ground_truth = submodel.get_random_data_from_cache_memory(-1, 'training')train_x, train_y = np.transpose(np.array(train_samples).astype("float32"), axes=[0, 2, 1]), np.array( train_ground_truth).astype("float32")train_data_set = TTDataset(train_x, train_y)train_data_set = ds.GeneratorDataset(train_data_set, column_names=["text", "label"], shuffle=True)train_data_set = train_data_set.batch(FLAGS.batch_size, drop_remainder=True)dataset_size = train_data_set.get_dataset_size()FLAGS.dataset_size = dataset_sizeprint(dataset_size)数据集验证;validation_dataset_name = 'validation' if FLAGS.three_parts else 'testing'validation_samples, validation_ground_truth = submodel.get_random_data_from_cache_memory(-1, validation_dataset_name)valid_x, valid_y = np.transpose(np.array(validation_samples).astype("float32"), axes=[0, 2, 1]), np.array( validation_ground_truth).astype("float32")定义网络:# modelnetwork, model, optim = submodel.add_final_training_ops_CNN()转为MindIR:# 转化为mindir格式input_np = np.random.uniform(0.0, 1.0, size=[1, 128, FLAGS.fix_length]).astype(np.float32)export(network, Tensor(input_np), file_name="./modeloutput/text_mobilenet", file_format='MINDIR')command = r'call modelConvertMindspore\converter_lite.exe --fmk=MINDIR --modelFile=' + './modeloutput/text_mobilenet.mindir' + ' --outputFile=' + './modeloutput/text_mobilenet'os.system(command)
  • [应用实践] 基于MindSpore的图像分类迁移学习
    邮箱:chaojililin@163.com基于MindSpore1.3.0的图像分类迁移学习本人基于MindSpore1.3.0版本开发图像分类迁移学习(下面是关键步骤的解释说明,具体代码见附件)导入模块:import collectionsimport jsonimport hashlibimport loggingimport os.pathimport reimport shutilimport getoptfrom datetime import datetimefrom PIL import Imagefrom os.path import getsize, joinimport osimport argparseimport randomimport numpy as npimport sys, statfrom mindspore import contextfrom mindspore import Tensor, Parameterfrom mindspore import nnfrom mindspore.nn.loss import SoftmaxCrossEntropyWithLogitsfrom mindspore.nn.loss.loss import _Lossfrom mindspore.ops import operations as Pfrom mindspore.ops import functional as Ffrom mindspore.common import dtype as mstypefrom mindspore.train.model import Modelfrom mindspore.train.serialization import load_checkpoint, load_param_into_net, save_checkpoint, exportimport mindspore.dataset.engine as defrom dataset import create_datasetfrom mobilenetV2 import MobileNetV2, Head, MobileNetV2Classificationfrom easydict import EasyDict as edfrom 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_networknetwork.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)
  • [其他] 图神经网络的自适应迁移学习
    图神经网络(GNNs)被广泛用于学习一种强大的图结构数据表示。最近的研究表明,将知识从自监督任务迁移到下游任务可以进一步改善图的表示。然而,自监督任务与下游任务在优化目标和训练数据上存在内在的差距。传统的预训练方法可能对知识迁移不够有效,因为它们不能适应下游任务。为了解决这一问题,我们提出了一种新的迁移学习范式,该范式可以有效地将自监督任务作为辅助任务来帮助目标任务。在微调阶段,我们的方法将不同的辅助任务与目标任务进行自适应的选择和组合。我们设计了一个自适应辅助损失加权模型,通过量化辅助任务与目标任务之间的一致性来学习辅助任务的权重。此外,我们通过元学习来学习权重模型。我们的方法可以运用于各种迁移学习方法,它不仅在多任务学习中有很好的表现,而且在预训练和微调中也有很好的表现。在多个下游任务上的综合实验表明,所提出的方法能够有效地将辅助任务与目标任务相结合,与现有的方法相比,显著提高了性能。 https://www.zhuanzhi.ai/paper/852db932624d6feeb7bbd32e67772b27
  • [热门活动] 华为云AI论文精读会2021 第五期:基于迁移学习的语义分割算法分享
    2021年5月24日举办了华为云AI论文精读会2021 第五期:基于迁移学习的语义分割算法分享嘉宾是来自电子科技大学的刘亚豪~论文领域是迁移学习领域哦~来不及等待!感兴趣的小伙伴快点击下方链接!观看地址:https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/competition/1621818551519065248.mp4
  • [行业动态] 自动写代码指日可待!Facebook迁移学习新突破,代码补全准确率超50%!
    --- 本文转载自 新智元 > 程序员的工作就是取代重复、算法可替代的工作,而他们自己也在研究如何取代自己。Facebook新发表的代码补全模型准确率超50%,动动手指就能写几百行代码! 代码补全(code AutoCompletion)就是在写代码的时候,IDE能够预测出下一段要写的代码,也是写代码时候选择使用IDE的重要原因。 最近的相关研究表明,自动补全可以通过深度学习来实现,使软件语言模型能够通过对从程序员的 IDE 活动中收集的真实世界数据集进行训练,来实现显著的准确性提高。 不过,对于那些没多少人用的编程语言来说,一个常见问题是,可用的 IDE 数据集可能不足以进行训练。 对于这个问题,Facebook的研究人员最近在arxiv上公开了自己在代码补全上的工作。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142814cfxvawacdj2cqzsc.png) 他们在文中展示了迁移学习是如何能够在微调之前完成自动补全任务的,这种训练不局限于 ide和特定语言,能够针对各种各样的示例代码序列进行预训练。 该方法在非常小的微调数据集上提高了50% 以上的模型精度,在50k 个带标签样例的数据集上提高了10% 以上的精度。 在软件社区中,所有主要编程语言的大量开源代码提交都可以在 GitHub 上找到。 毫无疑问,这些代码的提交和开发人员在 IDE 上的活动有着直接的联系,例如vscode, intellij等会有不同的补全方式,也会直接体现在代码中。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/1428228psslmjmxdpduwuw.png) 因此,如果能够在建模代码编写行为时使用这些commit中的知识,那对于自动补全任务来说是有益的。 由于在所有编程语言中都存在一些共享概念和结构,例如数据类型、面向对象等思想设计,所以研究人员建议将这些语言知识从使用人数更多的编程语言(如Python, Java)转移到标记数据不足的其他小众语言中。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142830axjepibdpruiwohq.png) 这项研究中的数据集来自 Facebook 的一些开发者活动,主要关注流行的编程语言 Python 和不太流行的语言 Hack。 该团队首先训练了来自 Hack 或 Python 的各种单语模型,以及来自两种语言的多语模型。为了从开放词汇表中有效地识别和预测很少被使用的关键词和两种语言之间不同的关键词,他们采用了两种标记方法: 字节对编码(Byte-pair encoding,BPE)和 Bigram 编码。 为了测试迁移学习的效果,他们使用了两个文本生成模型GPT-2和 PLBART-并评估了两个在线和离线模型的性能。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142837ntt7sd1a2qqgitne.png) 最后论文中总结了他们的贡献和实验结果: 1、对从git提交获得的源代码文件预先训练两个 transformer语言模型 GPT-2和 BART,结果显示它们在自动补全预测方面的性能,比直接使用实际 IDE 代码序列的微调提高了2.18%。也就是说迁移模型取得了更好的效果。 2、GPT-2模型是在两个真实世界的数据集上训练的: 在 IDE 上写的和代码补全选择期间记录的代码序列。预训练和特定任务的微调相结合能够产生一个更好的模型,比基本模型的性能高出3.29%。 3、文中展示了使用不同的编程语言进行预训练,在比较使用 Hack 示例进行预训练和使用10k Python 示例进行微调的模型与只使用 Python 示例进行训练的模型时,可以提高13.1% 的准确性 4、通过在线 a/b 测试比较,证明在任务、领域和语言这三个迁移学习维度上的改进分别使自动完成工具的使用率提高了3.86% 、6.63% 和4.64% ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142845fdvfkgiuypnmjvyh.png) 总体而言,研究表明,在不使用 ide数据和不同语言示例代码序列上的预训练代码补全模型,使用迁移学习可以显著提高模型的准确性,表明迁移学习有可能推进较不流行的编程语言的代码自动补全,并改善使用它们的开发人员的编码经验。 ## 代码预测工具 Kite是一个著名的代码补全工具。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142851yij5c9ditwbp88g7.png) Kite 基于 AI 的代码补全功能现在支持Python, JavaScript, TypeScript、 Java、 HTML、 CSS、 Go、 C、 C # 、C + + 、 Objective C、 Kotlin 和 Scala。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142858kwg5svmbzusfqkmz.png) Kite 于2016年4月首次亮相,在17年3月又公开发布了一个基于云计算的版本。该公司在19年1月筹集了1700万美元,放弃了云计算,转而在本地运行免费服务。 在编写过程中Kite可以极大减少敲键盘的次数。在Kite的帮助下,活跃开发者甚至每天只需编写由大约 175 个单词组成的代码。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142903zy1gxwmfvj0ix9q7.png) 各种开发人员也是对Kite十分赞赏,甚至还包括了Python之父 Guido van Rossum ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/1429087wceci6rnb1yrocm.png) Kite的 Python 机器学习模型是在2500万个开源代码文件上训练的,它的 JavaScript 机器模型是在3000万个文件上训练的。 除了越来越多的编程语言,Kite也可在更多的开发环境中工作,目前已支持在16个编辑器上使用,包括 Android Studio、 Atom、 JupyterLab、 Spyder、 Sublime Text、 VS Code 和 Vim等。 此外Kite还与 IntelliJ 家族合作:,支持 IntelliJ、 PyCharm、 WebStorm、 Goland、 CLion、 PHPStorm、 Rider、 RubyMine 和 AppCode。 由此可见,公司的愿景是允许尽可能多的开发人员利用 Kite,而不管他们的语言或 IDE 是什么,最终实现各个场景下代码补全的「大一统」。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142914epajjc31xsrddxo4.png) Kite 公司的首席执行官史密斯之前还创立了 Xobni,这是一个于07年9月推出的电子邮件服务,雅虎在13年7月将其收购。 史密斯在接受访问时说到,当我们构建对 JavaScript 的支持时,我们致力于创建一种可伸缩的方式来添加更多的编程语言,从那时起,我们一直在迭代我们的 JavaScript 模型和排序算法。这种学习使我们能够相对容易地发布每一种新语言,具有与 JavaScript 相同的准确性和智能性。 19年,正值GPT-2火热时,一名滑铁卢大学大四学生Jacob Jackson也开发了一款自动补全工具tabnine,支持23种编程语言和5种代码编辑器,几乎不需要配置安装即可使用。 Deep TabNine会根据你以前的编码习惯自动补全,还会在后面给出几个选项的概率。如果之前项目出现过类似代码,还能在补全候选框中直接给出地址,方便用户点击进去查阅! ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142921crauzbo36uzcwvf6.png) VSCode下,直接打开插件市场搜索TabNine,点击安装即可。Sublime Text下调出Install Package Control安装即可。Atom也可以直接安装。EMACS和Vim稍微复杂一些。 Deep TabNine通过对GitHub大约200万个文件进行训练。训练期间,模型学习了例如动态类型语言中的类型推断等复杂行为,用这样的训练方式预测token。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/25/142931muhjwhs2bkewtjbo.png) TabNine可以使用传统工具难以获取的琐碎的线索。当线索不够的时候TabNine可能会胡言乱语,然而一旦拥有足够的线索,就能准确预测出代码,甚至还可以给出匹配的概率。 如今深度学习浪潮来了,程序员连自己也不放过,也要取缔自己的工作,生于忧患!
  • [其他] 迁移学习
    如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作为预训练,然后转换到你感兴趣的任务上。计算机视觉的研究社区非常喜欢把许多数据集上传到网上,如果你听说过,比如**ImageNet**,或者**MS COCO**,或者**Pascal**类型的数据集,这些都是不同数据集的名字,它们都是由大家上传到网络的,并且有大量的计算机视觉研究者已经用这些数据集训练过他们的算法了。有时候这些训练过程需要花费好几周,并且需要很多的**GPU**,其它人已经做过了,并且经历了非常痛苦的寻最优过程,这就意味着你可以下载花费了别人好几周甚至几个月而做出来的开源的权重参数,把它当作一个很好的初始化用在你自己的神经网络上。用迁移学习把公共的数据集的知识迁移到你自己的问题上,让我们看一下怎么做。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224608xe1l8divf6bzqy4f.png) 举个例子,假如说你要建立一个猫咪检测器,用来检测你自己的宠物猫。比如网络上的**Tigger**,是一个常见的猫的名字,**Misty**也是比较常见的猫名字。假如你的两只猫叫**Tigger**和**Misty**,还有一种情况是,两者都不是。所以你现在有一个三分类问题,图片里是**Tigger**还是**Misty**,或者都不是,我们忽略两只猫同时出现在一张图片里的情况。现在你可能没有**Tigger**或者**Misty**的大量的图片,所以你的训练集会很小,你该怎么办呢? ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224614ve1vybqbvxxwel40.png) 我建议你从网上下载一些神经网络开源的实现,不仅把代码下载下来,也把权重下载下来。有许多训练好的网络,你都可以下载。举个例子,**ImageNet**数据集,它有1000个不同的类别,因此这个网络会有一个**Softmax**单元,它可以输出1000个可能类别之一。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224621cp8eix1rgxbxxc8v.png) 你可以去掉这个**Softmax**层,创建你自己的**Softmax**单元,用来输出**Tigger**、**Misty**和**neither**三个类别。就网络而言,我建议你把所有的层看作是冻结的,你冻结网络中所有层的参数,你只需要训练和你的**Softmax**层有关的参数。这个**Softmax**层有三种可能的输出,**Tigger**、**Misty**或者都不是。 通过使用其他人预训练的权重,你很可能得到很好的性能,即使只有一个小的数据集。幸运的是,大多数深度学习框架都支持这种操作,事实上,取决于用的框架,它也许会有`trainableParameter=0`这样的参数,对于这些前面的层,你可能会设置这个参数。为了不训练这些权重,有时也会有`freeze=1`这样的参数。不同的深度学习编程框架有不同的方式,允许你指定是否训练特定层的权重。在这个例子中,你只需要训练**softmax**层的权重,把前面这些层的权重都冻结。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224630zwyxaqwlq0hyea4p.png) 另一个技巧,也许对一些情况有用,由于前面的层都冻结了,相当于一个固定的函数,不需要改变。因为你不需要改变它,也不训练它,取输入图像,然后把它映射到这层(**softmax**的前一层)的激活函数。所以这个能加速训练的技巧就是,如果我们先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。你所做的就是用这个固定的函数,在这个神经网络的前半部分(**softmax**层之前的所有层视为一个固定映射),取任意输入图像,然后计算它的某个特征向量,这样你训练的就是一个很浅的**softmax**模型,用这个特征向量来做预测。对你的计算有用的一步就是对你的训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,然后在此之上训练**softmax**分类器。所以,存储到硬盘或者说预计算方法的优点就是,你不需要每次遍历训练集再重新计算这个激活值了。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224640zhkb9ryetqeqe7ec.png) 因此如果你的任务只有一个很小的数据集,你可以这样做。要有一个更大的训练集怎么办呢?根据经验,如果你有一个更大的标定的数据集,也许你有大量的**Tigger**和**Misty**的照片,还有两者都不是的,这种情况,你应该冻结更少的层,比如只把这些层冻结,然后训练后面的层。如果你的输出层的类别不同,那么你需要构建自己的输出单元,**Tigger**、**Misty**或者两者都不是三个类别。有很多方式可以实现,你可以取后面几层的权重,用作初始化,然后从这里开始梯度下降。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224647icbftwpdodlij7cs.png) 或者你可以直接去掉这几层,换成你自己的隐藏单元和你自己的**softmax**输出层,这些方法值得一试。但是有一个规律,如果你有越来越多的数据,你需要冻结的层数越少,你能够训练的层数就越多。这个理念就是,如果你有一个更大的数据集,也许有足够多的数据,那么不要单单训练一个**softmax**单元,而是考虑训练中等大小的网络,包含你最终要用的网络的后面几层。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/16/224655uksdtdb3aff6vbb0.png) 最后,如果你有大量数据,你应该做的就是用开源的网络和它的权重,把这、所有的权重当作初始化,然后训练整个网络。再次注意,如果这是一个1000节点的**softmax**,而你只有三个输出,你需要你自己的**softmax**输出层来输出你要的标签。 如果你有越多的标定的数据,或者越多的**Tigger**、**Misty**或者两者都不是的图片,你可以训练越多的层。极端情况下,你可以用下载的权重只作为初始化,用它们来代替随机初始化,接着你可以用梯度下降训练,更新网络所有层的所有权重。 这就是卷积网络训练中的迁移学习,事实上,网上的公开数据集非常庞大,并且你下载的其他人已经训练好几周的权重,已经从数据中学习了很多了,你会发现,对于很多计算机视觉的应用,如果你下载其他人的开源的权重,并用作你问题的初始化,你会做的更好。在所有不同学科中,在所有深度学习不同的应用中,我认为计算机视觉是一个你经常用到迁移学习的领域,除非你有非常非常大的数据集,你可以从头开始训练所有的东西。总之,迁移学习是非常值得你考虑的,除非你有一个极其大的数据集和非常大的计算量预算来从头训练你的网络。
  • [其他] 一篇综述带你全面了解迁移学习的领域泛化(Domain Generalization)
    本文介绍了领域泛化的第一篇综述文章,该文一共调研了160篇文献,从问题定义、理论分析、方法总结、数据集和应用介绍、未来研究方向等对领域泛化进行了详细的总结。 >>公众号后台回复“79”或者“陈鑫”获得CVPR 2021:TransT 直播链接领域泛化 (Domain Generalization, DG) 是近几年非常热门的一个研究方向。它研究的问题是从若干个具有不同数据分布的数据集(领域)中学习一个泛化能力强的模型,以便在 未知 (Unseen) 的测试集上取得较好的效果。本文介绍DG领域的第一篇综述文章《Generalizing to Unseen Domains: A Survey on Domain Generalization》。该论文一共调研了 160篇文献,其中直接与领域泛化相关的有 90 篇。文章从问题定义、理论分析、方法总结、数据集和应用介绍、未来研究方向等几大方面对领域泛化问题进行了详细的概括和总结。该论文的精简版已被国际人工智能顶会IJCAI-21录用。文章链接:https://arxiv.org/abs/2103.03097PDF:https://arxiv.org/pdf/2103.03097作者单位:微软亚洲研究院、中央财经大学问题定义领域泛化问题与领域自适应 (Domain Adaptation,DA)最大的不同:DA在训练中,源域和目标域数据均能访问(无监督DA中则只有无标记的目标域数据);而在DG问题中,我们只能访问若干个用于训练的源域数据,测试数据是不能访问的。毫无疑问,DG是比DA更具有挑战性和实用性的场景:毕竟我们都喜欢“一次训练、到处应用”的足够泛化的机器学习模型。例如,在下图中,DA问题假定训练集和测试集都可以在训练过程中被访问,而DG问题中则只有训练集。DG问题的示意图如下所示,其形式化定义如下:DG不仅与DA问题有相似之处,其与多任务学习、迁移学习、元学习、终身学习等,都有一些类似和差异之处。我们在下表中对它们的差异进行了总结。
  • [其他] 情感脑机交互研究-节选
    【摘 要】情感智能是指机器感知,理解和调控人的情绪的能力。除了逻辑智能,情感智能 被认为是人类智能的重要组成部分。然而,现有的人机交互系统基本不具有任何 情感智能。情感脑机交互研究如何从脑信号中解析和识别用户的情感状态。本文 提出了脑电和眼动信号融合的多模态情绪识别框架,揭示了脑电和眼动信号在情 绪识别中的互补特性,发现了不同情绪下的稳定脑电模式;提出了基于迁移学习 构建个性化脑电情绪识别模型的方法,克服了跨被试个体差异性,以及脑电信号 的非平稳特性,实验结果表明,迁移学习方法相对于不考虑个体差异性的通用机 器学习模型,能够显著提高情绪识别的准确率。 【关键词】情感计算;情感脑机交互;情绪识别;脑电信号;眼动信号;多模态信号融合; 深度学习;迁移学习   情感交流是人与人之间交流的重要部 分,情感化的人机交互设计是当前信息科学 和认知科学研究的热点问题,同时也是人工 智能领域备受关注但尚未解决的重要问题。 在 20 世纪末,Salovey 和 Mayer 首次提出了 情感智能的概念,认为除了逻辑智能,情感 智能也是人类智能的重要部分。情感智能指 的是感知、理解和调节情绪的能力。MIT 媒 体实验室的 Picard 教授提出了情感计算的概 念,目的是在人机交互中引入情感因素,赋 予计算机感知、理解及表达情感的能力。而 情感脑机交互(aBCI)的研究目标,是如何 从脑信号中解析和识别用户的情感状态。   人脑具有把来自视觉、听觉和触觉等 多个感觉通道的信息进行统一整合,进而 形成完整的知觉能力,是情绪处理的中枢 单元。已有相关研究表明,在某些情绪状态下大脑神经活动具有特定的激活模式, 然而情绪处理的脑机制仍有待解明。目前 人机情感交互大多建立在人外部的行为表 现上,而缺乏对情感交互过程的认知状态 进行建模,使得当前的人机情感交互只能 通过简单的外部行为,如表情、语音等进 行处理。另外,情绪表征包含了人的外部 行为特征和内部生理变化。依靠单一的外 部行为特征或内部生理信号都难以全面、 客观和准确地表征情绪状态,因为外部行 为特征和内部生理变化分别从不同的角度 反映了情绪状态的变化。因此,如何利用 多模态信号对情绪状态进行表征,如何建 立外部行为与内部神经模式相结合的多模 态情感模型,这些都是目前情感脑机交互 研究的重要问题。   传统的情绪识别方法多采用表情、语 音和身体姿态等信号。这些信号容易获取,不需要佩戴传感器,但往往容易受到被试 主观因素影响。当被试的内心感受与外在 表达不一致时,系统将无法做出正确判断。 单纯的外在表现不足以表征人类丰富的情 绪状态,而生理变化主要受到人的神经系 统支配,能够客观地反映被试的情绪状态。 因此,利用生理信号进行情绪识别是目前 国际上情感计算研究的热点。目前,国内 外学者采用的情绪识别生理信号主要有脑 电图(EEG)、肌电图(EMG)、血容量 波动(BVP)、皮肤电反应(GSR)、心电 图(ECG)、眼电(EOG)、表皮温度和 血压等。近些年来,随着可穿戴技术和移 动计算技术的快速发展与普及,以及各种 可穿戴干电极脑电采集设备的商业化,基 于脑电信号的情绪识别也越来越受到关注。 本文提出了利用脑电和眼动信号的多 模态情绪识别框架,实现了对人的内在神 经活动状态和外在行为活动的建模;探讨 了特征层融合、决策层融合,以及双模态 深度自编码器等多模态信息融合方法;另 外揭示了脑电和眼动信号在情绪识别中的 互补特性。为了克服跨被试个体差异性问 题和脑电信号的非平稳特性,引入了迁移 学习算法构建基于脑电的个性化情感模型。 尽管近些年来,情感脑机交互取得了许多 重要的进展,但仍存在很多问题需要进一 步探索,例如情绪类别精准标注、情绪识 别的性别和文化差异等问题。情绪影响着 我们日常生活的方方面面,情绪产生和调 节的脑机制以及情感脑机交互的实用化研 究将越来越受到人们的关注。来源:中国人工智能学会通讯2019年第9期
总条数:53 到第
上滑加载中