-
描述适用的案例图像分类—ResNeSt理论与实践适用的数据集flowers-5-manifest(图像分类)flowers-5-raw-split(图像分类)10类常见美食生活垃圾分类花卉分类猫狗分类23类美食4类美食OBS原始数据集格式仅支持切分的情况your_local_path/flowers |- train --------------- 训练集 |- classA ------------- 类别A |- A_0.jpg |- A_1.jpg |- ... |- A_n.jpg |- classB ------------ 类别B |- B_0.jpg |- B_1.jpg |- ... |- B_n.jpg |- classC --------------- 类别C |- C_0.jpg |- C_1.jpg |- ... |- C_n.jpg 以此类推 ... |- eval --------------- 测试集 |- classA ------------- 类别A |- A_0.jpg |- A_1.jpg |- ... |- A_n.jpg |- classB ------------ 类别B |- B_0.jpg |- B_1.jpg |- ... |- B_n.jpg |- classC --------------- 类别C |- C_0.jpg |- C_1.jpg |- ... |- C_n.jpg 以此类推 ...概述MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear Bottlenecks 中提出的模型结构实现。可以用图像分类任务,比如猫狗分类、花卉分类等等。用户提供一系列带有标注的数据集,该算法会载入在ImageNet-1000上的预训练模型,在用户数据集上做迁移学习。训练后生成的模型可直接在ModelArts平台部署为在线服务或批量服务,同时支持使用CPU、GPU或Ascend 310进行推理。训练算法基本信息适用场景:图像分类支持的框架引擎:Tensorflow-1.13.1-python3.6-horovod算法输入:ModelArts数据管理平台发布的数据集(数据集必须设置“训练验证比例”),建议用户以8:2或9:1的比例进行切分,即“训练验证比例”设置为0.8或0.9。在ImageNet上的预训练模型;训练参数说明名称默认值类型是否必填是否可修改描述task_typeimage_classification_v2string是否适用场景。model_namemobilenet_v2string是否模型名称。do_trainTruebool是否是否做训练,默认训练。do_eval_along_trainTruebool是否是否边训练边验证,默认值为True,表示边训练边验证。variable_updatehorovodstring是否参数更新方式,默认horovod。learning_rate_strategy0.002string是是训练的学习率策略。"10:0.001,20:0.0001"代表0-10个epoch学习率0.001,10-20epoch学习率0.0001。如果不指定epoch, 会根据验证精度情况自动调整学习率,并当精度没有明显提升时,训练停止。batch_size64int是是每步训练的图片数量(单卡)。eval_batch_size64int是是每步验证的图片数量(单卡)。evaluate_every_n_epochs1.0float是是每训练n个epoch做一次验证。save_model_secs60int是是保存模型的频率(单位:s)。save_summary_steps10int是是保存summary的频率(单位:步)。log_every_n_steps10int是是打印日志的频率(单位:步)。do_data_cleaningTruebool否是是否做数据清洗,数据格式异常会导致训练失败,建议开启,保证训练稳定性。数据量过大时,数据清洗可能耗时较久,可自行线下清洗(支持BMP、JPEG、PNG格式,RGB三通道)。建议用JPEG格式数据。默认开启,设置为False表示关闭。use_fp16Falsebool否否是否使用混合精度, 混合精度可以加速训练,但是可能会造成一点精度损失,默认关闭。xla_compileTruebool否是是否开启xla编译,加速训练,默认启用,设置为False表示关闭。data_formatNHWCstring否是输入数据类型,NHWC表示channel在最后,NCHW表示channel在最前,默认值NHWC,暂不支持NCHW。best_modelTruebool否是是否在训练过程中保存并使用精度最高的模型,而不是最新的模型。默认值True,保存最优模型。在一定误差范围内,最优模型会保存最新的高精度模型。设置为False表示关闭。训练输出文件训练完成后的输出文件如下: |- om |- model |- index |- customize_service_d310.py |- model |- variables |- variables.data-00000-of-00001 |- variables.index |- customize_service.py |- index |- config.json |- saved_model.pb |- frozen_graph |- insert_op_conf.cfg |- model.pb |- checkpoint |- model.ckpt-xxx |- ... |- best_checkpoint |- best_model.ckpt-xxx |- ... |- events... |- graph.pbtxtAscend 310推理模型转换转换模板:TF-FrozenGraph-To-Ascend-C32转换输入目录:选择“训练输出目录”中的frozen_graph转换输出目录:选择“训练输出目录”中的om/model输入张量形状:images:1,224,224,3输入数据格式:NHWC转换输出节点:logits:0其他参数均使用默认值。模型导入从模板中选择:ARM-Ascend模板模型目录:选择“训练输出目录”中的om/model输入输出模式:预置图像处理模式GPU/CPU推理推理配置文件“model/config.json”,默认使用CPU推理镜像(runtime:tf1.xx-python3.x-cpu)。若使用GPU推理,导入模型之前需修改“model/config.json”文件,将runtime字段修改为“tf1.xx-python3.x-gpu”。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、中国-香港
-
描述ResNeSt(图像分类/PyTorch)适用的案例图像分类—ResNeSt理论与实践适用的数据集flowers-5-manifest(图像分类)flowers-5-raw-no-split(图像分类)flowers-5-raw-split(图像分类)10类常见美食生活垃圾分类花卉分类猫狗分类23类美食4类美食OBS原始数据集格式不切分的情况your_local_path/flowers |- classA ------------- 类别A |- A_0.jpg |- A_1.jpg |- ... |- A_n.jpg |- classB ------------ 类别B |- B_0.jpg |- B_1.jpg |- ... |- B_n.jpg |- classC --------------- 类别C |- C_0.jpg |- C_1.jpg |- ... |- C_n.jpg 以此类推 ...切分的情况your_local_path/flowers |- train --------------- 训练集 |- classA ------------- 类别A |- A_0.jpg |- A_1.jpg |- ... |- A_n.jpg |- classB ------------ 类别B |- B_0.jpg |- B_1.jpg |- ... |- B_n.jpg |- classC --------------- 类别C |- C_0.jpg |- C_1.jpg |- ... |- C_n.jpg 以此类推 ... |- eval --------------- 测试集 |- classA ------------- 类别A |- A_0.jpg |- A_1.jpg |- ... |- A_n.jpg |- classB ------------ 类别B |- B_0.jpg |- B_1.jpg |- ... |- B_n.jpg |- classC --------------- 类别C |- C_0.jpg |- C_1.jpg |- ... |- C_n.jpg 以此类推 ...1. 概述该算法为ResNeSt系列,此模型基于ResNeSt: Split-Attention Networks中提出的模型结构实现。可以用图像分类任务,比如猫狗分类、花卉分类等等。用户提供一系列带有标注的数据集,该算法会载入在ImageNet-1000上的预训练模型,在用户数据集上做迁移学习。训练后生成的模型可直接在ModelArts平台部署成在线服务,支持使用CPU规格进行推理,目前暂不支持GPU推理。ResNeSt参加 华为云大赛爱(AI)美食·美食图片分类 取得了top5的成绩,与top2的精度相同。详细指导文档请参考博客:Top5-华为云美食图片分类大赛。2. 训练2.1. 算法基本信息任务类型:图像分类支持的框架引擎:PyTorch-1.4.0-python3.6算法输入:ModelArts数据管理平台发布的图像分类数据集。建议发布数据集时切分成训练集+验证集,建议以8:2或9:1的比例进行切分,如果只做纯训练,请设置参数do_eval_along_train=FalseImageNet预训练模型,在ImageNet上的top正确率分别为:resnest50 top-1: 81.1%resnest101 top-1: 82.8%resnest200 top-1: 83.9%resnest269 top-1: 84.5%算法输出:用于PyTorch推理的模型。2.2. 训练参数说明名称默认值类型是否必填是否可修改描述do_trainTruebool是否是否做训练,默认训练do_eval_along_trainTruebool是是是否边训练边验证,默认边训练边验证model_nameresnest50stringTrue是模型名称,支持resnest50, resnest101, resnest200, resnest269。lr0.01floatTrue是初始化学习率。epochs60intTrue是训练epoch数,一个epoch代表训练一轮全部数据集batch_size64intTrue是每步训练的图片数量(单卡)。eval_batch_size64intTrue是每步验证的图片数量(单卡)。lr_schedulercosstringTrue是lr更新方式,支持step(分段衰减,每隔lr_step个epoch下降一次),cos(余弦衰减),poly(指数衰减),使用step模式必须提供lr_steplr_step20intFalse是lr_scheduler=step时使用,表示每20个epoch,lr衰减一次, 衰减系数默认为0.1。mixup0.2floatFalse是图像混合比例。mixup是一种对图像进行混类增强的算法,它将不同类之间的图像按比例进行混合,以达到数据增强的目的。label_smoothing0.1floatFalse是标签平滑比例。 将label由原来极端的one hot形式转化为较平滑的形式。减少真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。warmup_epochs5intFalse是预热学习率的epoch数,用于保持模型的稳定性,避免较大的初始化学习率带来的模型震荡,加速模型收敛。rand_augTrueboolFalse是是否增加随机数据增强num_workers8intFalse是加载数据使用的子进程数。do_data_cleaningTrueboolFalse是是否做数据清洗, 数据格式异常会导致训练失败,建议开启,保证训练稳定性。数据量过大时,数据清洗可能耗时较久,可自行线下清洗(支持BMP.JPEG,PNG格式, RGB三通道)。建议用JPEG格式数据。use_daliFalseboolFalse是是否使用dali加速训练accumulation_steps1intFalse是当训练受限于GPU资源时,可累计多个step的梯度模拟大batch size。max_to_keep10intFalse是保存的模型最大个数2.3. 训练输出文件训练完成后的输出文件如下训练输出目录 |- model |- customize_service.py |- index |- config.json |- model.pth |- model_best.pth |- model_0.pth |- model_1.pth |- model_2.pth ... model.pth: 仅保存模型参数,用于推理。model_xx.pth: 保存的最新模型,保存了模型参数,当前训练进度,历史训练、验证精度,以及优化器参数。可用于断点训练(resume traning)。model_best.pth: 与model_xx.pth保存内容相同,但是保存的是精度最高时刻的参数。其他文件均为推理时的依赖文件。3. CPU推理元模型来源 选择 从训练中选择,选择训练作业及版本。4. Ascend310推理待上线。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、中国-香港
-
描述Bert(文本分类/TensorFlow)适用的案例中文文本分类—Bert理论与实践适用的数据集中文语句情感分类(manifest)中文语句情感分类(raw)OBS原始数据集格式仅支持切分的情况有如下几点需要注意需要有两个csv文件,一个train.csv,一个valid.csv当前OBS输入仅支持单标签输入,如有多标签需求,请使用数据管理导入的文件。csv内容格式必须是文本内容在前,label在后,以“TAB”键分隔需要在订阅下来的算中,添加**“task_name=sltf”、labels_list=“label0,label1”**两个超参。your_local_path |- train.csv 这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般 1 ... |- valid.csv 差到一定程度了 不如一个好的二星或没星的宾馆呢 0 ...1. 概述基于BERT预训练模型的文本分类算法,支持单标签文本分类。预训练模型基于Google发布的BERT BASE模型。用户需要在数据管理平台完成标注,该算法会载入预训练模型在用户数据集上做迁移学习。训练后生成的模型可直接在ModelArts平台部署成在线服务,同时支持使用CPU、GPU、Ascend310推理。Ascend310推理需要配置export_d_model参数为True。2. 训练2.1. 算法基本信息任务类型:文本分类支持的框架引擎:Tensorflow-1.13.1-python3.6算法输入:ModelArts数据管理平台发布的文本分类数据集(必须是切分成训练集+验证集的),建议用户以0.8:0.2比例进行切分算法输出:用于TF-Serving推理的saved_model模型2.2. 训练参数说明名称默认值类型是否必填描述num_train_epochs5intFalse训练数据集的次数max_training_time1intFalse最大训练小时数train_batch_size32intFalse每次迭代训练的单卡输入句子数量eval_batch_size32intFalse验证时每步读取的单卡输入句子数量max_seq_length256intFalse输入句子最大长度,同数据集相关,实际输入少于该值会补0,多于该值会被截断,D芯片推理时只支持256和320export_d_modelFalseboolFalse是否导出d推理模型task_typebert_classifierstringTrue临时用于选择算法model_namebert_base_chinesestringTrue临时用于选择预训练模型2.3. 训练输出文件训练完成后的输出文件如下训练输出目录 |- om |- model |- index |- customize_service_d310.py |- model |- variables |- variables.data-00000-of-00001 |- variables.index |- customize_service.py |- index |- config.json |- saved_model.pb |- frozen_graph |- model_d.pb |- checkpoint |- model.ckpt-xxx |- ... |- best_checkpoint |- best_model.ckpt-xxx |- ... |- events... |- graph.pbtxt3. Ascend310推理3.1. 模型转换参数配置转换模板: TF-FrozenGraph-To-Ascend-C32转换输入目录: 选择训练输出目录中的frozen_graph转换输出目录: 选择训练输出目录中的om/model输入张量形状: input_ids:1,256;input_mask:1,256;segment_ids:1,256输入数据格式: NCHW剩余的参数均使用默认值3.2. 模型导入参数配置从模板中选择: ARM-Ascend模板模型目录: 选择训练输出目录中的om/model输入输出模式: 预测分析模式4. GPU/CPU推理元模型来源 选择 从训练中选择,选择训练作业及版本。注意:预测配置文件model/config.json, 默认使用CPU预测镜像(runtime:tf1.xx-python3.x-cpu )。若使用GPU预测,导入模型之前需修改model/config.json文件,将runtime字段修改为:tf1.xx-python3.x-gpu。5. 预测输入、输出格式5.1. 在推理页面预测预测一个文本,在预测输入框输入{"text": "你好"}预测多个文本,在预测输入框输入{"text": ["你好", "再见"]}5.2. 使用curl命令发送预测请求的命令content为实际要推理的文本内容,最大长度跟设置的max_seq_length,大于该字段的会被截断。-H是post命令的headers,Headers的Key值为“X-Auth-Token”,这个名字为固定的, Token值是用户获取到的token值(关于如何获取token,请参考获取请求认证)。POST后面跟随的是在线服务的调用地址。curl -d '{"text":"content"}' -H 'X-Auth-Token:Token值' -H 'Content-type: application/json' -X POST 在线服务地址 5.3. 预测返回结果以json字符串的形式返回请求结果,如下{ "predicted_label": 置信度最高的分类标签, # top1结果 "scores": # top5结果 [score1, score2, score3, score4, score5, ] }交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、中国-香港
-
描述YOLOv5(物体检测/Pytorch训练)适用的案例目标检测—RetinaNet理论与实践目标检测-Yolov5的理论与实践适用的数据集helmet_manifest(物体检测)人车检测行人检测口罩检测钢筋检测1.概述YOLOv5共有s,m,l,x四个模型,相同的数据集场景下,一般YOLOv5-s模型训练和推理性能最佳,YOLOv5-x模型mAP指标最佳。针对提供带有物体框标注的数据集,该算法会预先载入在COCO数据集下训练过的模型,训练后生成的模型可直接在ModelArts平台部署成在线服务,目前支持在CPU/GPU上部署推理。2.算法基本信息适用场景:物体检测支持的框架引擎:Pytorch-1.7.0-python3.6算法输入:ModelArts数据管理平台发布的物体检测数据集,在这里用户必须使用数据切分功能,建议用户以8:2或9:1的比例进行切分,即“训练验证比例“设置为0.8或0.9。YOLOv5的COCO预训练模型。算法输出:用于推理的pt模型和推理脚本。性能:模型batch_size训练FPS(images/sec)推理时延(CPU:2核8GB)推理时延(GPU:1 * NVIDIA-P4(8GB))YOLOv5-s128220145ms/pic18ms/picYOLOv5-m64111550ms/pic27ms/picYOLOv5-l4872698ms/pic40ms/picYOLOv5-x32381225ms/pic73ms/pic训练参数说明名称默认值类型是否可修改描述model_namesstr是模型名称(可选项仅有s,m,l,x)。batch-size32int是每步训练的图片数量(单卡)。epochs50int是训练的epochs数量。img-size640,640str是输入图片的shape大小(宽高都必须能整除32)。workers8int是Pytorch dataloader的进程数。rectFalsestr是是否使用长方形训练(即训练过程中将长宽比相近的图片除去图片冗余部分,并置于同一个batch以加快训练速度,该模式将会关闭dataloader的shuffle),默认设置False。multi-scaleFalsestr是是否使用多尺度训练(即训练过程中img-size的抖动幅度在设置值的+/- 50%,一般用于提升精度但会降低训练的性能,注意设置该模式batch-size一般需要调小不然容易出现OOM),默认设置False。cache-imagesFalsestr是是否预先缓存图片以加快训练速度,默认设置False。sync-bnFalsestr是是否使用SyncBatchNorm,该参数只有在分布式场景下才生效,默认设置False。resumeFalsestr是用于断点训练,默认设置False。增量训练:可设置checkpoint_url为上一个训练作业完成时输出路径(train_url)下的last.pt文件,增量训练作业的输出路径选择一个新的OBS目录。举例:对一个已经完成的训练作业(假设训练了50个epochs),想要训练更多的epochs(追加30个epochs),假设上一个训练作业的输出目录为obs://my_bucket/train_url,则设置参数checkpoint_url=obs://my_bucket/train_url/last.pt,并设置参数epochs=30断点训练:如果训练作业中途发生异常或者被停止,本算法支持断点训练,请保持训练输出路径(train_url)不变,并设置resume参数为True。额外说明:对于已经训练完成的训练作业不支持断点训练,即使第二次训练作业设置一个更大的epochs也不行3.训练输出文件|- model |- models |- xxx.so |- ... |- utils-y |- xxx.so |- ... |- customize_service.py |- config.json |- best.pt |- hyp.yaml |- opt.yaml |- last.pt |- events.out.tfevents.xxx4. CPU/GPU推理“元模型来源”选择“从训练中选择”,选择训练作业及版本。部署在线服务时选择CPU/GPU规格即可。5. 知识蒸馏离线蒸馏,即two stage knowledge distillation,指的是用户需要提前训练一个teacher模型,然后利用这个teacher模型对student模型进行训练,目前ModelArts上的YOLOv5已经支持了该功能,YOLOv5-s 模型蒸馏效果最佳,具体使用流程如下:步骤一:用户按照正常使用AI市场的流程创建一个YOLOv5的训练作业,最好选择YOLOv5-s 模型,该步骤也可以不选择,直接采用下面的步骤进行蒸馏。步骤二:用户需要创建一个teacher网络的训练作业,例如YOLOv5-l ,需要选择精度比步骤一的模型高的,才能有蒸馏的效果。可以看到在输出路径train_url下面有一个model目录,为接下来做准备。步骤三:用户需要重新创建一个YOLOv5-s的作业,另外需要填写三个参数,teacher_model_name,teacher_model_url和use_offline_kd=True,其中teacher_model_url填写的内容是步骤二训练teacher输出路径的目录,注意需要保证输出路径下面的model目录存在,而teacher_model_name就是步骤二填写的 model_name,按照正常创建训练作业即可。至此,用户完成使用离线蒸馏的功能。在训练过程中可能会出现NaN的情况,需要调整蒸馏loss的权重,修改参数kd_cls_loss_weight和kd_box_loss_weight的值,默认kd_cls_loss_weight=2,kd_box_loss_weight=1在日志中会打印loss_soft_cls和loss_soft_box的值,不同的数据集可能会有不同的数量级,一般需要按照自己的数据集通过修改soft_cls_loss和soft_box_loss的值将上述两个loss的值调整到合适的值,比如5以下。备注:使用蒸馏提升精度的前提是,训练的teacher模型的精度比student的精度要高,并且差距越大蒸馏的效果越好。6.案例指导GPU训练+CPU/GPU推理,案例指导请参见使用AI市场的预置算法训练模型。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、中国-香港
-
描述Reinforcement Learning(强化学习预置算法)1. 概述该强化学习预置算法中,为用户提供了常用的强化学习算法,目前包括五个常用算法(DQN、PPO、A2C、IMPALA以及APEX)。用户订阅之后,选择算法只需设置对应参数,即可很方便地创建训练作业,开始训练相应的强化学习环境(内置环境或自定义环境)。训练后生成的模型可直接在ModelArts平台部署为在线服务,支持推理。2. 算法基本信息任务类型:强化学习支持的框架引擎:Tensorflow-1.13.0-python3.6(ray-0.7.4)支持的环境:classic_control, atari, toy_text算法输入:若使用内置环境,无需输入数据,可以选择一个空文件夹或位置即可。若使用自定义的环境时,输入为用户实现自定义环境的代码所在的文件夹路径信息, 目录结构示例如下。更详细设置参考“自定义环境训练示例”文档。训练输入目录 |- __init__.py |- custom_env_name |- custom_env_name.py |- custom_model.py__init__.py控制从custom_env和custom_model中导入模块,示例如下所示: from .custom_env import create_custom_env from .custom_model import CustomNetwork all__=["create_custom_env","CustomNetwork"]custom_env.py中为gym.Env类型的环境和create_custom_env函数,示例如下所示: class CusEnv(gym.Env): ... def create_custom_env(env_config): custom_env=CusEnv() return custom_envcustom_model.py用来自定义模型,示例如下所示: class CustomNetwork(Model): ...算法输出:训练保存的模型、参数文件、checkponit等文件。训练参数名称默认值类型是否必填是否可修改描述use_preset_envTruebool是是是否选用内置环境。preset_env_idCartPole-v0string是是所用环境ID(在选用内置环境前提下才有效)。use_custom_modelFalsebool是是是否使用自定义模型(用户自定义环境,同时需要使用自定义模型时,需要设置为True)。stop_criteriontimesteps_totalstring是是训练停止准则,目前支持四种[timesteps_total, episodes_total, time_total_s, episode_reward_mean]。stop_value100000int是是停止准则对应的次数。如果设置不同的停止准则,该参数也应设置为对应的合适值。checkpoint_freq20int是是checkpoint保存的频率。rl_toolkitrllibstring否否选取使用的框架,目前仅支持rllib。rl_algorithmdqnstring是是选取训练算法,支持的算法[dqn, ppo, impala, a2c, apex]。data_urlNonestring是是数据(自定义环境代码)存储的位置。train_urlNonestring是是训练结果输出的地址。log_urlNonestring否是训练日志保存地址。num_gpus0int是是GPU数目。num_cpus1int是是CPU数目。redis_addresslocalhost:6379string否是redis数据库地址信息 。model_nameNonestring否是自定义模型名字。gamma0.99float否是折扣率。lr0.00003float是是学习率。sample_batch_size64int否是采样样本大小。train_batch_size64int否是训练样本大小,如果修改默认值,需要保证训练样本的值大于等于采样样本的值。内置环境可选ID环境类型类型说明具体环境IDAlgorithms不同的算法任务Copy-v0 RepeatCopy-v0 ReversedAddition-v0 ReversedAddition3-v0 DuplicatedInput-v0 Reverse-v0Toy text简单地基于文本的玩具环境Blackjack-v0 FrozenLake-v0 FrozenLake8x8-v0 NChain-v0 Roulette-v0 Taxi-v3 GuessingGame-v0 HotterColder-v0Classic control经典强化学习文献中不同的控制理论任务CartPole-v0 CartPole-v1 MountainCar-v0 MountainCarContinuous-v0 Pendulum-v0 Acrobot-v1 LunarLander-v2 LunarLanderContinuous-v2 BipedalWalker-v3 BipedalWalkerHardcore-v3 CarRacing-v0Atari-Games不同的Atari电子游戏环境AirRaid-v0 Centipede-v0 Pitfall-v0 Venture-v0 CrazyClimber-v0 ElevatorAction-v0 Assault-v0 Pooyan-v0 Gravitar-v0 BankHeist-v0 Tennis-v0 Alien-v0 Atlantis-v0 DoubleDunk-v0 Adventure-v0 Solaris-v0 Bowling-v0 SpaceInvaders-v0 Boxing-v0 Robotank-v0 IceHockey-v0 KungFuMaster-v0 Freeway-v0 Krull-v0 Pong-v0 MsPacman-v0 Defender-v0 Phoenix-v0 Enduro-v0 WizardOfWor-v0 DemonAttack-v0 Riverraid-v0 Asterix-v0 Berzerk-v0 BeamRider-v0 Amidar-v0 Jamesbond-v0 MontezumaRevenge-v0 UpNDown-v0 JourneyEscape-v0 Skiing-v0 StarGunner-v0 VideoPinball-v0 BattleZone-v0 Tutankham-v0 RoadRunner-v0 Carnival-v0 Zaxxon-v0 Hero-v0 ChopperCommand-v0 NameThisGame-v0 Asteroids-v0 Qbert-v0 Frostbite-v0 YarsRevenge-v0 PrivateEye-v0 Seaquest-v0 TimePilot-v0 Gopher-v0 FishingDerby-v0 Breakout-v0 Kangaroo-v0stop_criterion及stop_value参数设置说明stop_criterion参数含义设置stop_value说明timesteps_total总的时间步默认1000次环境交互调用优化器更新一次参数,该参数设置总的时间步,建议设置1000的整数倍。episodes_total总的训练episode训练周期数和参数更新次数不对应,更新参数以时间步为基准,不同环境,在相同时间步对应episode也不相同。time_total_s总时长单位秒,每一次迭代对应一定的时长,该参数设置总的训练时长。episode_reward_mean每个episode获得平均奖励。对于不同环境,获得奖励的数值、难易程度、取值范围等都不同,需要根据具体环境设置合适的stop_value。3. 训练输出文件训练完成后的输出文件如下训练输出目录 |- Algorithm_Env_Name |- checkpoint_n |- checkpoint-n.tune_mettadata |- checkpoint-n |- params.okl |- params.pkl |- params.json |- progress.csv |- result.json |- model |- variables |- variables.data-00000-of-00001 |- variables.index |- customize_service.py |- config.json |- saved_model.pb |- experiment_state.json4. 部署在线服务与推理4.1. 部署在线服务在模型管理模块导入模型之后,可以将模型部署成在线服务。其中,“元模型来源”选择“从训练中选择”,选择训练作业及版本, 系统会自动读取对应路径下的Python文件信息。模型推理时,输入需要满足一定的格式要求,需要是json格式体。不同的算法,所需要的参数也不相同,使用时要结合具体情况。可选的五种算法不同的输入实例。 说明: 1.对于不同的环境,其环境状态不同,对应的“observations”维度就不同,应用推理时需要明确; 2.在线部署推理仅为单步预测,若想实现完整的游戏推理,需要使用训练保存的模型,编写相应的推理程序。 DQN算法: { "seq_lens": [0], "is_training": "False", "observations": [[0.02160617659181513, 0.022702596137138, -0.026817784180154104, 0.04523499832683836]] } PPO算法: { "is_training": "False", "observations": [[0.02160617659181513, 0.022702596137138, -0.026817784180154104, 0.04523499832683836]], "prev_action": [0], "prev_reward": [0.0], "seq_lens": [0] } IMPALA算法: { "is_training": "False", "observations": [[0.02160617659181513, 0.022702596137138, -0.026817784180154104, 0.04523499832683836]], "prev_action": [0], "prev_reward": [0.0], "seq_lens": [0] } A2C算法: { "is_training": "False", "observations": [[0.02160617659181513, 0.022702596137138, -0.026817784180154104, 0.04523499832683836]], "prev_action": [0], "prev_reward": [0.0], "seq_lens": [0] } APEX算法: { "seq_lens": [0], "is_training": "False", "observations": [[0.02160617659181513, 0.022702596137138, -0.026817784180154104, 0.04523499832683836]] } 4.2. 推理输出推理输出内容实例如下所示。DQN、APEX算法: { "actions": [1], "q_values": [0.1, 0.9] } A2C、PPO算法: { 'actions': [1], 'action_prob': [0.50440347194], 'action_logp': [-0.6843788027], 'vf_preds': [0.005004595965] } IMPALA算法: { 'actions': [1], 'action_prob': [0.50440347194], 'action_logp': [-0.6843788027], 'behaviour_logits': [0.005004595965, 0.0,411932617] }交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、中国-香港您可以在华为云ModelArts控制台直接使用资产,但无法下载资产
-
本文分享自华为云社区《[全卷积网络(FCN)实战:使用FCN实现语义分割](https://bbs.huaweicloud.com/blogs/337081?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)》,作者: AI浩。 FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。 下图是语义分割所采用的全卷积网络(FCN)的结构示意图:  # 传统的基于CNN的分割方法缺点? 传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入,用于训练与预测,这种方法主要有几个缺点: 1)存储开销大,例如,对每个像素使用15 * 15的图像块,然后不断滑动窗口,将图像块输入到CNN中进行类别判断,因此,需要的存储空间随滑动窗口的次数和大小急剧上升; 2)效率低下,相邻像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算有很大程度上的重复; 3)像素块的大小限制了感受区域的大小,通常像素块的大小比整幅图像的大小小很多,只能提取一些局部特征,从而导致分类性能受到限制。 而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。 # FCN改变了什么? 对于一般的分类CNN网络,如VGG和Resnet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。 而FCN提出可以把后面几个全连接都换成卷积,这样就可以获得一张2维的feature map,后接softmax层获得每个像素点的分类信息,从而解决了分割问题,如图4。  # FCN缺点 (1)得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。 (2)对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。 # 数据集 本例的数据集采用PASCAL VOC 2012 数据集,它有二十个类别: **Person:**person Animal: bird, cat, cow, dog, horse, sheep **Vehicle:**aeroplane, bicycle, boat, bus, car, motorbike, train Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor  下载地址:The PASCAL Visual Object Classes Challenge 2012 (VOC2012) (ox.ac.uk)。 数据集的结构: VOCdevkit └── VOC2012 ├── Annotations 所有的图像标注信息(XML文件) ├── ImageSets │ ├── Action 人的行为动作图像信息 │ ├── Layout 人的各个部位图像信息 │ │ │ ├── Main 目标检测分类图像信息 │ │ ├── train.txt 训练集(5717) │ │ ├── val.txt 验证集(5823) │ │ └── trainval.txt 训练集+验证集(11540) │ │ │ └── Segmentation 目标分割图像信息 │ ├── train.txt 训练集(1464) │ ├── val.txt 验证集(1449) │ └── trainval.txt 训练集+验证集(2913) │ ├── JPEGImages 所有图像文件 ├── SegmentationClass 语义分割png图(基于类别) └── SegmentationObject 实例分割png图(基于目标) 数据集包含物体检测和语义分割,我们只需要语义分割的数据集,所以可以考虑把多余的图片删除,删除的思路: 1、获取所有图片的name。 2、获取所有语义分割mask的name。 3、求二者的差集,然后将差集的name删除。 代码如下: import glob import os image_all = glob.glob('data/VOCdevkit/VOC2012/JPEGImages/*.jpg') image_all_name = [image_file.replace('\\', '/').split('/')[-1].split('.')[0] for image_file in image_all] image_SegmentationClass = glob.glob('data/VOCdevkit/VOC2012/SegmentationClass/*.png') image_se_name= [image_file.replace('\\', '/').split('/')[-1].split('.')[0] for image_file in image_SegmentationClass] image_other=list(set(image_all_name) - set(image_se_name)) print(image_other) for image_name in image_other: os.remove('data/VOCdevkit/VOC2012/JPEGImages/{}.jpg'.format(image_name)) # 代码链接 本例选用的代码来自deep-learning-for-image-processing/pytorch_segmentation/fcn at master · WZMIAOMIAO/deep-learning-for-image-processing (github.com) 其他的代码也有很多,这篇比较好理解! 其实还有个比较好的图像分割库:GitHub - qubvel/segmentation_models.pytorch: Segmentation models with pretrained backbones. PyTorch. 这个图像分割集合由俄罗斯的程序员小哥Pavel Yakubovskiy一手打造。在后面的文章,我也会使用这个库演示。 # 项目结构 1. ├── src: 模型的backbone以及FCN的搭建 2. ├── train_utils: 训练、验证以及多GPU训练相关模块 3. ├── my_dataset.py: 自定义dataset用于读取VOC数据集 4. ├── train.py: 以fcn_resnet50(这里使用了Dilated/Atrous Convolution)进行训练 5. ├── predict.py: 简易的预测脚本,使用训练好的权重进行预测测试 6. ├── validation.py: 利用训练好的权重验证/测试数据的mIoU等指标,并生成record_mAP.txt文件 7. └── pascal_voc_classes.json: pascal_voc标签文件 由于代码很多不能一一讲解,所以,接下来对重要的代码做剖析。 # 自定义数据集读取 my_dataset.py自定义数据读取的方法,代码如下: import os import torch.utils.data as data from PIL import Image class VOCSegmentation(data.Dataset): def __init__(self, voc_root, year="2012", transforms=None, txt_name: str = "train.txt"): super(VOCSegmentation, self).__init__() assert year in ["2007", "2012"], "year must be in ['2007', '2012']" root = os.path.join(voc_root, "VOCdevkit", f"VOC{year}") root=root.replace('\\','/') assert os.path.exists(root), "path '{}' does not exist.".format(root) image_dir = os.path.join(root, 'JPEGImages') mask_dir = os.path.join(root, 'SegmentationClass') txt_path = os.path.join(root, "ImageSets", "Segmentation", txt_name) txt_path=txt_path.replace('\\','/') assert os.path.exists(txt_path), "file '{}' does not exist.".format(txt_path) with open(os.path.join(txt_path), "r") as f: file_names = [x.strip() for x in f.readlines() if len(x.strip()) > 0] self.images = [os.path.join(image_dir, x + ".jpg") for x in file_names] self.masks = [os.path.join(mask_dir, x + ".png") for x in file_names] assert (len(self.images) == len(self.masks)) self.transforms = transforms 导入需要的包。 定义VOC数据集读取类VOCSegmentation。在init方法中,核心是读取image列表和mask列表。 def __getitem__(self, index): img = Image.open(self.images[index]).convert('RGB') target = Image.open(self.masks[index]) if self.transforms is not None: img, target = self.transforms(img, target) return img, target __getitem__方法是获取单张图片和图片对应的mask,然后对其做数据增强。 def collate_fn(batch): images, targets = list(zip(*batch)) batched_imgs = cat_list(images, fill_value=0) batched_targets = cat_list(targets, fill_value=255) return batched_imgs, batched_targets collate_fn方法是对一个batch中数据调用cat_list做数据对齐。 在train.py中torch.utils.data.DataLoader调用 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, num_workers=num_workers, shuffle=True, pin_memory=True, collate_fn=train_dataset.collate_fn) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1, num_workers=num_workers, pin_memory=True, collate_fn=val_dataset.collate_fn) # 训练 # 重要参数 打开train.py,我们先认识一下重要的参数: def parse_args(): import argparse parser = argparse.ArgumentParser(description="pytorch fcn training") # 数据集的根目录(VOCdevkit)所在的文件夹 parser.add_argument("--data-path", default="data/", help="VOCdevkit root") parser.add_argument("--num-classes", default=20, type=int) parser.add_argument("--aux", default=True, type=bool, help="auxilier loss") parser.add_argument("--device", default="cuda", help="training device") parser.add_argument("-b", "--batch-size", default=32, type=int) parser.add_argument("--epochs", default=30, type=int, metavar="N", help="number of total epochs to train") parser.add_argument('--lr', default=0.0001, type=float, help='initial learning rate') parser.add_argument('--momentum', default=0.9, type=float, metavar='M', help='momentum') parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, metavar='W', help='weight decay (default: 1e-4)', dest='weight_decay') parser.add_argument('--print-freq', default=10, type=int, help='print frequency') parser.add_argument('--resume', default='', help='resume from checkpoint') parser.add_argument('--start-epoch', default=0, type=int, metavar='N', help='start epoch') # 是否使用混合精度训练 parser.add_argument("--amp", default=False, type=bool, help="Use torch.cuda.amp for mixed precision training") args = parser.parse_args() return args data-path:定义数据集的根目录(VOCdevkit)所在的文件夹 num-classes:检测目标类别数(不包含背景)。 aux:是否使用aux_classifier。 device:使用cpu还是gpu训练,默认是cuda。 batch-size:BatchSize设置。 epochs:epoch的个数。 lr:学习率。 resume:继续训练时候,选择用的模型。 start-epoch:起始的epoch,针对再次训练时,可以不需要从0开始。 amp:是否使用torch的自动混合精度训练。 # 数据增强 增强调用transforms.py中的方法。 训练集的增强如下: class SegmentationPresetTrain: def __init__(self, base_size, crop_size, hflip_prob=0.5, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)): # 随机Resize的最小尺寸 min_size = int(0.5 * base_size) # 随机Resize的最大尺寸 max_size = int(2.0 * base_size) # 随机Resize增强。 trans = [T.RandomResize(min_size, max_size)] if hflip_prob > 0: #随机水平翻转 trans.append(T.RandomHorizontalFlip(hflip_prob)) trans.extend([ #随机裁剪 T.RandomCrop(crop_size), T.ToTensor(), T.Normalize(mean=mean, std=std), ]) self.transforms = T.Compose(trans) def __call__(self, img, target): return self.transforms(img, target) 训练集增强,包括随机Resize、随机水平翻转、随即裁剪。 验证集增强: class SegmentationPresetEval: def __init__(self, base_size, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)): self.transforms = T.Compose([ T.RandomResize(base_size, base_size), T.ToTensor(), T.Normalize(mean=mean, std=std), ]) def __call__(self, img, target): return self.transforms(img, target) 验证集的增强比较简单,只有随机Resize。 # Main方法 对Main方法,我做了一些修改,修改的代码如下: #定义模型,并加载预训练 model = fcn_resnet50(pretrained=True) # 默认classes是21,如果不是21,则要修改类别。 if num_classes != 21: model.classifier[4] = torch.nn.Conv2d(512, num_classes, kernel_size=(1, 1), stride=(1, 1)) model.aux_classifier[4] = torch.nn.Conv2d(256, num_classes, kernel_size=(1, 1), stride=(1, 1)) print(model) model.to(device) # 如果有多张显卡,则使用多张显卡 if torch.cuda.device_count() > 1: print("Let's use", torch.cuda.device_count(), "GPUs!") model = torch.nn.DataParallel(model) 模型,我改为pytorch官方的模型了,如果能使用官方的模型尽量使用官方的模型。 默认类别是21,如果不是21,则要修改类别。 检测系统中是否有多张卡,如果有多张卡则使用多张卡不能浪费资源。 如果不想使用所有的卡,而是指定其中的几张卡,可以使用: `os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'` 也可以在DataParallel方法中设定: `model = torch.nn.DataParallel(model,device_ids=[0,1])` 如果使用了多显卡,再使用模型的参数就需要改为model.module.xxx,例如: params = [p for p in model.module.aux_classifier.parameters() if p.requires_grad] params_to_optimize.append({"params": params, "lr": args.lr * 10}) 上面的都完成了就可以开始训练了,如下图:  # 测试 在开始测试之前,我们还要获取到调色板,新建脚本get_palette.py,代码如下: import json import numpy as np from PIL import Image # 读取mask标签 target = Image.open("./2007_001288.png") # 获取调色板 palette = target.getpalette() palette = np.reshape(palette, (-1, 3)).tolist() print(palette) # 转换成字典子形式 pd = dict((i, color) for i, color in enumerate(palette)) json_str = json.dumps(pd) with open("palette.json", "w") as f: f.write(json_str) 选取一张mask,然后使用getpalette方法获取,然后将其转为字典的格式保存。 接下来,开始预测部分,新建predict.py,插入以下代码: import os import time import json import torch from torchvision import transforms import numpy as np from PIL import Image from torchvision.models.segmentation import fcn_resnet50 导入程序需要的包文件,然在mian方法中: def main(): aux = False # inference time not need aux_classifier classes = 20 weights_path = "./save_weights/model_5.pth" img_path = "./2007_000123.jpg" palette_path = "./palette.json" assert os.path.exists(weights_path), f"weights {weights_path} not found." assert os.path.exists(img_path), f"image {img_path} not found." assert os.path.exists(palette_path), f"palette {palette_path} not found." with open(palette_path, "rb") as f: pallette_dict = json.load(f) pallette = [] for v in pallette_dict.values(): pallette += v - 定义是否需要aux_classifier,预测不需要aux_classifier,所以设置为False。 - 设置类别为20,不包括背景。 - 定义权重的路径。 - 定义调色板的路径。 - 读去调色板。 接下来,是加载模型,单显卡训练出来的模型和多显卡训练出来的模型加载有区别,我们先看单显卡训练出来的模型如何加载。 model = fcn_resnet50(num_classes=classes+1) print(model) # 单显卡训练出来的模型,加载 # delete weights about aux_classifier weights_dict = torch.load(weights_path, map_location='cpu')['model'] for k in list(weights_dict.keys()): if "aux_classifier" in k: del weights_dict[k] # load weights model.load_state_dict(weights_dict) model.to(device) 定义模型fcn_resnet50,num_classes设置为类别+1(背景) 加载训练好的模型,并将aux_classifier删除。 然后加载权重。 再看多显卡的模型如何加载 # create model model = fcn_resnet50(num_classes=classes+1) model = torch.nn.DataParallel(model) # delete weights about aux_classifier weights_dict = torch.load(weights_path, map_location='cpu')['model'] print(weights_dict) for k in list(weights_dict.keys()): if "aux_classifier" in k: del weights_dict[k] # load weights model.load_state_dict(weights_dict) model=model.module model.to(device) 定义模型fcn_resnet50,num_classes设置为类别+1(背景),将模型放入DataParallel类中。 加载训练好的模型,并将aux_classifier删除。 加载权重。 执行torch.nn.DataParallel(model)时,model被放在了model.module,所以model.module才真正需要的模型。所以我们在这里将model.module赋值给model。 接下来是图像数据的处理 # load image original_img = Image.open(img_path) # from pil image to tensor and normalize data_transform = transforms.Compose([transforms.Resize(520), transforms.ToTensor(), transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))]) img = data_transform(original_img) # expand batch dimension img = torch.unsqueeze(img, dim=0) 加载图像。 对图像做Resize、标准化、归一化处理。 使用torch.unsqueeze增加一个维度。 完成图像的处理后,就可以开始预测了。 model.eval() # 进入验证模式 with torch.no_grad(): # init model img_height, img_width = img.shape[-2:] init_img = torch.zeros((1, 3, img_height, img_width), device=device) model(init_img) t_start = time_synchronized() output = model(img.to(device)) t_end = time_synchronized() print("inference+NMS time: {}".format(t_end - t_start)) prediction = output['out'].argmax(1).squeeze(0) prediction = prediction.to("cpu").numpy().astype(np.uint8) np.set_printoptions(threshold=sys.maxsize) print(prediction.shape) mask = Image.fromarray(prediction) mask.putpalette(pallette) mask.save("test_result.png") 将预测后的结果保存到test_result.png中。查看运行结果: 原图:  结果:  打印出来的数据:  类别列表: { "aeroplane": 1, "bicycle": 2, "bird": 3, "boat": 4, "bottle": 5, "bus": 6, "car": 7, "cat": 8, "chair": 9, "cow": 10, "diningtable": 11, "dog": 12, "horse": 13, "motorbike": 14, "person": 15, "pottedplant": 16, "sheep": 17, "sofa": 18, "train": 19, "tvmonitor": 20 } 从结果来看,已经预测出来图像上的类别是“train”。 # 总结 这篇文章的核心内容是讲解如何使用FCN实现图像的语义分割。 在文章的开始,我们讲了一些FCN的结构和优缺点。 然后,讲解了如何读取数据集。 接下来,告诉大家如何实现训练。 最后,是测试以及结果展示。 希望本文能给大家带来帮助。 完整代码: https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/83778007
-
目前,“联邦学习”这一术语在市场上存在很多认识上的误解和混淆,主要原因是其既在广义上表达了保护数据前提下联合多方数据训练模型的需求,又在狭义上表示了一类通过暴露部分数据信息来提升训练性能的方法。有趣的是,作为广义上的需求,它强调为了保护数据安全,可以牺牲部分准确性;但作为狭义的方法,它反而强调通过牺牲安全来换取性能提升。一、初心:联邦学习拟解决的问题1.联邦学习的广义定义:解决联合建模的问题或需求随着人工智能等技术应用的发展与普及,基于机器学习的智能营销及风控等应用迅速兴起。但是,由于明文数据应用引起的数据泄露及滥用等问题日益突出,多国家地区陆续出台数据隐私保护政策,导致诸多金融机构在在进行机器学习任务时面临着数据瓶颈问题,即需要更多数据训练得到更准确的模型。此处,更多数据意味着:(1)更多样本点,以减少模型偏差(bias),提升模型质量;(2)更多标签(如银行信贷业务场景中的客户逾期判断),以提升模型准确度;(3)更多维度,以更全面刻画某一对象。然而,上述额外数据经常由不同主体持有,且往往具有高敏感性,难以被共享,导致多方数据源联合建模的需求无法被满足。从广义上讲,能够满足多个数据方联合建模需求的机器学习方法为 “联邦学习”。因此,广义上的联邦学习是一个问题,或者说是需求,而不是一种技术或解决方案。事实上,这一需求在多年前就已有解决方案。在密码理论领域,采用多方数据训练模型是多方安全计算技术的一个具体应用。理论上讲,我们可以用一个“多方计算”(也叫多方安全计算,Multi-party Computation, MPC)的方案描述整个训练过程;在数据挖掘领域,学者们很早就提出了如k-匿名、差分隐私等方法;在硬件领域,人们试图做出更可信的硬件芯片来保证数据不泄露;近期,研究人员及金融机构也尝试采取迁移学习等手段,试图隐藏和个人相关的敏感信息。2.联邦学习的狭义定义:一类特定算法然而现在市场上,联邦学习这一术语被局限于一个更狭义的定义。市场上普遍认为,联邦学习是和多方安全计算、可信执行环境、差分隐私等并列的一种隐私保护计算技术,这实际上采用的是一种狭义的定义。这种定义下的联邦学习特指一类算法,其本质特征是在多个数据控制方运行,能够让各数据方之间只交换了某些模型训练的中间数据。若假设这些被交换的数据不包含敏感信息,那么这个模型的训练过程就能达到人们想要的数据隐私保护目标。然而这个假设是否真实成立,目前尚无理论上的证明。狭义的联邦学习作为一种独特的方法被提出,其主要动机是试图在此前的几种方法中取得一种平衡,即解决如下问题:(1)多方计算等密码学方法的计算和通讯开销高;(2)k-匿名暴露信息过多;(3)在原始数据上加入差分隐私需要的噪声对于多次迭代的机器学习结果的准确度影响大;(4)硬件可信程度未知。因此,狭义联邦学习的主要目标是试图通过有选择地暴露一些信息,从而实现训练精度、训练速度和数据隐私安全的平衡。本文下述“联邦学习”均是基于这一狭义意义上的方法。二、设计:联邦学习理论上的挑战相比其它隐私保护计算技术,联邦学习的本质特征是暴露某些中间数据,并假设这些数据不泄露敏感信息。然而越来越多的研究发现,这一假设未必成立。1.联邦学习安全性存疑联邦学习过程中虽然没有发送任何原始数据,但其暴露的数据主要有两类:一是模型迭代训练中每轮的中间结果,二是在纵向联邦学习中暴露的双方数据交集中的元素。这一节着重探讨第一类数据暴露,第二类将在第三节中讨论。一个常见的认知误区是,不发送原始数据,做到“数据不动”就是安全的。此处其实有个非常强的安全假设,即联邦学习每次迭代中暴露的中间结果不会泄露有价值的信息。然而,很多工作均已证明此安全假设难以达到。联邦学习每次迭代均会暴露中间结果,这一中间结果可能是每方提供的梯度,或者是多方聚合的梯度,或者是一个本轮结束之后的模型中间结果。此处的核心问题在于,中间结果是一个高维的向量或矩阵,其在很多模型里往往缺少可解释性。一个参与方可以根据这些暴露的结果以及结果之间的差异性去推算一些不应暴露的信息[1][2][3][4]。中间结果具体会泄露什么信息很难确定,因此其安全性无法得到证明。有一些针对这一问题“打补丁”的方法,例如利用密码学方法来计算梯度聚合。但无论如何加密,联邦学习都不可避免地会向各方暴露一个本轮迭代训练的中间结果,否则就失去了这一方法的核心价值,即通过暴露这个结果,减少加密,从而平衡计算代价与安全。另外一些方法利用差分隐私给中间结果加一些噪声,但这对于最终训练结果的准确性影响也是未知的。当然,一个观察是,参与方数量的增多会缓解噪音对准确性的影响。Google最初提出联邦学习应用在2C场景中,含有大量客户端,参与方数量庞大,每个参与方加上一些专门设计的噪声(噪声会互相抵消),从而同时保证了数据隐私安全及计算准确性。但是这一方法对于只有少量参与方的情况是否有效,以及究竟可满足多少参与方的模型训练的准确性,往往与具体数据和模型相关,通用的方法仍有待探索。更为深层次的问题是,联邦学习所专注的数据隐私保护一般定义在“原始数据不暴露”的层面上。然而,实践中需要保护的数据特定使用价值,在很多情况下取决于于统计信息,例如某企业的平均薪资水平、订单数,某金融机构的投资总额等。联邦学习过程中交换的高维向量显然泄露了大量的统计信息。至于具体泄露了哪些统计信息,以及泄露这些信息的危害,一般与具体场景有关,因而难以判断,极易形成“虚假的安全感”。无数信息安全领域的实践证明,虚假的安全比没有安全造成的后果更加严重。缓解该问题(当然不是根本性的彻底解决)的一种思路是定义一种通用的明、密文混合计算方式,并根据不同的场景需求(如安全需求、性能需求等)灵活地选择可以暴露什么信息,以及必须隐藏什么信息。也就是说,即使对于同一种机器学习算法,由于应用场景不同,建模参与方也需要对算法的明文计算部分和密文计算部分进行适配性的规划和调整。2.联邦学习的特性机制引致更大造假风险联邦学习和很多隐私保护计算技术都基于一种“半诚实”的假设。从直观上看,半诚实假设意味着参与方虽有可能偷看或者泄露其他方的数据,但他们均会遵守协议,即不会对数据造假。理论上,半诚实是一个安全假设,但在实践中,产业界应建立切实有效的机制引导和制约使各参与方遵守协议。其中重要的一类方法是通过监管,让不诚实的行为被发现和被举证,以遏制参与方的造假意图。另一类方法是让不诚实行为造成的不良后果尽量少(例如只是让计算不能进行下去了,或者参与方都知道结果是错的等等)。 但遗憾的是,联邦学习的分布式特点以及安全聚合机制往往让数据造假变得更容易,更难被发现和举证[5][6][7][8][9]。传统数据挖掘算法无论是检测数据造假还是容忍错误数据,均依赖于数据中内生的冗余信息,以及人们的先验知识。由于联邦学习交换的中间信息是高度凝练的统计信息,数据中缺乏冗余,又缺乏可解释性,这些被传递的中间结果是否是捏造的假数据难以判断。另外,攻击者亦可通过加工假数据以逃避异常值检测[10],从而对全局模型进行投毒攻击。由于当前市面上许多方法使用了一种仅支持加法操作的半同态加密算法来保护各方提供的梯度,造假的检测能力进一步丧失。退一步说,即使造假行为被发现,造假方依然可以抵赖说这些假数据就是自己的数据随机采样算出来的。因此,其发送的数据是恶意造假结果,还是随机抽样造成的噪声,理论上难以区分。更为严重的是,每方的中间结果对于模型的训练影响都很大,因此每一方都可以通过构造“有毒数据”来控制整个模型的训练结果,例如在模型中留一个后门(即某些特定样本的推理完全受恶意一方的控制)。相比于传统的模型训练,在联邦学习过程中更难举证这一后门是哪一方下毒造成的。许多研究已经证明,这样的攻击在横向联邦学习中广泛存在[10][11][12][13]][14],此类攻击方法在纵向联邦学习中也已经被发现。《周易》上说,“慢藏诲盗”,意思是不把东西藏好了,就是教唆别人偷盗。一项技术不应让造假变得更易实现且更难被发现,因此联邦学习在这一方面仍需要很多改进。从监管角度看,目前缓解上述问题的一种思路是,采取一些方法来强化联邦学习的中心管控功能,具体包括:(1)除了参数聚合,将更多的计算逻辑纳入中心化可监管的范畴;(2)使用支持密文复杂计算逻辑的密码学技术,如秘密分享(secret sharing),最大程度上通过密文来分析数据的“造假”特征;(3)引入第三方独立行使计算或监管职责,鼓励针对高价值、敏感数据的场内流通方式,而不仅仅在联邦学习参与方之间进行计算;(4)使用存证机制,增强事后回溯和举证能力。3.现有联邦学习下的数据共享缺乏公平性数据公平共享机制对于保障金融业数据生态的有序、健康发展至关重要。数据共享应用过程涉及多参与方交换信息,往往存在各参与方贡献度及获益程度不一的问题。在此背景下,基于联邦学习或其它隐私保护计算技术的数据共享应用需辅以合理的公平机制,在保护一定数据隐私的同时保障数据共享的公平性,以激励不同类型机构共建合作共赢的金融数据生态。以两方联邦学习场景为例,在一个公平的模式下,参与方希望共同获得一个模型,双方要么获得了相同的价值,或者获得价值少的一方能够获得额外的补偿。然而,现有联邦学习框架并不能达到这个效果,反而会导致数据多的一方获益更大。当前,国内联邦学习主要应用场景是纵向联邦学习,其第一步是隐私求交(PSI),会将交集结果暴露出来。事实上,理论上的PSI方法,本身可以保护交集结果,但是如果不暴露交集,后续计算无法实现联邦学习减少加密数据量的目的,因此我国业界常见做法就是把交集暴露出来。例如在金融场景中,一个大型互联网公司拥有10亿用户上网数据,一个银行拥有1000万用户金融数据。互联网公司由于已拥有几乎所有客户的信息,并不在乎暴露交集。因此,其通过联邦学习可获得1000万个银行客户及相应标签,以后无需依赖银行数据亦可对该客户群进行精准营销等。银行虽然也能够得知自身与互联网产品的重叠客群,但此信息显然没有太大价值,因为绝大多数用户都是这个互联网产品的用户,这一信息无需模型训练也能得知。如此一来,银行泄露了自身客户的信息,换来了一个其无法单独使用的模型,因为该模型需要输入互联网公司拥有的数据维度才能使用,因而银行在数据方面仍然存在被互联网企业卡脖子的风险。显然,这个交易是不公平的。更为有趣的是,在当前的市场环境下,往往是数据少的金融机构向数据多的互联网企业付费,加剧了这一不公平性。因此,纵向联邦学习技术有利于拥有大量数据的公司获取数据量相对较小的公司的数据信息。这样的“联邦”,实际上成为了大公司数据垄断的延伸,难以实现公平合作的共赢生态。对于上述场景,理想的方式是双方不暴露基于隐私求交得到的交集,在不暴露的交集上继续完成后续机器学习过程,乃至后续推理的过程。然而,这样做会完全损失联邦学习暴露中间结果而带来的性能优化。一个可行的解决方式也许是允许多种类型的参与方角色加入,促进金融数据生态和业务形态全面发展。比如,可以由小公司作为数据使用方提出联合建模需求;也可以让专门从事算法研究的参与方加入,通过贡献算法模型获取收益等。这样每一方都可以贡献自己的专长,同时也能够使用他方的资源信息为自己服务。通过这样不断创新的技术应用方式,丰富业务发展模式,逐步构建良性循环的数据生态环境。三、实现:联邦学习在系统工程与运维上的挑战在金融应用中,目前联邦学习在工程上的架构是一种多个数据源直接互联进行计算的模式。这一模式给现有的私有云和企业网络的部署带来了额外挑战。这些挑战具体体现在网络安全、算力可扩展性、易用性和可监管性等方面。1.算力与原始数据的耦合,带来部署时网络安全与算力扩展的挑战联邦学习的主要算力都与原始数据源部署在一起,造成两个问题,即企业防火墙配置的问题和算力可扩展性的问题。一般来说,大数据平台位于企业内部的后台,应部署在企业防火墙内,不应从外网直接访问。联邦学习的软件模块需要直接访问原始明文大数据(端上的迭代需要在明文上进行),因此也需要进行企业内网的部署。然而,在训练过程中,不同数据源方的软件模块需要频繁互相通讯,因此需要在防火墙上对外暴露网络端口。这一部署模式给企业的网络和信息安全带来了额外挑战。另一种部署方式是将联邦学习软件模块部署在企业防火墙外的DMZ区域(demilitarized zone,隔离区)中,让联邦学习软件跨过防火墙与内网中的大数据系统交换任务。这一部署模式安全性略好,但仍然需要给一个处于较低安全区(DMZ)中,且暴露网络端口的联邦学习模块授权许多内网大数据平台的访问权限,一旦这个模块被黑客攻破,后果会非常严重。另外,联邦学习主要计算都发生在数据源端,数据源需要的算力与其数据量和计算复杂度成正比。因此每个参与方都需要部署相应的计算能力,具备计算资源的可扩展性。联邦学习的稳定运行,也依赖于每一参与方的计算执行可靠性。这种跨多个参与方的计算资源调度和容错机制,与通常的云计算等有显著差别。目前尚缺乏这方面的可靠的系统设计方案。一种解决思路是,将一部分计算功能独立出来(比如参数聚合功能),在额外的代理计算方上运行。这样一来,各数据源方只需主动向代理计算方推送中间参数并适时获取聚合结果,而无需暴露自身的网络接口。另外,将算力独立出来,有利于充分利用云计算的扩展性和容错性,而不用再依赖于各数据源方的算力水平。2.算法、系统和业务逻辑的耦合,带来开发门槛高,难学难懂的挑战当前,开发者使用联邦学习系统开发一个AI算法,需要在提升模型准确度的同时,时刻牢记“多方”的概念,时刻关注什么信息、可以暴露什么、不可以暴露什么,时刻注意加密了什么数据,加密后的数据可以做什么处理,时刻计算传输数据需要多少代价。此类应用要求开发者同时了解密码学、分布式计算、AI等领域知识。这样的开发者非常难于培养,其所写的程序非联邦学习专业工程师也很难看懂,更不用说验证其安全性。当前的联邦学习开源代码均仅提供了核心功能,一些对于系统和数据安全缺乏理解的开发者在进行二次开发的过程中,极易忽略一些基本的安全策略配置,例如此前提到的防火墙的配置,以及联邦学习中关于密钥管理和分发的配置方法,从而造成虚假的安全感。这一问题的根源在于,目前联邦学习软件的开发接口抽象层级不够高,把过多实现细节暴露给开发者。这当然有工程成熟度的原因,但更深层次的原因是,为了应对第二节提到的联邦学习的安全问题,导致现有联邦学习的实现上都打上了多种安全补丁。一个常见的补丁方式是结合一些密码学方法来掩盖一些梯度,例如半同态加密,但这些密码学方法都有比较复杂的密钥管理机制的要求,并且只能进行一些特定操作(例如加法)。因此许多算法都需要围绕这些密码学方法在进行特定的改进,导致了更为复杂的软件接口设计。如何利用更通用的密码计算方法定义一套抽象的开发接口,使得AI算法设计人员和业务人员不用再去关心系统底层的技术,是一个联邦学习亟待解决的工程挑战。一个可推荐的实现思路是,逐层级构建算法体系,对外开放友好的编程接口。具体地讲,在底层将基础的密码学协议进行封装,构建基本的密码操作指令集,支持密文计算引擎以及它与明文计算间的转换。基于此,联邦学习算法的开发人员可同时面向明文和密文开发并提供算法函数库。业务逻辑开发人员则不仅可以直接引用这些算法库解决问题,还可以像修改明文算法库一样查验、分析和修改这些联邦学习算法,无需要任何的密码或者联邦学习的专门知识,就像直接在明文数据上开发大数据算法一样。在运行时,可定义开发者自主编程接口和IDE,通过配置数据源,IDE可自动适配程序中的数据指向,使得开发者就像在一个数据源(可称为“虚拟的数据中心”)上开发一样。3.P2P架构、半同态加密与参数聚合算法的耦合,带来数据监管的挑战监管在数据流通中非常重要。监管不仅仅是为了防止数据滥用对社会造成危害,同时也是避免数据造假和数据投毒的重要手段。然而,联邦学习的系统和算法都部署在各个数据源方,之间交换的数据全部通过加密传输,即使有一些中心化聚合中间结果的架构设计,这个中心化聚合节点也仅仅是在中间结果上做了很简单的汇聚计算(例如求和),并不能知晓各方在进行什么样的数据处理,更无法实现计算过程的存证。因此,一个联邦学习的算法是否做了它声称的计算,只有参与方自己知道(而且只知道自己是否做了正确的事情,不知道其他方是怎么做的)。此类系统会导致在其上面进行的明文数据的直接交易(即打着隐私计算的幌子做明文数据交易)更难被发现和监管。如果采用可验证计算等手段对P2P系统进行监管,会造成非常大的额外开销。因此,如何做到对数据使用可监管的联邦学习,在技术和工程上都是很大的挑战。其根源是,参数聚合阶段只能做加法(目前由于全同态计算性能限制,只能选择半同态加密算法),因此参数聚合服务器这个最适合履行监管责任的一方,没有能力分析它所处理的数据。解决上述问题的一个途径是采用支持通用密文计算的代理计算架构,在密文上进行数据特征分析。代理计算的通用计算功能越强大,对数据分析面就越大,所能实现的监管力度就越强。另外,为了防止参与方超范围使用其他参与方的数据,应建立多方计算合约机制,由参与计算的各方在计算开始前就数据的具体使用目的和方式签订合约进行授权,各方严格按照计算合约执行,并对计算合约和执行过程进行存证,保证事后可回溯、可审计、可举证,从而防止数据滥用。四、总结:正确认识联邦学习综上所述,目前,“联邦学习”这一术语在市场上存在很多认识上的误解和混淆,主要原因是其既在广义上表达了保护数据前提下联合多方数据训练模型的需求,又在狭义上表示了一类通过暴露部分数据信息来提升训练性能的方法。有趣的是,作为广义上的需求,它强调为了保护数据安全,可以牺牲部分准确性;但作为狭义的方法,它反而强调通过牺牲安全来换取性能提升。因此,作为金融行业用户,选择是不是存在“联邦学习”的需求(也叫做“数据融合计算、数据价值流通”的需求),是一个纯粹的业务问题,其判断标准是数据价值流通能否带来业务价值。在这一需求基础上,是否要选用狭义的“联邦学习”方法和系统来满足这个需求,是个纯粹的IT技术和安全合规问题,其需要考虑和平衡的是数据的敏感性、泄露的代价,和进行数据保护所需的技术成本。也许,这样才能回归到我们探索联邦学习的初心。
-
近日,HongKong University与华为诺亚方舟实验室在 ACL 2022 上联合发表了一篇工作,针对现有大规模生成式预训练语言模型的压缩 需求,提出了新的量化压缩解决方案,并取得了出色的进步:分别在 GPT-2 与 BART 上实现了 14.4 倍与 13.4 倍的压缩率。他们将量化的 GPT 模型与 BART 模型分别命名为「QuantGPT」与「QuantBART」。作者丨陶超凡生成式预训练语言模型 (pre-trained language models, PLM) 的规模不断扩大,极大地增加了对模型压缩的需求。尽管有各种压缩 BERT 或其变体的方法,压缩生成式 PLM (例如GPT)的尝试很少,潜在的困难仍不清楚。在本文中,我们通过量化压缩生成 PLM。我们发现以前的量化方法在生成任务上失败,是由于模型容量减少导致的词嵌入同质化,以及不同模块的权重分布差异。相应地,我们提出了一种令牌级的对比蒸馏损失函数来学习可区分的词嵌入, 以及模块级动态适应的量化器,以使量化器适应不同的模块。各种任务的实证结果表明我们提出的方法优于最先进的压缩生成式 PLM 方法的优势明显。凭借与全精度模型相当的性能,我们在 GPT-2 和 BART 上分别实现了 14.4倍 和 13.4倍的压缩率。我们把提出的量化GPT模型、BART模型分别取名「QuantGPT」与「QuantBART」。论文地址: https://arxiv.org/abs/2203.10705代码和模型即将开源。1 Motivation基于 Transformer 的生成式预训练语言模型表现出强大的多任务和小样本学习能力,并在各种任务上取得显著成绩。但是,由于大量参数以及逐个令牌(token)的生成过程,它们在计算和内存方面通常都很昂贵。目前学术界提出了许多方法来压缩 PLM,但主要集中在理解任务上,比如使用 BERT 进行句子分类。图1:不同量化方法的2bit GPT-2在PTB数据集的语言建模表现在本文中,我们首先从量化角度来探索压缩生成式PLM。我们发现,将以前为 BERT 或计算机视觉任务设计的量化方法直接应用于生成式PLM 会导致性能不佳。如图1所示,随着权重比特数的减小,模型的性能急剧下降。这促使我们去研究量化生成式PLM的难点,并提出相应的解决策略。2 生成式语言量化模型的难点2.1难点1:词嵌入同质化 (Homogeneous Word Embedding)图2:在 PTB 数据集上训练的全精度和不同 2bit的最高频率的 500 个词嵌入的 T-SNE 可视化。不同量化方法的词嵌入显示出不同程度的同质化。可以看出,全精度模型的词嵌入是分散可区分的,而之前的量化方法 PACT、LSQ 和 LAQ 学习的是同质的词嵌入,是**的且不易区分,特别是对于 PACT 和 LSQ。考虑BERT做句子分类问题,量化后的BERT只需要让句子整体的表征是准确的。但是对于GPT这种生成问题,GPT 以从左到右的顺序计算每个令牌,并且前一个令牌中产生的量化误差将传递给未来的令牌。所以 量化GPT模型需要尽可能对每个量化后的词嵌入都学习准确。文章附录提供了不同量化方法的生成Demo,同质化的词嵌入会导致模型生成重复且无逻辑的句子。2.2难点2:不同模块的权重分布差异 (Varied Distribution of Weights)这里简单补充一下量化的背景知识。对一个模型的权重w,我们要学习一个量化器Q把全精度权重w量化为低比特的权重 。其中%u3B1是量化器的一个参数,用于把权重的数值范围限定在[-%u3B1,%u3B1]。%u3B1的选取对量化器的效果是重要的。过小的%u3B1会导致很大一部分的权重被估计成-%u3B1或者%u3B1,损失了这些权重的全精度信息;而过大的%u3B1会导致过多的全精度数值被考虑到量化器的有效范围,导致量化器的量化间隔(quantization level)较大,量化的结果不准。图3:在一个预训练的GPT中,同一个transformer block里两个不同模块的权重分布。竖线是PACT和我们方法学出的量化器的clipping factor %u3B1从图3可以看出,不同模块的权重分布差异很大,这对%u3B1的估计造成了较大的挑战。3 方法3.1令牌级对比学习我们采取了全精度模型作为老师,量化模型作为学生的蒸馏学习框架。为了让学生模型可以在令牌粒度上学习到老师模型的信息。我们设计了令牌级对比学习:在一个句子里, 同一个令牌在老师模型和学生模型中产生的表征应该被拉近,视为一对正样本;而同一个句子里不同令牌的表征视为负样本,应该被拉远。为了让学习模型产生的令牌表征平滑过渡,我们设计了一个memory bank存储词表里每个令牌的表征,用于对比学习中负样本的计算。具体地,对于一个长度为n的句子,令牌级的对比学习为:其中 计算了相似度,是学生模型产生的令牌特征的滑动平均版本(最后一个decoder的输出再经过一个线性映射)。的更新方式为3.2 模块级动态适应的量化器我们根据每个模块权重的统计数据提出了一种简单而有效的动态缩放。具体来说,我们不是直接对所有模块初始化一个相同的clipping factor %u3B1,而是转而学习一个新的缩放因子 %u3B3,它与平均权重大小相乘获得clipping factor%u3B3被初始化为1。这不仅简化了初始化,而且确保了初始的%u3B1不会远离全精度权重,无论不同模块的权重分布的差异有多大。我们进而推出了这个新的缩放因子%u3B3的更新公式。这个更新公式不仅考虑到了在[-%u3B1,%u3B1]范围内的权重对的影响,也考虑在[-%u3B1,%u3B1]范围外权重的影响。结果证明这样学习clipping factor,比之前工作中更新时只考虑[-%u3B1,%u3B1]范围外权重的效果更好。4 Performance首先,我们在GPT-2上分别做了PTB,wikitext-2,wikitext-103数据集的语言建模任务和Persona-Chat数据集的对话理解任务。我们的方法QuantGPT在生成文本预训练模型的量化任务上效果提升明显。其中W-E-A表示权重-嵌入层-激活值的量化比特数。我们也和最新的GPT-2压缩方案对比,包括KnGPT2(基于张量分解),DistilGPT2, LightPAFF(基于蒸馏),我们的方法QuantGPT在模型大小和效果上优势明显。除了考虑decoder-only的生成模型GPT,我们也考虑了encoder-decoder的生成模型BART。下表中看出,分别在8/4/2bit的实验设置下,我们模型QuantBART在摘要任务上提升明显。5 Conclusion本文研究了预训练语言生成模型的低比特量化。我们发现量化生成预训练语言生成模型的困难在于同质化的词嵌入和不同模块的权重分布差异很大。为了缓解这两个问题,我们提出了令牌级对比学习来学习可区分的词嵌入,以及一个模块粒度动态缩放的量化器,以适应不同模块的权重分布。语言建模、话语理解和摘要的实验证明了我们提出的方法的有效性。我们希望这个工作能够对生成任务的压缩有启发作用,也可以尝试把这个工作提出的量化器用在判别任务的压缩里。
-
2022 年度发布的报告要点可总结为以下八点: 1. AI 领域私人投资猛增,投资集中度加剧。 2021 年 AI 领域的私人投资总额约为 935 亿美元,是 2020 年私人投资总额的两倍多,但新投资的 AI 公司数量却在继续下降,从 2019 年的 1051 家和 2020 年的 762 家公司减少到 2021 年的 746 家。2020 年有 4 轮 5 亿美元以上的融资,2021 年有 15 个。 2. 美国和中国主导了 AI 跨国合作。 尽管地缘政治紧张局势加剧,但从 2010 年至 2021 年,美中两国在 AI 出版物方面的跨国合作数量最多,自 2010 年以来增加了五倍。美中之间合作产生的出版物数量是英中之间合作数量(第二高)的 2.7 倍。 3. 语言模型比以往任何时候都更有能力,但也更有偏见。 大型语言模型在技术基准上创造了新的记录,但新数据表明,更大的模型也更易于从训练数据中反映出偏见。与 2018 年被认为是 SOTA 的 1.17 亿参数模型相比,2021 年开发的 2800 亿参数模型产生的「毒性」增加了 29%。随着时间的推移,这些系统的能力显著增强,既有性能增加也暴露出潜在愈加严重的偏见。 4. AI 伦理的兴起无处不在。 自 2014 年以来,关于 AI 公平性和透明度的研究呈爆炸式增长,在伦理相关会议上的相关出版物增加了五倍。算法公平和偏见已经从主要的学术追求转变为具有广泛影响的主流研究课题。近年来,具有行业关系的研究人员在以伦理为中心的会议上发表的论文同比增加了 71%。 5. AI 变得更负担得起,性能更高。 自 2018 年以来,训练图像分类系统的成本降低了 63.6%,而训练时间提升了 94.4%。在其他 MLPerf 任务类别(如推荐、对象检测和语言处理)中出现了训练成本更低但训练时间更快的趋势,有利于 AI 技术更广泛的商业应用。 6. 数据,数据,还是数据。 跨技术基准测试的顶级结果越来越依赖于使用额外训练数据来实现新的 SOTA 结果。截止 2021 年,本报告中 10 个基准测试中有 9 个 SOTA AI 系统接受了额外数据的训练。这种趋势隐式地有利于私人机构参与者访问大量数据集。 7. 关于 AI 的全球性立法比以往任何时候都多。 AI Index 对 25 个国家的 AI 立法记录的分析显示,被通过成为法令的包含 AI 的法案数量从 2016 年的 1 项增长到 2021 年的 18 项。2021 年,西班牙、英国和美国通过与 AI 相关的法案数量最多,平均通过了三项法案。 8. 机械臂越来越便宜 AI Index 调查显示,在过去六年中,机械臂手臂的价格中位数下降了 4 倍,从 2016 年的每只手臂 50000 美元降至 2021 年的 12845 美元。机器人研究变得更易于获得和负担得起。 报告下载地址:https://aiindex.stanford.edu/report/
-
为帮助用户快速上手,我们为部分常见使用场景(美食分类、垃圾分类、口罩检测、安全帽检测、长度检测等)提供了参考模型,相关模型只需要进行订阅等简单操作即可快速部署。 ModelArts 支持将模型部署为在线服务、边缘服务、批量服务 。名称简介入口【数据】Dataset-car-and-person-500已标注的街道场景中的车辆和路人数据集,目标检测,500张前往>>【数据】红绿灯、斑马线、限速、解限速数据集无人车挑战杯大赛训练集前往>>【数据】自动驾驶文本分类数据集--外卖评论外卖评论数据集,含约4000条正向评论、8000条负向评论前往>>【代码】意大利VS英格兰基于历史胜负关系等因素,对比赛进行胜负判断前往>>【代码】让照片人物动起来蒙娜丽莎,居然开口唱歌了?前往>>【代码】CNN Group InterpretationA novel deep learning model interpretation algorithm前往>>【算法】强化学习预置算法DQN, PPO, A2C, IMPALA以及APEX前往>>【算法】推荐搜索(点击率预估)-DeepFM-GPU为自研 Wide & Deep 推荐模型前往>>【算法】推荐搜索-CTR常用算法包含FM,DeepFM,DCN,Wide & Deep前往>>【算法】防疫口罩佩戴及跌倒检测基于Faster-R-CNN-resnet50的目标检测模型前往>>【算法】基于图像的花卉种类识别即便是植物学家, 分辨一种他不熟悉的花卉品种也极具挑战前往>>【算法】图像分割-Fast-SCNN提供训练代码和可用于训练的模型,用于实际场景的微调训练前往>>【算法】Aster(文字识别/PyTorch)该算法需要使用SynthText和MJSynth数据集进行训练前往>>【模型】自动驾驶理解路况、环境及对车辆运行进行决策前往>>【模型】图像分类(西安人工智能大赛冠军获奖模型)对西安景点、美食、民俗、特产、工艺品等5个大类、57个子类别图像数据进行分类前往>>【模型】声音分类基于TensorFlow, Ascend910训练, 支持CPU和GPU推理前往>>
-
目 录1 AutoML超参优化原理................................................................................................................. 11.1 总体方案.......................................................................................................................................................................................... 11.2 常见的超参数优化方法................................................................................................................................................................ 11.2.1 网格寻优...................................................................................................................................................................................... 11.2.2 随机寻优...................................................................................................................................................................................... 21.2.3 贝叶斯优化.................................................................................................................................................................................. 21.2.3.1 高斯过程(GP)..................................................................................................................................................................... 41.2.3.2 SMAC......................................................................................................................................................................................... 61.2.3.3 TPE.............................................................................................................................................................................................. 61.2.4 BOHB............................................................................................................................................................................................ 72 超参数算法代码实现分析........................................................................................................... 92.1 GPEI................................................................................................................................................................................................ 112.2 SMAC............................................................................................................................................................................................. 132.3 TPE.................................................................................................................................................................................................. 152.4 不同数据规模对算法的影响..................................................................................................................................................... 161 AutoML超参优化原理1.1 总体方案1.2 常见的超参数优化方法1.1 总体方案AutoML基于vega.ml自动化机器学习分析系统,结合自动化工厂,完成大数据各个组件的客户端参数,OS参数,JDK参数的自动调优功能,降低人力消耗,极大的提高参数搜索效率。当前框架中实现的单目标超参数优化算法主要涉及:随机搜索(Random Search), 贝叶斯优化(Bayesian Optimization, e.g. SMAC, GPEI),TPE(Tree-structured Parzen Estimator), BOHB(Hyperband with Bayesian Optimization)。1.2 常见的超参数优化方法1.2.1 网格寻优网格化寻优可以说是最基本的超参数优化方法,目的是遍历搜索空间。使用这种技术,我们只需为所有超参数的可能构建独立的模型,评估每个模型的性能,并选择产生最佳结果的模型和超参数。1.2.2 随机寻优随机寻优方法在超参数网格的基础上选择随机的组合来进行模型训练。可以控制组合的数量,基于时间和计算资源的情况,选择合理的计算次数。通常并不是所有的超参数都有同样的重要性,某些超参数可能作用更显著。而随机寻优方法相对于网格化寻优方法能够更准确地确定某些重要的超参数的最佳值。1.2.3 贝叶斯优化贝叶斯优化用于机器学习调参由J. Snoek(2012)提出,主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(直到后验分布基本贴合于真实分布。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。他与常规的网格搜索或者随机搜索的区别是:l 贝叶斯调参考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息l 贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸l 贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部最优表1-1 贝叶斯优化过程中,常见的代理模型(surrogate model)有高斯过程(Gaussian Process),SMAC(基于随机森林),TPE(Parzen Estimator)高斯模型适用于连续型变量的,范围小的参数搜索空间,与此相对的,SMAC是基于随机森林算法的实现,在大范围的搜索空间,离散型变量空间的搜索效率会更好;TPE算法也适用于大范围的搜索空间,离散型变量空间,使用 KDE (核密度估计,带有权重的一维KDEs) 来对密度进行建模。一般形式的Acquisition Funtion是关于x的函数,映射到实数空间R,表示改点的目标函数值能够比当前最优值大多少的概率,目的是权衡当前已有的结果以及探索的可能(balance exploration against exploitation),目前主要有以下几种主流的效用函数(Acquisition function)1. POI(probability of improvement)2. Expected Improvement3. Confidence bound criteria1.2.3.1 高斯过程(GP)介绍贝叶斯优化调参,必须要从两个部分讲起:l 高斯过程,用以拟合优化目标函数l 贝叶斯优化,包括了“开采”和“勘探”,用以花最少的代价找到最优值上图是一张高斯分布拟合函数的示意图,可以看到,它只需要九个点,就可以大致拟合出整个函数形状1.2.3.2 SMAC贝叶斯优化中,除了代理模型(surrogate model)为高斯过程外,另一种用得比较多的代理模型为随机森林SMAC全称Sequential Model-Based Optimization forGeneral Algorithm Configuration,算法在2011被Hutter等人提出。该算法的提出即解决高斯回归过程中参数类型不能为离散的情况。由于随机森林的训练与预测时间复杂度较低,因此在SMAC中可以轻易采样候选点,因此SMAC对真实函数有噪音的情况会更加robust一点;实验表明,当参数空间较复杂且维度较大时,采用SMAC效果会更优一点;随机森林是由很多决策树构成的,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。1.2.3.3 TPE贝叶斯优化中,代理模型(surrogate model)还可以是TPE(Tree Parzen Estimator)1.2.4 BOHBBOHB 是由此篇论文提出的一种高效而稳定的调参算法。 BO 是贝叶斯优化(Bayesian Optimization)的缩写,HB 是 Hyperband 算法的缩写。BOHB 依赖 HB(Hyperband)来决定每次跑多少组参数和每组参数分配多少资源(budget),它的改进之处是将 Hyperband 在每个循环开始时随机选择参数的方法替换成了依赖之前的数据建立模型(贝叶斯优化)进行参数选择。 一旦贝叶斯优化生成的参数达到迭代所需的配置数, 就会使用这些配置开始执行标准的连续减半过程(successive halving)。 观察这些参数在不同资源配置(budget)下的表现 g(x, b),用于在以后的迭代中用作我们贝叶斯优化模型选择参数的基准数据。以上这张图展示了 BOHB 的工作流程。 将每次训练的最大资源配置(max_budget)设为 9,最小资源配置设为(min_budget)1,逐次减半比例(eta)设为 3,其他的超参数为默认值。 那么在这个例子中,s_max 计算的值为 2, 所以会持续地进行 {s=2, s=1, s=0, s=2, s=1, s=0, ...} 的循环。 在“逐次减半”(SuccessiveHalving)算法的每一个阶段,即图中橙色框,都将选取表现最好的前 1/eta 个参数,并在赋予更多计算资源(budget)的情况下运行。不断重复“逐次减半” (SuccessiveHalving)过程,直到这个循环结束。 同时,收集这些试验的超参数组合,使用了计算资源(budget)和其表现(metrics),使用这些数据来建立一个以使用了多少计算资源(budget)为维度的多维核密度估计(KDE)模型。 这个多维的核密度估计(KDE)模型将用于指导下一个循环的参数选择。2 超参数算法代码实现分析当我们对Hive组件的同一个用例(query2)分别用3种不同的算法进行测试后发现结果如下图所示:初步得出的结论是GPEI相对可以比较快速的收敛,SMAC算法的波动比较大,但是最优解相对比较好,TPE的实现偏离预期(Vega的实现有问题,所以后续可以考虑改进)2.1 GPEI2.2 SMAC2.3 TPE2.4 不同数据规模对算法的影响2.1 GPEI高斯过程的质量仅取决于协方差函数。Matern内核的类是RBF的概括。它具有一个附加参数v,用于控制所得函数的平滑度。v越小,近似函数越不平滑。当v趋于无穷,该内核变得等同于RBF内核。如果v=1/2,则Matern内核与绝对指数内核相同。重要的中间值v=1.5是(一次微分函数)和v=2.5(两次微分函数)。针对Hive组件的其中一个用例query,分别采用了v=1.5, v=2.5进行了测试,结果如下图,发现两者差别没有特别大,可能由于参数搜索范围比较大,测试迭代次数不够多,还未达到收敛趋势,后续有待进一步测试。2.2 SMAC针对随机森林算法,我们尝试改变n_estimators和max_depth来改变树的颗树和深度,进而影响模型的训练过程(因为数据量偏少的时候容易造成欠拟合的情形,因此可以减少树的深度和颗树),验证结果如下图所示:在Hive组件,query1这个用例的测试结果上发现,n_estimator=200, max_depth=5的时候效果比较理想,相对收敛会快一点,因此可以改变原先默认的参数设置。2.3 TPE和Vega开发人员初步确认,发现他们的TPE算法开发可能存在漏洞,最后没有达到预期的效果。因此我们考虑变化acquisition function,我们考虑使用POI(Probability of Improvement)替代EI进行测试,测试结果如下图所示,发现使用POI后,算法的效果得到了明显的提升。2.4 不同数据规模对算法的影响我们采用同一个算法模型的相同的参数,对不同数据规模进行了测试,借此来评估数据规模或者集群计算节点数量是否会对算法模型的参数造成影响,以下是对SMAC和GPEI两个算法分别作出的实践。数据量规模:small: 310M large:3.0G huge:30.3G gigantic:303.5G bigdata: 606.9G double bigdata: 3.0T对SMAC各个数据集规模做了测试,发现在不同数据集规模上用相同的树深和树的数量,最后呈现的趋势是类似的,基本可以说明SMAC算法不会很明显的受到数据规模或者集群计算节点数量的变化。类似的,对GPEI各个数据集规模做了测试,发现在不同数据集规模上用相同的核函数,最后呈现的趋势也是类似的,也基本可以说明GPEI算法不会很明显的受到数据规模或者集群计算节点数量的变化。
-
RT,任务书一样吗,任务设置一样吗,还是说会增加条件或是约束???
-
一、背景使用 Spark 机器学习库来做机器学习工作,可以说是非常的简单,通常只需要在对原始数据进行处理后,然后直接调用相应的 API 就可以实现。但是要想选择合适的算法,高效准确地对数据进行分析,可能还需要深入了解下算法原理,以及相应 Spark MLlib API 实现的参数的意义。目前,Spark MLlib 中实现了 tree 相关的算法,决策树 DT(DecisionTree),随机森林 RF(Random Forest),GBDT(Gradient Boosting Decision Tree),其基础都是RF,DT 是 RF 一棵树时的情况,而 GBDT 则是循环构建DT,GBDT与DT的代码是非常简单明了的,本文会对 Random Forest 的原理和源码进行分析。二、决策树与随机森林首先我们来对决策树和随机森林进行简单的了解:决策树 GBDT-Decision Tree(DT)关键问题节点分裂:使用的特征及阈值特征选取:最小均方差、信息增益(ID3)、信息增益率(C4.5)阈值:从特征值中选取、等步长选取最大最小值之间的值叶子节点的值:叶子所属数据的均值(回归)、对应类别(分类)截止条件:达到叶子节点数上限、继续划分无法使误差减小 在决策树的训练中,如上图所示,就是从根节点开始,不断的分裂,直到触发截止条件,在节点的分裂过程中要解决的问题其实就两个:分裂点:一般就是遍历所有特征的所有特征值,选取impurity最大的分成左右孩子节点,impurity的选取有信息熵(分类),最小均方差(回归)等方法预测值:一般取当前最多的class(分类)或者取均值(回归)随机森林随机森林就是构建多棵决策树投票,在构建多棵树过程中,引入随机性,一般体现在两个方面,一是每棵树使用的样本进行随机抽样,分为有放回和无放回抽样。二是对每棵树使用的特征集进行抽样,使用部分特征训练。在训练过程中,如果单机内存能放下所有样本,可以用多线程同时训练多棵树,树之间的训练互不影响。三、Spark随机森林概要(训练步骤)随机森林中的每个树模型之间没有关联,可以独立训练,这为随机森林的分布式训练提供可能。具体的训练步骤如下:1.将每个树模型的根节点取出,加入栈中2.将k个节点从栈中取出,组成一个训练集合group,k值由内存限制决定,确定特征采样3.从各分区上计算并汇合分布信息,并计算待切分节点的最优切分点4.根据切分点生成新的叶子节点,并更新nodeIdCache5.若新生成的叶子节点没有达到最小不纯度限制和最小样本数量的限制,则入栈6.若栈非空 goto 2.7.剪枝合并多余节点,结束spark实现分布式随机森林优化点Spark 平台上,传统单机形式的迭代方式必须要进行相应改进才能适用于分布式环境,这是因为在分布式环境下,数据也是分布式的,算法设计不得当会生成大量的 IO 操作,影响算法效率三个优化策略。1.切分点抽样统计在单机环境下的决策树对连续变量进行切分点选择时,一般是通过对特征点进行排序,然后取相邻两个数之间的点作为切分点,如果在分布式环境下如此操作的话,会带来大量的网络传输操作,特别是当数据量达到 PB 级时,算法效率将极为低下 Spark 中的随机森林在构建决策树时,会对各分区采用一定的子特征策略进行抽样, 然后生成各个分区的统计数据,并最终得到切分点。2.切分特征装箱(Binning)决策树的构建过程就是对特征的取值不断进行划分的过程对于离散的特征,如果有M个值,最多个划分如果值是有序的,那么就最多 M-1个划分(按老,中,少的序,那么只有 m-1 个,即 2 种划分,老|中,少;老,中|少)划分的点就是 split(切分点),划分出的区间就是 bin。对于连续特征 ,理论上 split 是无数的,在分布环境下不可能取出所有的值,因此它采用的是1中的切点抽样统计方法。3.逐层训练(level-wise training)单机版本的决策数生成过程是通过递归调用(本质上是深度优先)的方式构造树,在构造树的同时,需要移动数据,将同一个子节点的数据移动到一起分布式环境下采用的策略是逐层构建树节点(本质上是广度优先),这样遍历所有数据的次数 等于所有树中的最大层数。每次遍历时,只需要计算每个节点所有切分点统计参数,遍历完后,根据节点的特征划分,决定是否切分,以及如何切分。总体时序图具体分析代码,可以得出以下时序图具体流程详解随机森林最重要的就是寻找最佳split的过程,首先要计算所有可能的split,流程图如下:找到所有可能的split了,就需要再其中挑选出最佳split,流程图如下:在分割结束后,最后一步需要在driver端建树,流程图如下:
-
链接:https://bbs.huaweicloud.com/blogs/336336欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。上一篇文章介绍了如何使用OpenCV绘制各类几何图形,包括cv2.line()、v2.circle()、cv2.rectangle()、cv2.ellipse()、cv2.polylines()、cv2.putText()函数。这篇文章将详细讲解图像算法运算与逻辑运算,包括图像加法、图像减法、图像与运算、图像或运算、图像非运算与图像异或运算。让我们来对比下这些运算在图像中能实现什么样的效果。希望文章对您有所帮助,如果有不足之处,还请海涵。文章目录:一.图像加法运算二.图像减法运算三.图像与运算四.图像或运算五.图像非运算六.图像异或运算七.总结下载地址:https://github.com/eastmountyxz/Python-zero2one前文赏析:第一部分 基础语法[Python从零到壹] 一.为什么我们要学Python及基础语法详解[Python从零到壹] 二.语法基础之条件语句、循环语句和函数[Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象第二部分 网络爬虫[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例[Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解[Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解[Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储[Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解[Python从零到壹] 十.Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)第三部分 数据分析和机器学习[Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解[Python从零到壹] 十二.机器学习之回归分析万字总结[Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验) [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解[Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解[Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解[Python从零到壹] 十八.可视化分析之Basemap地图包入门详解[Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解[Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解[Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解[Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解[Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)[Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)[Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)[Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)[Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)[Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)[Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)[Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)[Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)[Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)第四部分 Python图像处理基础[Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置[Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像[Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解第五部分 Python图像运算和图像增强第六部分 Python图像识别和图像处理经典案例第七部分 NLP与文本挖掘第八部分 人工智能入门知识第九部分 网络攻防与AI安全第十部分 知识图谱构建实战扩展部分 人工智能高级案例一.图像加法运算图像加法运算主要有两种方法。第一种是调用Numpy库实现,目标图像像素为两张图像的像素之和;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下:dst = add(src1, src2[, dst[, mask[, dtype]]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。– dtype表示输出数组的可选深度注意,当两幅图像的像素值相加结果小于等于255时,则输出图像直接赋值该结果,如120+48赋值为168;如果相加值大于255,则输出图像的像素结果设置为255,如(255+64) 赋值为255。下面的代码实现了图像加法运算。输出如图4-1所示,左边为“小珞珞”的原始图像,右边为像素值增加100像素后的图像,输出图像显示更偏白。二.图像减法运算图像减法运算主要调用subtract()函数实现,其原型如下所示:dst = subtract(src1, src2[, dst[, mask[, dtype]]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。– dtype表示输出数组的可选深度具体实现代码如下所示:输出如图4-2所示,左边为原始图像,右边为像素值减少50像素后的图像,输出图像显示更偏暗。三.图像与运算与运算是计算机中一种基本的逻辑运算方式,符号表示为“&”,其运算规则为:0&0=00&1=01&0=01&1=1图像的与运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“与”操作,实现图像裁剪。dst = bitwise_and(src1, src2[, dst[, mask]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。下面代码是通过图像与运算实现图像剪裁的功能。输出如图4-3所示,原始图像与圆形进行与运算之后,提取了其中心轮廓。同时输出图像的形状为377×326。注意,两张图像的大小和类型必须一致。四.图像或运算逻辑或运算是指如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。图像的或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“或”操作,实现图像裁剪。其函数原型如下所示:dst = bitwise_or(src1, src2[, dst[, mask]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。下面代码是通过图像或运算实现图像剪裁的功能。输出如图4-4所示,原始图像与圆形进行或运算之后,提取了图像除中心原形之外的像素值。五.图像非运算图像非运算就是图像的像素反色处理,它将原始图像的黑色像素点转换为白色像素点,白色像素点则转换为黑色像素点,其函数原型如下:dst = bitwise_not(src1, src2[, dst[, mask]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。图像非运算的实现代码如下所示。原始图像非运算之后输出如图4-5所示。六.图像异或运算逻辑异或运算(xor)是一个数学运算符,数学符号为“⊕”,计算机符号为“xor”,其运算法则为:如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。图像的异或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“异或”操作,实现图像裁剪。其函数原型如下所示:dst = bitwise_xor(src1, src2[, dst[, mask]])– src1表示第一张图像的像素矩阵– src2表示第二张图像的像素矩阵– dst表示输出的图像,必须和输入图像具有相同的大小和通道数– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。图像异或运算的实现代码如下所示。原始图像与圆形进行异或运算之后输出如图4-6所示。七.总结本文详细介绍了图像处理的算术运算与逻辑运算,包括图像加法、图像减法、图像与运算、图像或运算、图像非运算与图像异或运算,并以“小珞珞”图像为案例进行讲解,希望对您有所帮助。感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:希望能与大家一起在华为云社区共同成长,原文地址:https://blog.csdn.net/Eastmount/article/details/122692101(By:娜璋之家 Eastmount 2022-03-09 夜于武汉)
-
华为诺亚方舟实验室的研究者提出了一个大规模的中文的跨模态数据库 ——「悟空」,并在此基础上对不同的多模态预训练模型进行基准测试,有助于中文的视觉语言预训练算法开发和发展。在大数据上预训练大规模模型,对下游任务进行微调,已经成为人工智能系统的新兴范式。BERT 和 GPT 等模型在 NLP 社区中越来越受欢迎,因为它们对广泛的下游任务甚至零样本学习任务具有很高的可迁移性,从而产生了 SOTA 性能。最近的工作,如 CLIP、ALIGN 和 FILIP 进一步将这一范式扩展到视觉语言联合预训练 (VLP) 领域,并在各种下游任务上显示出优于 SOTA 方法的结果。这一有希望的方向引起了行业和研究人员的极大关注,将其视为通向下一代 AI 模型的途径。 促成 VLP 模型成功的原因有两个。一方面,更高级的模型架构(如 ViT/BERT)和训练目标(如对比学习)通常能够提升模型泛化能力和学得表示的稳健性。另一方面,由于硬件和分布式训练框架的进步,越来越多的数据可以输入到大规模模型中,来提高模型的泛化性、可迁移性和零样本能力。在视觉或者语言任务中,先在大规模数据(例如图像分类中的 JFT-300M、T5 中的 C4 数据集)上预训练,之后再通过迁移学习或者 prompt 学习已被证明对提高下游任务性能非常有用。此外,最近的工作也已经显示了 VLP 模型在超过 1 亿个来自网络的有噪声图像 - 文本对上训练的潜力。 因此,在大规模数据上预训练的 VLP 模型的成功促使人们不断地爬取和收集更大的图文数据集。下表 1 显示了 VLP 领域中许多流行的数据集的概述。诸如 Flickr30k、SBU Captions 和 CC12M 等公开可用的视觉语言(英语)数据集的样本规模相对较小(大约 1000 万),而规模更大的是像 LAION-400M 的数据集。但是,直接使用英文数据集来训练模型会导致中文翻译任务的性能大幅下降。比如,大量特定的中文成语和俚语是英文翻译无法覆盖的,而机器翻译往往在这些方面会带来错误,进而影响任务执行。 转发自:https://www.jiqizhixin.com/articles/2022-02-25-5
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签