EarlyStopping,torch.save保存模型文件到指定文件夹下并动态命名

earlystopping,torch.save保存模型文件到指定文件夹下并动态命名


问题描述

神经网络训练过程中可能会发生过拟合问题,采用early stopping的方法,在验证集loss不增加或者负增长之后的几个epoch里面提前终止训练可以有效避免过拟合,在此过程中将生成和保存模型文件。

解决办法

class EarlyStopping:
    """Early stops the training if validation loss doesn't improve after a given patience."""
    def __init__(self, patience=7, verbose=False, delta=0,layer=1):
        """
        Args:
            patience (int): How long to wait after last time validation loss improved.
                            Default: 7
            verbose (bool): If True, prints a message for each validation loss improvement. 
                            Default: False
            delta (float): Minimum change in the monitored quantity to qualify as an improvement.
                            Default: 0
        """
        self.patience = patience
        self.verbose = verbose
        self.counter = 0
        self.best_score = None
        self.early_stop = False
        self.val_loss_min = np.Inf
        self.delta = delta
        self.layer = layer
        

    def __call__(self, val_loss,model,layer):

        score = -val_loss

        if self.best_score is None:
            self.best_score = score
            self.save_checkpoint(val_loss, model, layer)
        elif score < self.best_score + self.delta:
            self.counter += 1
            print(f'EarlyStopping counter: {self.counter} out of {self.patience}')
            if self.counter >= self.patience:
                self.early_stop = True
        else:
            self.best_score = score
            self.save_checkpoint(val_loss, model, layer)
            self.counter = 0

    def save_checkpoint(self, val_loss, model,layer):
        '''Saves model when validation loss decrease.'''
        if self.verbose:
            print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')
        save_path = './ResultData_earlystop/savemodel/'
        filepath = os.path.join(save_path, 'checkpoint_model_layer{}.pt'.format(self.layer))#
        torch.save(model.state_dict(), filepath)	# 这里会存储迄今最优模型的参数
        self.val_loss_min = val_loss
early_stopping = EarlyStopping(patience=patience, verbose=True,layer=1)
# early_stopping needs the validation loss to check if it has decresed, 
            # and if it has, it will make a checkpoint of the current model
            # early_stopping = EarlyStopping(patience=patience, verbose=True,layer=1)
            early_stopping(EvalLoss,model,1)
            
            if early_stopping.early_stop:
                print("Early stopping")
                break
            
            # load the last checkpoint with the best model
            model.load_state_dict(torch.load('./ResultData_earlystop/savemodel/checkpoint_model_layer1.pt'))
