当前位置: 首页 > wzjs >正文

丹东网站优化开发区官网

丹东网站优化,开发区官网,jq网站特效插件下载,黄石网站建设知识点回顾: resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 作业: 好好理解下resnet18的模型结构尝试对vgg16cbam进行微调策略 import torch import torch.nn as nn import torch.optim as optim from torchvision…

知识点回顾:

  1. resnet结构解析
  2. CBAM放置位置的思考
  3. 针对预训练模型的训练策略
    1. 差异化学习率
    2. 三阶段微调

作业:

  1. 好好理解下resnet18的模型结构
  2. 尝试对vgg16+cbam进行微调策略
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import models, datasets, transforms
from torch.utils.data import DataLoader
import copy# 定义CBAM模块
class ChannelAttention(nn.Module):def __init__(self, in_channels, reduction_ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(nn.Conv2d(in_channels, in_channels // reduction_ratio, 1, bias=False),nn.ReLU(),nn.Conv2d(in_channels // reduction_ratio, in_channels, 1, bias=False))self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outreturn self.sigmoid(out)class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)out = torch.cat([avg_out, max_out], dim=1)out = self.conv(out)return self.sigmoid(out)class CBAM(nn.Module):def __init__(self, in_channels, reduction_ratio=16, kernel_size=7):super(CBAM, self).__init__()self.channel_att = ChannelAttention(in_channels, reduction_ratio)self.spatial_att = SpatialAttention(kernel_size)def forward(self, x):x = x * self.channel_att(x)x = x * self.spatial_att(x)return x# 修改VGG16模型,插入CBAM模块
class VGG16_CBAM(nn.Module):def __init__(self, num_classes=1000, pretrained=True):super(VGG16_CBAM, self).__init__()# 加载预训练的VGG16vgg16 = models.vgg16(pretrained=pretrained)self.features = vgg16.features# 在每个MaxPool2d后插入CBAM模块new_features = []cbam_idx = 0for module in self.features:new_features.append(module)if isinstance(module, nn.MaxPool2d):# 不在第一个MaxPool后添加CBAMif cbam_idx > 0:in_channels = list(module.parameters())[0].shape[1]new_features.append(CBAM(in_channels))cbam_idx += 1self.features = nn.Sequential(*new_features)self.avgpool = vgg16.avgpoolself.classifier = vgg16.classifier# 修改最后一层以适应指定的类别数if num_classes != 1000:self.classifier[-1] = nn.Linear(self.classifier[-1].in_features, num_classes)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x# 三阶段微调策略
def train_model_three_phase(model, dataloaders, criterion, device, num_epochs=25):# 第一阶段:冻结所有层,只训练分类器print("第一阶段:只训练分类器")for param in model.parameters():param.requires_grad = False# 解冻分类器参数for param in model.classifier.parameters():param.requires_grad = Trueoptimizer = optim.SGD(model.classifier.parameters(), lr=0.001, momentum=0.9)model = train_one_phase(model, dataloaders, criterion, optimizer, device, num_epochs=5)# 第二阶段:解冻部分层 + 分类器,使用差异化学习率print("\n第二阶段:解冻部分层并使用差异化学习率")# 解冻最后两个特征块和CBAM模块for i in range(24, len(model.features)):for param in model.features[i].parameters():param.requires_grad = True# 为不同层设置不同的学习率params_to_update = []# 特征部分学习率低params_to_update.append({'params': [param for param in model.features.parameters() if param.requires_grad],'lr': 0.0001})# 分类器部分学习率高params_to_update.append({'params': model.classifier.parameters(),'lr': 0.001})optimizer = optim.SGD(params_to_update, momentum=0.9)model = train_one_phase(model, dataloaders, criterion, optimizer, device, num_epochs=10)# 第三阶段:解冻所有层,使用低学习率微调整个网络print("\n第三阶段:微调整个网络")for param in model.parameters():param.requires_grad = Trueoptimizer = optim.SGD(model.parameters(), lr=0.00001, momentum=0.9)model = train_one_phase(model, dataloaders, criterion, optimizer, device, num_epochs=10)return model# 辅助函数:执行一个阶段的训练
def train_one_phase(model, dataloaders, criterion, optimizer, device, num_epochs=5):best_model_wts = copy.deepcopy(model.state_dict())best_acc = 0.0model.to(device)for epoch in range(num_epochs):print(f'Epoch {epoch}/{num_epochs-1}')print('-' * 10)for phase in ['train', 'val']:if phase == 'train':model.train()else:model.eval()running_loss = 0.0running_corrects = 0for inputs, labels in dataloaders[phase]:inputs = inputs.to(device)labels = labels.to(device)optimizer.zero_grad()with torch.set_grad_enabled(phase == 'train'):outputs = model(inputs)_, preds = torch.max(outputs, 1)loss = criterion(outputs, labels)if phase == 'train':loss.backward()optimizer.step()running_loss += loss.item() * inputs.size(0)running_corrects += torch.sum(preds == labels.data)epoch_loss = running_loss / len(dataloaders[phase].dataset)epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')if phase == 'val' and epoch_acc > best_acc:best_acc = epoch_accbest_model_wts = copy.deepcopy(model.state_dict())print()print(f'Best val Acc: {best_acc:4f}')model.load_state_dict(best_model_wts)return model# 数据加载和预处理
def load_data(data_dir):data_transforms = {'train': transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),'val': transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),}image_datasets = {x: datasets.ImageFolder(data_dir + x, data_transforms[x]) for x in ['train', 'val']}dataloaders = {x: DataLoader(image_datasets[x], batch_size=32, shuffle=True, num_workers=4) for x in ['train', 'val']}dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}class_names = image_datasets['train'].classesreturn dataloaders# 主函数
def main():# 假设数据目录结构为:data/train/ 和 data/val/data_dir = "data/"dataloaders = load_data(data_dir)# 创建模型model = VGG16_CBAM(num_classes=2, pretrained=True)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()# 设备配置device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 执行三阶段微调model_ft = train_model_three_phase(model, dataloaders, criterion, device)# 保存模型torch.save(model_ft.state_dict(), 'vgg16_cbam_finetuned.pth')if __name__ == "__main__":main()    

