ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

paddlepaddle学习笔记

2022-07-30 08:31:16  阅读:168  来源: 互联网

标签:训练 -- 模型 paddlepaddle 笔记 学习 awk 参数 data


------------恢复内容开始------------

    • 默认学习率是四卡的配置,由于此时是单卡训练,学习率需要在默认的学习率上除以四倍。学习率可以通过 -o Optimizer.lr.learning_rate 来改变;
    • 配置默认是从第10epoch开始做eval,此处为了展现效果,设置了从1epoch开始做eval,可以通过-o Global.start_eval_epoch=1来配置;
    • AI Studio上的共享内存不是非常大,此处需要将num_workers设置为1。

 

使用-o Global.use_ssld=True表示加载SSLD的预训练权重

 

 

 MKLDNN是Intel公司基于Intel CPU开发的高性能深度学习预测库。本案例同样支持使用MKLDNN加速模型的预测,并且整个步骤十分简单快速。在上述场景的Python预测命令中,在CPU场景中,直接增加-o Global.enable_mkldnn=True即可。

在上述场景的Python预测命令中,在GPU场景中,直接增加-o Global.use_tensorrt=True即可。

PaddleClas 融合已有的知识蒸馏方法 [2,3],提供了一种简单的半监督标签知识蒸馏方案(SSLD,Simple Semi-supervised Label Distillation),

此外,在无标注数据选择的过程中,我们发现使用更加通用的数据,即使不需要严格的数据筛选过程,也可以帮助知识蒸馏任务获得稳定的精度提升,因而提出了SKL-UGI (Symmetrical-KL Unlabeled General Images distillation)知识蒸馏方案。

如果希望直接使用预训练模型,可以在训练的时候,加入参数-o Arch.pretrained=True -o Arch.use_ssld=True,表示使用基于SSLD的预训练模型,示例如下所示。

===========================

其中模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。 模型量化可以在基本不损失模型的精度的情况下,将 FP32 精度的模型参数转换为 Int8 精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。

模型剪枝将 CNN 中不重要的卷积核裁剪掉,减少模型参数量,从而降低模型计算复杂度。=

====================================

# 将inference模型转化为Paddle-Lite优化模型
paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --param_file=./MobileNetV3_large_x1_0_infer/inference.pdiparams --optimize_out=./MobileNetV3_large_x1_0

 

 

多机训练

  • 相比单机训练,多机训练时,只需要添加--ips的参数,该参数表示需要参与分布式训练的机器的ip列表,不同机器的ip用逗号隔开。下面为运行代码示例。
ip_list="192.168.0.1,192.168.0.2"
python3 -m paddle.distributed.launch \
    --log_dir=./log/ \
    --ips="${ip_list}" \
    --gpus="0,1,2,3" \
    tools/train.py \
    -c ./ppcls/configs/ImageNet/ResNet/ResNet50.yaml

不同机器的起始端口可能不同,建议在启动多机任务前,在不同的机器中设置相同的多机运行起始端口,命令为export FLAGS_START_PORT=17000,端口值建议在10000~20000之间。

可以设置显示目录的层级,比如:有的目录有包含很多文件,如果直接使用 tree 的话可能需要列出的太多,可以使用 -L 参数查看前几层的目录结构,这样就方便多了

-d : 只显示目录,不显示文件

 

=============================================

#新建 train 和 test 目录
mkdir train && mkdir test

#将数据分成训练集和测试集,前 100 类作为训练集,后 100 类作为测试集
ls images | awk -F "." '{if(int($1)<101)print "mv images/"$0" train/"int($1)}' | sh
ls images | awk -F "." '{if(int($1)>100)print "mv images/"$0" test/"int($1)}' | sh

#生成 train_list 和 test_list
tree -r -i -f train | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > train_list.txt
tree -r -i -f test | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > test_list.txt
tree -r反向,-i不打印缩进,-f打印完整路径
①awk -F " " '{print $2,$3}' f1:截取显示文档的第二列和第三列,-F指定分隔符为空格,$表示显示第几列。其中print表示要做输出信息的动作,$2和$3表示要输出的列号,awk要求将print已经输出列等内容放在“'{}'”之间。
②awk -F " " '($1>3){print $2,$3}' f1:选取第一列的值大于3的行,显示其第二列和第三列,在“()”中指定筛选条件。
③awk 'NR==4 || NR==3' f1:显示第三行和第四行,NR表示行号。
④awk '/data/ {print $2}' f1:抓取包含指定字符的行,再对列进行截取。此例中,awk先按照“data”字符串对文件f1中的行筛选,找出包含“data”的行以后,再按照默认的空格作为分隔符对行的内容做切割,仅打印出第二列的内容。

