您当前的位置:首页 > IT编程 > 深度学习
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:实现能够在训练过程中手动更改学习率

51自学网 2020-12-02 17:15:40
  深度学习
这篇教程实现能够在训练过程中手动更改学习率写得很实用,希望能帮到您。

实现能够在训练过程中手动更改学习率

 

深度学习框架PyTorch一书的学习-第六章-实战指南pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用pytorch实现性别检测三篇文章的基础上写的这篇文章

之前我们使用的是:

exp_lr_scheduler = optim.lr_scheduler.StepLR(optimizer_conv, step_size=3, gamma=0.1)

去自动递减学习率,但是这种方法还是十分死板的,希望实现能够手动根据收敛地效果去更改学习率的大小。所以在这里就是用了ipdb调试工具

1)

首先我们会使用argparse去实现命令行解析,实现通过设置--debugFile命令,然后通过生成和删除指定文件夹去进入调试状态:

复制代码
def getArgs():
#设置解析
    parser = argparse.ArgumentParser()
    parser.add_argument('--debugFile', nargs='?', default='None', type=str)
    args = parser.parse_args()
    return vars(args) #用vars()内建函数化为字典  
复制代码

 

2)然后在train_model()函数中添加:

                        # 进入debug模式
                        # print('args : ', args['debugFile'])
                        if os.path.exists(args['debugFile']):
                            import ipdb;
                            ipdb.set_trace()

实现当读取到该指定的文件夹后进入调试状态

 

3)

整个代码如下:

View Code

 

4)

然后运行:

复制代码
(deeplearning) userdeMBP:resnet18 user$ python train.py --debugFile=./debug
{'debugFile': './debug'}
Epoch 0/19
----------
train Loss: 0.7313 Acc: 0.6000
val Loss: 0.6133 Acc: 0.5500
Epoch 1/19
----------
train Loss: 0.3051 Acc: 0.9500
val Loss: 0.5630 Acc: 0.7000
Epoch 2/19
----------
train Loss: 0.1872 Acc: 0.9000
val Loss: 0.8300 Acc: 0.6500
Epoch 3/19
----------
train Loss: 0.3791 Acc: 0.8500
val Loss: 1.1445 Acc: 0.6000
Epoch 4/19
----------
train Loss: 0.4880 Acc: 0.8000
val Loss: 0.5832 Acc: 0.7000
Epoch 5/19
----------
复制代码

这时候在当前文件夹下生成一个名为debug的文件夹,就会进入调试模式:

复制代码
Epoch 5/19
----------
--Call--
> /anaconda3/envs/deeplearning/lib/python3.6/site-packages/torch/autograd/grad_mode.py(129)__exit__()
    128 
--> 129     def __exit__(self, *args):
    130         torch.set_grad_enabled(self.prev)

ipdb> u   #进入上一条命令                                                                    
> /Users/user/pytorch/gender_test_work/resnet18/train.py(151)train_model()
    150                             import ipdb;
--> 151                             ipdb.set_trace()
    152 

ipdb> for group in optimizer.param_groups: group['lr'] #查看当前的学习率值                         
0.0001
ipdb> for group in optimizer.param_groups: group['lr']=0.01  #更改为新的学习率值
复制代码

然后这时候删除debug文件夹,在调试中运行c命令继续向下运行:

复制代码
ipdb> c                                                                         
train Loss: 1.0321 Acc: 0.7500
val Loss: 8590.6042 Acc: 0.6000
Epoch 6/19
----------
train Loss: 2.5962 Acc: 0.4000
val Loss: 23884.8344 Acc: 0.5000
Epoch 7/19
----------
train Loss: 1.0793 Acc: 0.5500
val Loss: 65956.7039 Acc: 0.5000
Epoch 8/19
----------
train Loss: 1.6199 Acc: 0.4500
val Loss: 16973.9813 Acc: 0.5000
Epoch 9/19
----------
train Loss: 1.4478 Acc: 0.3500
val Loss: 1580.6444 Acc: 0.5000
Epoch 10/19
----------
复制代码

然后再生成debug文件夹进入调试命令,查看此时的学习率,可见此时的学习率果然为调后的0.01:

复制代码
Epoch 10/19
----------
> /Users/user/pytorch/gender_test_work/resnet18/train.py(151)train_model()
    150                             import ipdb;
--> 151                             ipdb.set_trace()
    152 

ipdb> for group in optimizer.param_groups: group['lr']                          
0.01
ipdb>  
复制代码

上面的训练结果什么的不要太在意,只是为了演示随便跑的

 

5)

中间有出现一个问题:

SyntaxError: non-default argument follows default argument

这种错误原因是将没有默认值的参数在定义时放在了有默认值的参数的后面

如:

def train_model(model, criterion, optimizer, scheduler, num_epochs=200, args_dist):

应该写成:

def train_model(model, criterion, optimizer, scheduler, args_dist, num_epochs=200):

Keras学习率调整
神经网络训练loss不下降原因各种情况分析与解决办法
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1