Base
- 所有的callback都有monitor,通过self.log进行控制
所有的callback都有mode参数,对self.log的参数进行判断
Model Checkpoint
只需要关注其中的monitor,save_last,save_top_k,mode,every_n_epochs,filename,save_on_trian_epochs
- monitor:self.log中的变量
- save_last:是否保存最后一个epoch的
- save_top_k:保存k个模型,要配合mode变量使用。-1时保存所有的模型,默认为1。这个会影响保存权重的总数量(save_last不计算在内)。
- mode: 可选{min, max},用于控制top_k保存的机制,比如对cls_los进行监控,则是越低越好,应该设置为min,如果是acc,则应该是设置为max,越大越好
- every_n_epochs: 保存间隔,每隔多少个epoch进行一次保,需要注意默认是按照val的epoch。
- filename:保存的文件名称
- save_on_train_epochs: 决定了every_n_epochs的epochs是train还是val,设为True时,every_n_epochs会在每n个train epochs后进行保存;默认为True时则是在n个val epoch之后保存。
使用方法:
- 使用log设置监控的变量,比如loss,cls_loss等等
callback设置监控的变量
# 根据mode决定保存哪三个模型
# 此时的保存文件为epoch=0-train_loss=xxx ...
checkpoint_callback = ModelCheckpoint(
monitor='train_loss',
save_last=True,
save_top_k=3,
filename='{epoch}-{cls_loss:.2f}',
mode ='min')
```python from pytorch_lightning.callbacks import ModelCheckpoint
def training_step(self, batch, batch_idx): …
1.使用log设置要监控的变量
self.log(“train_loss”, loss,on_step=True,on_epoch=True,prog_bar=True) return loss
2. 初始化ModelCheckpoint
,并设置要监控的变量,并将其放入到callback list中
callback_list = [] checkpoint_callback = ModelCheckpoint( monitor=’train_loss’, save_last=True, save_top_k=3, filename=’{epoch}-{cls_loss:.2f}’, mode =’min’) callback_list.append(checkpoint_callback)
3. 在Trainer中设置
trainer = Trainer(callbacks=callback_list)
<a name="XCH7z"></a>
## 加载模型
```python
# 1.自动恢复模型、epoch、step、学习率信息(包括LR schedulers),精度等
model.load_from_checkpoint('some/path/to/checkpoint.ckpt')
# 2.如果只需要weight
checkpoint = torch.load('some/path/to/checkpoint.ckpt')
model.load_state_dict(checkpoint['state_dict'])
Resume
- 这样会根据chekpoint的epoch继续进行训练,所有的数据会继续保存在该checkpoint所在的目录下
# 自动恢复模型、epoch、step、学习率信息(包括LR schedulers),精度等 trainer.fit(model, mnist_train, ckpt_path='some/path/to/checkpoint.ckpt')
踩过的坑
需要注意的时every_n_epochs这个参数默认的是按照val 的次数进行计算。如果没有设置save_on_train_epochs为True,同时又没有定义val setp,那就不会有任何模型被保存下来。
EarlyStoping
只需要关注其中的几个参数:
- monitor:self.log中的变量,比如loss,acc等
- min_delta:变化量,如果monitor的变量变化值小于该值则认为当前epoch无用
- patience:epoch无用的次数,达到该值即停止训练
- mode: {min, max},min表示monitor变量不再减小的时候,max表示不再增加的时候
使用方法:
- 使用log设置监控的变量,通常使用val里的log进行监控,比如acc等等,当然也可以对loss进行监控
callback设置监控变量
# 当train_loss三次变化量小于0.02的时候停止训练 earlystoping_callback = EarlyStopping( monitor='train_loss', mode='min', min_delta=0.02, patience=2)
```python from pytorch_lightning.callbacks import EarlyStopping
def training_step(self, batch, batch_idx): …
1.使用log设置要监控的变量
self.log(“train_loss”, loss,on_step=True,on_epoch=True,prog_bar=True) return loss
2. 初始化EarlyStopping
,并设置要监控的变量,并将其放入到callback list中
callback_list = [] earlystoping_callback = EarlyStopping( monitor=’train_loss’, mode = ‘min’, min_delta=0.02, patience=2) callback_list.append(earlystoping_callback)
3. 在Trainer中设置
trainer = Trainer(callbacks=callback_list) ```