首页 > 其他分享 >Pytorch深度学习零基础入门知识

Pytorch深度学习零基础入门知识

时间:2023-09-11 14:44:46浏览次数:55  
标签:冻结 入门 训练 Epoch Init Freeze Pytorch UnFreeze 深度

DL 跑代码必须知道的事情

损失值

损失值的大小用于判断是否收敛,比较重要的是有收敛的趋势,即验证集损失不断下降,如果验证集损失基本上不改变的话,模型基本上就收敛了。

损失值的具体大小并没有什么意义,大和小只在于损失的计算方式,并不是接近于0才好。如果想要让损失好看点,可以直接到对应的损失函数里面除上10000。

训练过程中的损失值会保存在logs文件夹下的loss_%Y_%m_%d_%H_%M_%S文件夹中

3、训练好的权值文件保存在logs文件夹中,每个训练世代(Epoch)包含若干训练步长(Step),每个训练步长(Step)进行一次梯度下降。

如果只是训练了几个Step是不会保存的,Epoch和Step的概念要捋清楚一下。

train model

1. cuda配置

if __name__ == "__main__":
    #---------------------------------#
    #   Cuda    是否使用Cuda
    #           没有GPU可以设置成False
    #---------------------------------#
    Cuda = True
    #---------------------------------------------------------------------#
    #   distributed     用于指定是否使用单机多卡分布式运行
    #                   终端指令仅支持Ubuntu。CUDA_VISIBLE_DEVICES用于在Ubuntu下指定显卡。
    #                   Windows系统下默认使用DP模式调用所有显卡,不支持DDP。
    #   DP模式:
    #       设置            distributed = False
    #       在终端中输入    CUDA_VISIBLE_DEVICES=0,1 python train.py
    #   DDP模式:
    #       设置            distributed = True
    #       在终端中输入    CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py
    #---------------------------------------------------------------------#
    distributed     = False
    #---------------------------------------------------------------------#
    #   sync_bn     是否使用sync_bn,DDP模式多卡可用
    #---------------------------------------------------------------------#
    sync_bn         = False
    #---------------------------------------------------------------------#
    #   fp16        是否使用混合精度训练
    #               可减少约一半的显存、需要pytorch1.7.1以上
    #---------------------------------------------------------------------#
    fp16            = False

2. 权重文件

  # 权值文件的下载请看README,可以通过网盘下载。模型的 预训练权重 对不同数据集是通用的,因为特征是通用的。
    #   模型的 预训练权重 比较重要的部分是 主干特征提取网络的权值部分,用于进行特征提取。
    #   预训练权重对于99%的情况都必须要用,不用的话主干部分的权值太过随机,特征提取效果不明显,网络训练的结果也不会好
    #
    #   如果训练过程中存在中断训练的操作,可以将model_path设置成logs文件夹下的权值文件,将已经训练了一部分的权值再次载入。
    #   同时修改下方的 冻结阶段 或者 解冻阶段 的参数,来保证模型epoch的连续性。
    #   
    #   当model_path = ''的时候不加载整个模型的权值。
    #
    #   此处使用的是整个模型的权重,因此是在train.py进行加载的,下面的pretrain不影响此处的权值加载。
    #   如果想要让模型从主干的预训练权值开始训练,则设置model_path = '',下面的pretrain = True,此时仅加载主干。
    #   如果想要让模型从0开始训练,则设置model_path = '',下面的pretrain = Fasle,Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
    #   
    #   一般来讲,网络从0开始的训练效果会很差,因为权值太过随机,特征提取效果不明显,因此非常、非常、非常不建议大家从0开始训练!
    #   从0开始训练有两个方案:
    #   1、得益于Mosaic数据增强方法强大的数据增强能力,将UnFreeze_Epoch设置的较大(300及以上)、batch较大(16及以上)、数据较多(万以上)的情况下,
    #      可以设置mosaic=True,直接随机初始化参数开始训练,但得到的效果仍然不如有预训练的情况。(像COCO这样的大数据集可以这样做)
    #   2、了解imagenet数据集,首先训练分类模型,获得网络的主干部分权值,分类模型的 主干部分 和该模型通用,基于此进行训练。
    #----------------------------------------------------------------------------------------------------------------------------#
    model_path      = 'model_data/yolo4_weights.pth'

