早停止(Early Stopping)是 当达到某种或某些条件时,认为模型已经收敛,结束模型训练,保存现有模型的一种手段。
设置早停类
class EarlyStopping():
"""
Early stopping to stop the training when the loss does not improve after
certain epochs.
"""
def __init__(self, patience=5, min_delta=0):
"""
:param patience: how many epochs to wait before stopping when loss is
not improving
:param min_delta: minimum difference between new loss and old loss for
new loss to be considered as an improvement
"""
self.patience = patience
self.min_delta = min_delta
self.counter = 0
self.best_loss = None
self.early_stop = False
def __call__(self, val_loss):
if self.best_loss == None:
self.best_loss = val_loss
elif self.best_loss - val_loss > self.min_delta:
self.best_loss = val_loss
# reset counter if validation loss improves
self.counter = 0
elif self.best_loss - val_loss < self.min_delta:
self.counter += 1
print(f"INFO: Early stopping counter {self.counter} of {self.patience}")
if self.counter >= self.patience:
print('INFO: Early stopping')
self.early_stop = True
__init__()
self.patience定义了我们早停前,允许验证损失不在降低的epoch次数。注意这是连续(consecutive)epoch数,不是累计的(cumulative)epoch数目。
patience:这个是当有连续的patience个轮次数值没有继续下降,反而上升的时候结束训练的条件(以val_loss为例)
self.min_delta定义了界定new loss和best loss之间的差异,是否有提升的判断阈值
delta:这个就是控制对比是的”标准线“
self.counter统计早停前,当前loss连续没有提升的epoch数
__call__()
它用于实现早停逻辑。在训练开始时,我们将当前的损失定为best loss。然后检查当前loss与best loss的差是否小于min_delta量。如果是,更新best loss,并重置counter。如果不是,则在counter加1。每当counter大于patience时,早停。early_stop为True并在屏幕上打印一些信息。
Dropout随机丢弃层
nn.Dropout
torch.nn.Dropout 是 PyTorch 深度学习框架中的一个模块,主要用于在训练神经网络时进行正则化和防止神经元间的共同适应。
用途
正则化:Dropout 通过在每次前向传播时随机将输入张量的某些元素置零,从而减少模型对特定数据的依赖,提高泛化能力。
防止共同适应:通过随机关闭神经网络中的某些神经元,迫使网络分散学习特征,防止神经元之间的过度依赖。
用法
p 参数:表示每个元素被置零的概率。默认值为 0.5。
inplace 参数:如果设置为 True,将直接在原始输入上进行操作,以节省内存。默认值为 False。
使用技巧
通常在全连接层之后使用 Dropout。
在训练时使用 Dropout,但在验证和测试时不使用。可以通过模型的 .train() 和 .eval() 方法来控制。
p 的选择取决于具体问题和模型架构,一般介于 0.2 到 0.5。
注意事项
Dropout 只应在训练阶段使用,不应在评估和测试阶段使用。
在使用 inplace=True 时,确保它不会影响后续计算。