千家信息网

PyTorch frozen怎么使用

发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,本篇内容介绍了"PyTorch frozen怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1
千家信息网最后更新 2025年12月04日PyTorch frozen怎么使用

本篇内容介绍了"PyTorch frozen怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. pretrain + 一样 lr 都训练

# ============================ step 2/5 模型 ============================# 1/3 构建模型resnet18_ft = models.resnet18()# 2/3 加载参数# flag = 0flag = 1if flag:    path_pretrained_model = os.path.join(BASEDIR, "..", "..", "data/resnet18-5c106cde.pth")    state_dict_load = torch.load(path_pretrained_model)    resnet18_ft.load_state_dict(state_dict_load)# 3/3 替换fc层num_ftrs = resnet18_ft.fc.in_featuresresnet18_ft.fc = nn.Linear(num_ftrs, classes)resnet18_ft.to(device)

2. frozen

# ============================ step 2/5 模型 ============================# 1/3 构建模型resnet18_ft = models.resnet18()# 2/3 加载参数# flag = 0flag = 1if flag:    path_pretrained_model = os.path.join(BASEDIR, "..", "..", "data/resnet18-5c106cde.pth")    state_dict_load = torch.load(path_pretrained_model)    resnet18_ft.load_state_dict(state_dict_load)# 法1 : 冻结卷积层flag_m1 = 0# flag_m1 = 1if flag_m1:    for param in resnet18_ft.parameters():        param.requires_grad = False    print("conv1.weights[0, 0, ...]:\n {}".format(resnet18_ft.conv1.weight[0, 0, ...]))# 3/3 替换fc层num_ftrs = resnet18_ft.fc.in_featuresresnet18_ft.fc = nn.Linear(num_ftrs, classes)resnet18_ft.to(device)

3. 不同学习率