3. 冻结训练

训练分为两个阶段,分别是冻结阶段和解冻阶段。设置冻结阶段是为了满足机器性能不足的同学的训练需求。

冻结训练需要的显存较小,显卡非常差的情况下,可设置Freeze_Epoch等于UnFreeze_Epoch,此时仅仅进行冻结训练。

在此提供若干参数设置建议,各位训练者根据自己的需求进行灵活调整:

(一)从整个模型的预训练权重开始训练:

​ Adam:

​ Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)

​ Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)

​ SGD:

​ Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)

​ Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)

​ 其中:UnFreeze_Epoch可以在100-300之间调整。

(二)从主干网络的预训练权重开始训练:

​ Adam:

​ Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)

​ Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)

​ SGD:

​ Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)

​ Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)

​ 其中:由于从主干网络的预训练权重开始训练,主干的权值不一定适合目标检测,需要更多的训练跳出局部最优解。

​ UnFreeze_Epoch可以在150-300之间调整,YOLOV5和YOLOX均推荐使用300。

​ Adam相较于SGD收敛的快一些。因此UnFreeze_Epoch理论上可以小一点,但依然推荐更多的Epoch。

(三)从0开始训练:

​ Init_Epoch = 0,UnFreeze_Epoch >= 300,Unfreeze_batch_size >= 16,Freeze_Train = False(不冻结训练)

​ 其中:UnFreeze_Epoch尽量不小于300。optimizer_type = 'sgd',Init_lr = 1e-2,mosaic = True。

(四)batch_size的设置:

​ 在显卡能够接受的范围内,以大为好。显存不足与数据集大小无关,提示显存不足(OOM或者CUDA out of memory)请调小batch_size

​ 受到BatchNorm层影响,batch_size最小为2,不能为1。

​ 正常情况下Freeze_batch_size建议为Unfreeze_batch_size的1-2倍。不建议设置的差距过大,因为关系到学习率的自动调整。

冻结阶段训练参数

此时模型的主干被冻结了,特征提取网络不发生改变

占用的显存较小,仅对网络进行微调

Init_Epoch 模型当前开始的训练世代,其值可以大于Freeze_Epoch,如设置:

​ Init_Epoch = 60、Freeze_Epoch = 50、UnFreeze_Epoch = 100

​ 会跳过冻结阶段,直接从60代开始,并调整对应的学习率。

​ (断点续练时使用)

Freeze_Epoch 模型冻结训练的Freeze_Epoch

​ (当Freeze_Train=False时失效)

Freeze_batch_size 模型冻结训练的batch_size

​ (当Freeze_Train=False时失效)

    Init_Epoch          = 0
    Freeze_Epoch        = 50
    Freeze_batch_size   = 8

解冻阶段训练参数

此时模型的主干不被冻结了,特征提取网络会发生改变*

占用的显存较大,网络所有的参数都会发生改变*

  • UnFreeze_Epoch 模型总共训练的epoch*

  • SGD需要更长的时间收敛,因此设置较大的UnFreeze_Epoch*

  • Adam可以使用相对较小的UnFreeze_Epoch*

  • Unfreeze_batch_size 模型在解冻后的batch_size*

  UnFreeze_Epoch      = 300
    Unfreeze_batch_size = 4

标签:冻结,入门,训练,Epoch,Init,Freeze,Pytorch,UnFreeze,深度
From: https://www.cnblogs.com/tow1/p/17693514.html