⑤awk '$2 ~ /data/ ' f1:抓取第二列包含指定字符的行。其中“~”表示是否匹配指定的“data”,如果第二列的内容包含“data”就打印出整行内容。

⑥awk '$2 !~ /data/ ' f1:抓取第二列不包含指定字符的行。其中“!~”表示是否不匹配指定的“data”,如果第二列的内容不包含“data”就打印出整行内容。

 

 

 

 

 

 

 

最终在当前文件夹下生成MobileNetV3_large_x1_0.nb的文件。

注意--optimize_out 参数为优化后模型的保存路径,无需加后缀.nb--model_file 参数为模型结构信息文件的路径,--param_file 参数为模型权重信息文件的路径,请注意文件名。

 

 

 

 

 

 

 

 

 

 

 

此部分使用了 Faiss 作为检索库,其是一个高效的特征检索及聚类的库。此库中集成了多种相似度检索算法,以满足不同的检索场景。在 PaddleClas 中,支持三种检索算法:

  • HNSW32: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法)
  • IVF:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特功能。
  • FLAT: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。
    • 上述命令会创建一个名为 ppcls 的 Docker 容器,之后再次使用该容器时无需再次运行该命令;

    • 参数 --shm-size=8G 将设置容器的共享内存为 8 G,如机器环境允许,建议将该参数设置较大,如 64G

    •  

       

    • addleClas 支持使用 DALI 对图像预处理进行加速,由于 DALI 仅支持 GPU 训练,因此需要设置 GPU,且 DALI 需要占用 GPU 显存,需要为 DALI 预留显存。使用 DALI 训练只需在训练配置文件中设置字段 use_dali=True,或通过以下命令启动训练即可:
      # 设置用于训练的 GPU 卡号
      export CUDA_VISIBLE_DEVICES="0"
      
      python ppcls/train.py -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o Global.use_dali=True
    • # 设置用于神经网络训练的显存大小,可根据具体情况设置,一般可设置为 0.8 或 0.7,剩余显存则预留 DALI 使用
      export FLAGS_fraction_of_gpu_memory_to_use=0.80
      
      python -m paddle.distributed.launch \
          --gpus="0,1,2,3" \
          ppcls/train.py \
              -c ./ppcls/configs/ImageNet/ResNet/ResNet50.yaml \
              -o Global.use_dali=True
      • 对于 CUDA 11.0:

        pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda110

      • 这个选项表示额外地址
      •  

         

      •  混合进度训练

      • 超参搜索

        ImageNet 作为业界常用的图像分类数据被大家广泛使用,已经总结出一系列经验性的超参,使用这些超参往往能够得到不错的训练精度,而这些经验性的参数在迁移到自己的业务中时,有时效果不佳。有两种常用的超参搜索方法可以用于获得更好的模型超参。

         

        1.1 网格搜索

        网格搜索,即穷举搜索,通过查找搜索空间内所有的点,确定最优值。方法简单有效,但当搜索空间较大时,需要消耗大量的计算资源。

         

        1.2 贝叶斯搜索

        贝叶斯搜索,即贝叶斯优化,在搜索空间中随机选取超参数点,采用高斯过程,即根据上一个超参数点的结果,更新当前的先验信息,计算前面 n 个超参数点的后验概率分布,得到搜索空间中每一个超参数点的期望均值和方差,其中期望均值越大表示接近最优指标的可能性越大,方差越大表示不确定性越大。通常将选择期望均值大的超参数点称为 exporitation,选择方差大的超参数点称为 exploration。在贝叶斯优化中通过定义 acquisition function 权衡期望均值和方差。贝叶斯搜索认为当前选择的超参数点是处于最大值可能出现的位置。

------------恢复内容结束------------

标签:训练,--,模型,paddlepaddle,笔记,学习,awk,参数,data
来源: https://www.cnblogs.com/xiaohao-coding/p/16534266.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有