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

    1. monitor:self.log中的变量
    2. save_last:是否保存最后一个epoch的
    3. save_top_k:保存k个模型,要配合mode变量使用。-1时保存所有的模型,默认为1。这个会影响保存权重的总数量(save_last不计算在内)。
    4. mode: 可选{min, max},用于控制top_k保存的机制,比如对cls_los进行监控,则是越低越好,应该设置为min,如果是acc,则应该是设置为max,越大越好
    5. every_n_epochs: 保存间隔,每隔多少个epoch进行一次保,需要注意默认是按照val的epoch。
    6. filename:保存的文件名称
    7. save_on_train_epochs: 决定了every_n_epochs的epochs是train还是val,设为True时,every_n_epochs会在每n个train epochs后进行保存;默认为True时则是在n个val epoch之后保存。

使用方法:

  1. 使用log设置监控的变量,比如loss,cls_loss等等
  2. callback设置监控的变量

    1. # 根据mode决定保存哪三个模型
    2. # 此时的保存文件为epoch=0-train_loss=xxx ...
    3. checkpoint_callback = ModelCheckpoint(
    4. monitor='train_loss',
    5. save_last=True,
    6. save_top_k=3,
    7. filename='{epoch}-{cls_loss:.2f}',
    8. 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)

  1. <a name="XCH7z"></a>
  2. ## 加载模型
  3. ```python
  4. # 1.自动恢复模型、epoch、step、学习率信息(包括LR schedulers),精度等
  5. model.load_from_checkpoint('some/path/to/checkpoint.ckpt')
  6. # 2.如果只需要weight
  7. checkpoint = torch.load('some/path/to/checkpoint.ckpt')
  8. 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

只需要关注其中的几个参数:

  1. monitor:self.log中的变量,比如loss,acc等
  2. min_delta:变化量,如果monitor的变量变化值小于该值则认为当前epoch无用
  3. patience:epoch无用的次数,达到该值即停止训练
  4. mode: {min, max},min表示monitor变量不再减小的时候,max表示不再增加的时候

使用方法:

  1. 使用log设置监控的变量,通常使用val里的log进行监控,比如acc等等,当然也可以对loss进行监控
  2. 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) ```

进阶