# -*- coding: utf-8 -*-"""# @brief      : 模型finetune方法"""import osimport numpy as npimport torchimport torch.nn as nnfrom torch.utils.data import DataLoaderimport torchvision.transforms as transformsimport torch.optim as optimfrom matplotlib import pyplot as pltfrom tools.my_dataset import AntsDatasetfrom tools.common_tools2 import set_seedimport torchvision.models as modelsimport torchvisionBASEDIR = os.path.dirname(os.path.abspath(__file__))device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print("use device :{}".format(device))set_seed(1)  # 设置随机种子label_name = {"ants": 0, "bees": 1}# 参数设置MAX_EPOCH = 25BATCH_SIZE = 16LR = 0.001log_interval = 10val_interval = 1classes = 2start_epoch = -1lr_decay_step = 7# ============================ step 1/5 数据 ============================data_dir = os.path.join(BASEDIR, "..", "..", "data/hymenoptera_data")train_dir = os.path.join(data_dir, "train")valid_dir = os.path.join(data_dir, "val")norm_mean = [0.485, 0.456, 0.406]norm_std = [0.229, 0.224, 0.225]train_transform = transforms.Compose([    transforms.RandomResizedCrop(224),    transforms.RandomHorizontalFlip(),    transforms.ToTensor(),    transforms.Normalize(norm_mean, norm_std),])valid_transform = transforms.Compose([    transforms.Resize(256),    transforms.CenterCrop(224),    transforms.ToTensor(),    transforms.Normalize(norm_mean, norm_std),])# 构建MyDataset实例train_data = AntsDataset(data_dir=train_dir, transform=train_transform)valid_data = AntsDataset(data_dir=valid_dir, transform=valid_transform)# 构建DataLodertrain_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)valid_loader = DataLoader(dataset=valid_data, batch_size=BATCH_SIZE)# ============================ step 2/5 模型 ============================# 1/3 构建模型resnet18_ft = models.resnet18()# 2/3 加载参数# flag = 0flag = 1if flag:    path_pretrained_model = os.path.join(BASEDIR, "..", "..", "data/resnet18-5c106cde.pth")    state_dict_load = torch.load(path_pretrained_model)    resnet18_ft.load_state_dict(state_dict_load)# 法1 : 冻结卷积层flag_m1 = 0# flag_m1 = 1if flag_m1:    for param in resnet18_ft.parameters():        param.requires_grad = False    print("conv1.weights[0, 0, ...]:\n {}".format(resnet18_ft.conv1.weight[0, 0, ...]))# 3/3 替换fc层num_ftrs = resnet18_ft.fc.in_featuresresnet18_ft.fc = nn.Linear(num_ftrs, classes)resnet18_ft.to(device)# ============================ step 3/5 损失函数 ============================criterion = nn.CrossEntropyLoss()  # 选择损失函数# ============================ step 4/5 优化器 ============================# 法2 : conv 小学习率# flag = 0flag = 1if flag:    fc_params_id = list(map(id, resnet18_ft.fc.parameters()))  # 返回的是parameters的 内存地址    base_params = filter(lambda p: id(p) not in fc_params_id, resnet18_ft.parameters())    optimizer = optim.SGD([        {'params': base_params, 'lr': LR * 0},  # 0        {'params': resnet18_ft.fc.parameters(), 'lr': LR}], momentum=0.9)else:    optimizer = optim.SGD(resnet18_ft.parameters(), lr=LR, momentum=0.9)  # 选择优化器scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=lr_decay_step, gamma=0.1)  # 设置学习率下降策略# ============================ step 5/5 训练 ============================train_curve = list()valid_curve = list()for epoch in range(start_epoch + 1, MAX_EPOCH):    loss_mean = 0.    correct = 0.    total = 0.    resnet18_ft.train()    for i, data in enumerate(train_loader):        # forward        inputs, labels = data        inputs, labels = inputs.to(device), labels.to(device)        outputs = resnet18_ft(inputs)        # backward        optimizer.zero_grad()        loss = criterion(outputs, labels)        loss.backward()        # update weights        optimizer.step()        # 统计分类情况        _, predicted = torch.max(outputs.data, 1)        total += labels.size(0)        correct += (predicted == labels).squeeze().cpu().sum().numpy()        # 打印训练信息        loss_mean += loss.item()        train_curve.append(loss.item())        if (i + 1) % log_interval == 0:            loss_mean = loss_mean / log_interval            print("Training:Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%}".format(                epoch, MAX_EPOCH, i + 1, len(train_loader), loss_mean, correct / total))            loss_mean = 0.            # if flag_m1:            print("epoch:{} conv1.weights[0, 0, ...] :\n {}".format(epoch, resnet18_ft.conv1.weight[0, 0, ...]))    scheduler.step()  # 更新学习率    # validate the model    if (epoch + 1) % val_interval == 0:        correct_val = 0.        total_val = 0.        loss_val = 0.        resnet18_ft.eval()        with torch.no_grad():            for j, data in enumerate(valid_loader):                inputs, labels = data                inputs, labels = inputs.to(device), labels.to(device)                outputs = resnet18_ft(inputs)                loss = criterion(outputs, labels)                _, predicted = torch.max(outputs.data, 1)                total_val += labels.size(0)                correct_val += (predicted == labels).squeeze().cpu().sum().numpy()                loss_val += loss.item()            loss_val_mean = loss_val / len(valid_loader)            valid_curve.append(loss_val_mean)            print("Valid:\t Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%}".format(                epoch, MAX_EPOCH, j + 1, len(valid_loader), loss_val_mean, correct_val / total_val))        resnet18_ft.train()train_x = range(len(train_curve))train_y = train_curvetrain_iters = len(train_loader)valid_x = np.arange(1, len(valid_curve) + 1) * train_iters * val_interval  # 由于valid中记录的是epochloss,需要对记录点进行转换到iterationsvalid_y = valid_curveplt.plot(train_x, train_y, label='Train')plt.plot(valid_x, valid_y, label='Valid')plt.legend(loc='upper right')plt.ylabel('loss value')plt.xlabel('Iteration')plt.show()

"PyTorch frozen怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

模型 参数 学习 训练 内容 函数 卷积 情况 损失 更多 知识 选择 不同 实用 学有所成 接下来 信息 内存 困境 地址 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 海淀区网络软件开发创新服务 win服务器管理员账号 移动互联网 科技应用 网络技术与平面设计哪个好 如何写网络安全教育日活动报道 宽带拨号服务名服务器名 南昌软件开发的公司 数据库中前景色为红色是多少 我的世界电脑版天选之剑服务器 如何保护数字货币网络安全 mysql数据库在线迁移 网络安全开发工程师出差 安装数据库2005 全国地区四级数据库 国家电网的网络安全意识 cnki数据库英文全称 软件开发门户 图像识别软件开发公司 计算机应用软件开发费用 服务器城市列表内蒙古 dhcp服务器租期到期掉线 mysql移动数据库文件 软件开发交付周期怎么写 进医院网络安全培训 工业园区正规网络技术创新服务 数字媒体技术和数据库工程师区别 网络安全资质适用范围 苹果手机服务器断开链接怎么办 济南直播软件开发报价 彩通网络技术有限公司
0