@浙大疏锦行


文章转载自:

http://8ypbu6RG.dmcxh.cn
http://b7BU1TR7.dmcxh.cn
http://EMlq2pyw.dmcxh.cn
http://7PTGQqKo.dmcxh.cn
http://IIZboy9w.dmcxh.cn
http://THngNgDX.dmcxh.cn
http://OK9Pdc0I.dmcxh.cn
http://J5NNDxWm.dmcxh.cn
http://wxFZJTV1.dmcxh.cn
http://2uAADP2a.dmcxh.cn
http://qDPLvoP0.dmcxh.cn
http://nNy5zzzg.dmcxh.cn
http://CzAgvNZN.dmcxh.cn
http://UFyzVhl1.dmcxh.cn
http://hzfsogSZ.dmcxh.cn
http://vdbDF8vf.dmcxh.cn
http://buJdyKdx.dmcxh.cn
http://fpVkBolj.dmcxh.cn
http://aYOn9uvl.dmcxh.cn
http://qNhS6kAx.dmcxh.cn
http://7gTtqyFu.dmcxh.cn
http://mLzBtJi0.dmcxh.cn
http://Dtsasom1.dmcxh.cn
http://8YMdIixy.dmcxh.cn
http://xiUoMLT8.dmcxh.cn
http://BPa5uc3f.dmcxh.cn
http://VbaaRvBw.dmcxh.cn
http://ljPEQeMU.dmcxh.cn
http://bdkS5aeQ.dmcxh.cn
http://y1otGcK0.dmcxh.cn
http://www.dtcms.com/wzjs/689405.html

相关文章:

  • 哪个网站推广比较好wordpress免授权08影院源码
  • 网站留言效果怎么做网站建设如何设计数据库
  • 天河区网站公司公司网站建设功能介绍
  • 自己建设网站流程营销活动推广方案
  • 东莞专业网站设计制作公司姜堰住房和城乡建设厅网站首页
  • 做网站常用图标自媒体注册平台
  • 怎么做视频网站wordpress代码片段
  • 搭建一个商城类网站贵阳网站开发哪家便宜
  • 自己用dw做网站要多久建立网站账号违法行为数据库
  • cms傻瓜式建站系统河南省工程建设信息官方网站
  • 网站建设是广告吗ui做的好的网站
  • 张掖市网站建设中国招投标网证书查询平台
  • 网站开发 源码WordPress图床工具
  • 建设维护网站运营方案建网站的步骤及方法
  • asp.net企业网站设计佛山优化推广
  • 建网站的服务器网站开发需求范本
  • 服装网站建设美丽淄博前信网络科技有限公司
  • 做网站设计的公司叫什么制作离婚证的小程序
  • 成都有哪些网站建设的公司网站开发报价范围
  • 做不锈钢百度网站哪个比较好网站建设 昆明 价格
  • 如何上传网站到空间哪个网站能帮助做路书
  • 住房和城乡建设部官方网站自己做链接的网站吗
  • mvc做的网站怎么连接数据库知乎 wordpress
  • 相亲网站如何做数据库和网站建设的论文
  • python做网站多么做影视网站挣钱吗
  • 如何申请一个网站 做视频直播新公司起名大全集
  • 心理咨询网站开发呼和浩特网络推广公司
  • 英文网站收录提交wordpress的语言文件在哪
  • 私人做的不错的网站网站开发者调试模式
  • 石家庄城乡建设局网站6全网营销和网站建设