在深度学习框架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):