相关文章

  • Iceberg从入门到精通系列之十一:Flink DataStream读取Iceberg表
    Iceberg从入门到精通系列之十一:FlinkDataStream读取Iceberg表一、完整代码二、效果如下所示一、完整代码importorg.apache.flink.api.common.typeinfo.Types;importorg.apache.flink.api.java.tuple.Tuple2;importorg.apache.flink.streaming.api.datastream.DataStream;i......
  • Iceberg从入门到精通系列之九:flink sql修改Iceberg表和删除Iceberg表
    Iceberg从入门到精通系列之九:flinksql修改Iceberg表一、修改表属性二、修改表名三、删除表一、修改表属性ALTERTABLE`hive_catalog`.`default`.`sample`SET('write.format.default'='avro');二、修改表名ALTERTABLE`hive_catalog`.`default`.`sample`RENAMETO`hive_cat......
  • Iceberg从入门到精通系列之十五:Spark集成Iceberg
    Iceberg从入门到精通系列之十五:Spark集成Iceberg一、下载Spark安装包二、解压Spark安装包三、配置环境变量四、激活环境变量五、下载Sparkiceberg的jar包六、Spark集成Iceberg七、Spark配置Catalog八、配置HiveCatalog九、配置HadoopCatalog十、spark集成hive十、启动Sparkshe......
  • Iceberg从入门到精通系列之八:flink sql 创建Iceberg表
    Iceberg从入门到精通系列之八:flinksql创建Iceberg表一、创建数据库二、创建表三、创建分区表四、使用LIKE语法建表五、创建主键表一、创建数据库createdatabaseiceberg_db;useiceberg_db;二、创建表createtable`hive_catalog`.`default`.`sample`(idbigintcomment'un......
  • Iceberg从入门到精通系列之七:Flink SQL创建Catalog
    Iceberg从入门到精通系列之七:FlinkSQL创建Catalog一、语法说明二、flink集成hivejar包三、放到指定目录四、启动hivemetastore服务五、创建hivecatalog六、查看catalog七、HadoopCatalog八、创建sql-client初始化文件九、启动flinksql指定初始化文件一、语法说明createcat......
  • PostgreSQL数据库从入门到精通系列之五:深入理解lsn_proc、lsn_commit、lsn、txId、ts_
    PostgreSQL数据库从入门到精通系列之五:深入理解lsn_proc、lsn_commit、lsn、txId、ts_usec一、深入理解lsn_proc二、深入理解lsn_commit三、深入理解lsn四、深入理解txId五、深入理解ts_usec一、深入理解lsn_proc在PostgreSQL中,lsn_proc是一个内置函数,用于将逻辑日志位置(LSN)转换......
  • PostgreSQL数据库从入门到精通系列之六:深入理解逻辑复制槽,创建逻辑复制槽,删除逻辑复制
    PostgreSQL数据库从入门到精通系列之六:深入理解逻辑复制槽,创建逻辑复制槽,删除逻辑复制槽一、逻辑复制槽二、创建逻辑复制槽三、删除逻辑复制槽一、逻辑复制槽在PostgreSQL中,逻辑复制槽是一种用于实现逻辑复制的功能。逻辑复制槽允许将源数据库的更改流式传输到目标数据库,并使目标......
  • Iceberg从入门到精通系列之五:Zeppelin集成iceberg,创建iceberg普通表和分区表,并插入数
    Iceberg从入门到精通系列之五:Zeppelin集成iceberg,创建iceberg普通表和分区表,并插入数据一、Zeppelin集成iceberg二、查看catalog三、使用数据库四、查看表五、创建表六、插入数据七、查询数据八、创建分区表九、分区表插入数据十、查询分区表数据一、Zeppelin集成icebergZeppelin......
  • Strimzi从入门到精通系列之三:部署Kafka Connect
    Strimzi从入门到精通系列之三:部署KafkaConnect一、概述二、将KafkaConnect部署到Kubernetes集群三、KafkaConnect配置四、为多个实例配置KafkaConnect五、添加连接器六、自动使用连接器插件构建新的容器映像七、使用KafkaConnect基础镜像中的连接器插件构建新的容器镜......
  • Strimzi从入门到精通系列之二:部署Kafka
    Strimzi从入门到精通系列之二:部署Kafka一、认识Strimzi二、Strimzi的核心知识点三、Kafka集群、TopicOperator、UserOperator四、部署Kafka集群五、使用ClusterOperator部署TopicOperator六、使用ClusterOperator部署UserOperator一、认识StrimziStrimzi是一款用于在......