计算机视觉⼩组实训项⽬2:图像识 别 任务⽬标: 对于给定数据集,训练CNN模型在测试集中进⾏验证。 要求: 模型围绕Alexnet进⾏展开,对模型进⾏改造,使得其适应输出 通过修改模型的参数(如通道数、卷积层尺⼨、层数等)来训练⾄少两种以上模型 (以Alexnet为基础) 注意数据隔离,验证集⾃⾏划分,占⽐20%,最终结果需要在验证集上得到 要给出明确结论,⽤数据进⾏佐证 可以对所有代码的含义进⾏解释,理解所写下的每⼀句代码。不理解的代码不要 写。 任务要点: 数据: ⾸先,需要把数据上传到⽹盘,进⾏解压缩。⽰例代码为 import zipfile # path为压缩包路径 with zipfile.ZipFile(path, 'r') as zip_ref: zip_ref.extractall(path) 注意,最好将数据解压到⼀个⽂件夹中,避免混乱。 其次,通常数据上传到默认路径,需要将其转移到⽹盘之中。⽤python移动⽂件夹的 代码⽰例为 import shutil 计算机视觉⼩组实训项⽬2:图像识别 1 shutil.move(source_dir, destination_dir) 最后,解压后的train⽂件夹应当包含25000张图像,例如可以进⾏如下验证: len(os.listdir(folder_path)) # folder_path为train⽂件夹的路径 Dataset重构 读取数据需要重构Dataset类,即 from torch.utils.data import Dataset 基本数据的读取思路为: 不可以将数据⼀次性全部载⼊内存 将数据的路径记录为列表,载⼊内存后,按需读取图像 需要进⾏标签配对,转成tensor、resize归⼀化等各种操作 ⾸先,需要定义数据预处理部分,即 from torchvision import transforms transform = transforms.Compose([ transforms.Lambda(lambda x: torch.from_numpy(x).permute(2, 0, 1). transforms.Resize(256), # 缩放为固定⼤⼩ transforms.ToTensor(), # 转换成tensor格式 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 进⾏归⼀化 ]) 然后,重构Dataset类⽰例(可以按照⾃⼰习惯的⽅式进⾏调整) import os import cv2 from torch.utils.data import Dataset from torchvision import transforms # 建议定义默认transform default_transform = transforms.Compose([ 计算机视觉⼩组实训项⽬2:图像识别 2 transforms.ToPILImage(), transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.22 ]) class ImageDataset(Dataset): def __init__(self, root_dir, transform=default_transform): self.root_dir = root_dir self.filelist = [ os.path.join(root_dir, fname) for fname in os.listdir(root_dir) if fname.lower().endswith('.jpg') ] self.transform = transform or transforms.ToTensor() # 确保默认转换 def __len__(self): return len(self.filelist) def __getitem__(self, idx): filename = self.filelist[idx] # 读取图像校验 img = cv2.imread(filename) if img is None: raise FileNotFoundError(f"Failed to load image: {filename}") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换处理 if self.transform: img = self.transform(image=img)["image"] # 假设使⽤albumentations格 else: img = transforms.ToTensor()(img) # 获取标签 fname = os.path.basename(filename).lower() if fname.startswith('cat'): y = 0 计算机视觉⼩组实训项⽬2:图像识别 3 elif fname.startswith('dog'): y = 1 else: raise ValueError(f"Unsupported class: {fname}") return img, y Tensorboard的使⽤ 可以使⽤tensorboard记录训练log 在训练前,可以定义tensorboard对象 writer = SummaryWriter('logs/experiment_1') # 指定⽇志⽬录 然后在训练过程中记录训练数据 # ⽰例训练循环中的记录操作 for epoch in range(epochs): # ... 训练代码 ... loss = ... acc = ... # 记录标量数据 writer.add_scalar('Loss/train', loss, epoch) writer.add_scalar('Accuracy/train', acc, epoch) # 训练结束后关闭记录器 writer.close() 启动tensorboard命令如下 %tensorboard --logdir logs/ --port 6006 然后就可以展⽰相关界⾯。 通常只需要保存训练损失、训练精度、测试损失、测试精度⼏个标量即可。 模型保存 由于模型需要⻓时间训练,因此需要进⾏中间结果保存。 计算机视觉⼩组实训项⽬2:图像识别 4 保存的⽅式是,每训练⼀个epoch,就进⾏⼀次保存保存的话,建议⽤⽇期和精度/损失命名⽂件,以便进⾏识别。 1. ⽣成时间戳 from datetime import datetime # ⽣成时间戳(精确到秒) timestamp = datetime.now().strftime("%Y%m%d%H%M%S") 2. 建议将所有的模型保存到⼀个⽂件夹中 os.makedirs(save_dir, exist_ok=True) 注意在训练不同模型时,记录在不同的⽂件夹内,以免混淆。 3. 记录loss格式化为⽂件名 loss_str = f"{loss:.4f}" 4. 构建⽂件名⽰例 filename = f"model_epoch{epoch}_time{timestamp}_loss{loss_str}.pth" filepath = os.path.join(save_dir, filename) 5. 保存模型的⽰例 torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': loss, 'timestamp': timestamp }, filepath) 将上述变量填写后保存 6. 载⼊模型 ⽰例 计算机视觉⼩组实训项⽬2:图像识别 5 checkpoint = torch.load(path) # 保存的⽂件 model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) start_epoch = checkpoint['epoch'] + 1 注意,如果模型训练中断后,重新载⼊模型训练,那么需要改变epoch等关键变量的 值,以免出现混乱。 请给我用pytorch完成此项目,要求在colab中实现代码,请将详细步骤思路逻辑以及代码给我
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜度超标°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值